解説

実例で学ぶASP.NETプログラミング

第13回 オートマチックな情報確認画面の構築

小田原 貴樹(うりゅう)
2004/06/12

注文確定処理の実装

 注文情報確認画面で[注文確定]ボタンが押され、注文が確定した際の処理を実装しよう。以下のイベント処理を実装してほしい。

01: Private Sub FINB_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FINB.ServerClick
02:   Dim cid As Integer
03:   If Session("REPT") = "YES" Then
04:     Dim Cookie As HttpCookie
05:     Cookie = Request.Cookies("VSDEMO")
06:     cid = Cookie.Values("cid")
07:   Else
08:     Dim cset As New CUSET
09:     Dim crow As CUSET.顧客Row = cset.顧客.NewRow
10:     crow.BeginEdit()
11:     crow.氏名 = Session("CVIEW")(0)("氏名")
12:     crow.郵便番号 = Session("CVIEW")(0)("郵便番号")
13:     crow.都道府県 = Session("CVIEW")(0)("都道府県")
14:     crow.市区町村 = Session("CVIEW")(0)("市区町村")
15:     crow.番地 = Session("CVIEW")(0)("番地")
16:     crow.電話番号 = Session("CVIEW")(0)("電話番号")
17:     crow.EMAIL = Session("CVIEW")(0)("EMAIL")
18:     crow.EndEdit()
19:     cset.顧客.Rows.Add(crow)
20:     DC.UDCU(cset)
21:     cid = crow.ID
22:     cset.顧客.AcceptChanges()
23:
24:     Dim Cookie As HttpCookie = New HttpCookie("VSDEMO")
25:     Cookie.Values.Add("CID", cid)
26:     Cookie.Expires = DateTime.MaxValue
27:     Response.AppendCookie(Cookie)
28:   End If
29:
30:   Dim udtset As New UDSET
31:   Dim UDRow As UDSET.売上伝票Row = udtset.売上伝票.NewRow
32:   UDRow.BeginEdit()
33:   UDRow.顧客ID = cid
34:   UDRow.配送先氏名 = Session("UDVIEW")(0)("配送先氏名")
35:   UDRow.配送先郵便番号 = Session("UDVIEW")(0)("配送先郵便番号")
36:   UDRow.配送先住所 = Session("UDVIEW")(0)("配送先住所")
37:   UDRow.配送先電話番号 = Session("UDVIEW")(0)("配送先電話番号")
38:   UDRow.Item("合計金額") = Session("PS")
39:   UDRow.Item("申込日") = Now()
40:   UDRow.EndEdit()
41:   udtset.売上伝票.Rows.Add(UDRow)
42:   DC.UDUD(udtset)
43:   Dim UDID As Integer = UDRow.ID
44:   udtset.売上伝票.AcceptChanges()
45:
46:   Dim umtset As New UMSET
47:   Dim I As Integer
48:   For I = 0 To Session("Sbview").Count - 1
49:     Dim UMROW As UMSET.売上明細Row = umtset.売上明細.NewRow()
50:     UMROW.BeginEdit()
51:     UMROW.売上伝票ID = UDID
52:     UMROW.商品ID = Session("Sbview")(I)("商品ID")
53:     UMROW.商品名 = Session("Sbview")(I)("商品名")
54:     UMROW.種類 = Session("Sbview")(I)("種類")
55:     UMROW.容量 = Session("Sbview")(I)("容量")
56:     UMROW.単価 = Session("Sbview")(I)("単価")
57:     UMROW.注文数 = Session("Sbview")(I)("注文数")
58:     UMROW.金額 = Session("Sbview")(I)("金額")
59:     UMROW.EndEdit()
60:     umtset.売上明細.Rows.Add(UMROW)
61:   Next
62:   DC.UDUM(umtset)
63:   umtset.AcceptChanges()
64:
65:   Dim BdyC As String = _
66:     UriBodyC(Session("Sbview"), Session("cview"), Session("PS"))
67:   mailsend("111.111.111.111", "info@v-st.net", _
68:     Session("cview")(0)(" EMAIL"), _
69:     "お買い上げありがとうございます。", BdyC)
70:
71:   Session.Abandon()
72:   Server.Transfer("REGFIN.ASPX")
73: End Sub
注文情報確認画面で[注文確定]ボタンが押されて注文が確定したときの処理
今回作成した注文情報確認画面であるREGVIEW.ASPXのコードビハインド・ファイルで、FINB_ServerClickイベントのコードとして記述する。

 注文確定処理は、ショッピング・サイトにおける購入フローの最終段階なので、処理するべきことが多く、コードは非常に長くなってしまっている。注文確定の段階で行っている処理を大きく分けると以下の3つの処理となる。

  • ユーザーが新規顧客だった場合には、新しいクッキーを追加する処理
  • 顧客情報、売上伝票情報、売上明細情報を実際にデータベースに格納する処理
  • ユーザーに対して注文に関する情報をメールで送信する処理

 ほかの処理と複合している部分もあるが、上記3つの処理のどれかを行っているということを頭に入れて解説を読んでいってほしい。

 2行目は、顧客IDを格納する変数「cid」の宣言を行っている。ユーザーが既存顧客か新規顧客かによって、顧客IDを取得する先が変わるので、ここでは宣言だけを行っている。

 3行目の制御文は、注文情報入力画面でクッキーの存在確認を行った際に、その結果を格納したセッション変数「REPT」の内容を判定している。“YES”の場合には既存顧客、“NO”の場合には新規顧客ということになる。

 4行目〜6行目が、ユーザーが既存顧客であった場合の処理で、再度クッキーの中から顧客IDを取得し変数に格納する処理を行っている。このコードではユーザーが既存顧客であった場合には、データベースの顧客情報の変更は行わないことにしているが、注文情報入力画面でユーザーが情報を修正した場合のことを考えるならば、ここで顧客情報を修正するような処理に置き換えた方がよいかもしれない。

 8行目〜22行目は、ユーザーが新規顧客であった場合に、注文情報入力画面で入力された情報の中で顧客情報にかかわる内容を、データベースに格納する処理を行っている。これまでのセッション変数に情報を格納する処理と異なり、実際のデータベースを更新する処理を行う場合には、以下のような処理が必要となる。

* 19行目:新しい行(新しいDataRowオブジェクト)をDataRowCollectionのAddメソッドを利用して追加する。

* 20行目:OleDbDataAdapterオブジェクトのUpdateメソッドを利用して、データベースを更新する。

* 22行目:DataSetオブジェクトのAcceptChangesメソッドを利用して、データセットに対して行われた変更をコミットする。

 常に上記3つの処理を行わなければならないわけではないが、ASP.NETにおいてデータベースを更新する際の基本となる流れなので、覚えておいていただきたい。

 24行目〜27行目で、ユーザーが新規顧客だった場合に新しいクッキーを追加する処理を行っている。各行を詳しく解説していこう。

 24行目は、HttpCookieクラスのインスタンスを、Cookieという変数名で新しく生成するための処理を行っている。この新しく作成されるクッキーの実際の名前はカッコ内で指定されている「VSDEMO」になる。

 25行目では、作成した新しいクッキーに新しい値を格納するために、ValuesコレクションのAddメソッドを利用している。格納する値はユーザーに割り当てられた顧客IDで、値の名前として「CID」と指定している。

 26行目は、新しく追加するクッキー「VSDEMO」の有効期限を設定している。クッキーにはすべて有効期限が設定されており、有効期限が切れたクッキーを利用することはできなくなる。有効期限を設定した方がよい場合も多いだろうが、ここでは永続的に保存するように設定している。クッキーに有効期限を設定するには、Expiresプロパティに値を格納すればよい。また、ASP.NETで永続的な期限を設定したい場合には、DateTime構造体のMaxValueフィールドを利用する。この場合、明示的には9999年12月31日という日時が格納されることになり、実質的には永続と同様になる。ASP.NETを利用して新しいクッキーを追加する場合、この有効期限の設定を忘れてしまい、うまく追加できない場合がよくあるので注意していただきたい。

 27行目では、HttpResponseクラスのAppendCookieメソッドを利用して、実際にユーザーのコンピュータに新しいクッキーを追加する処理を行っている。ここまでの処理で新しいクッキーを追加する処理の実装が完了した。前述のクッキーから情報を取得する方法と併せて、ASP.NETでクッキーを利用する方法として覚えていただきたい。

 30行目〜44行目は、注文情報入力画面で入力された情報の中で、売上伝票情報にかかわる内容を、データベースに格納する処理を行っている。顧客情報を格納する処理と同じ内容なので、細かくは解説しないが、43行目で売上伝票IDを「UDID」という変数に格納している点だけ注意してほしい。これは後で売上明細情報を格納する際に必要になる。

 46行目〜63行目は、買い物かごの情報として格納されている売上明細にかかわる情報を、データベースに格納する処理を行っている。売上明細情報だけは、1回の注文の中で複数レコードが格納される可能性があるので、ユーザーが購入した商品点数分ループを回している。ここまでの処理で各情報をデータベースに実際に格納していく処理の実装が完了した。各情報の関連付けから考えて、データベースに格納していく順番は「顧客→売上伝票→売上明細」の順になることにだけ注意すれば問題ないだろう。

 65行目〜69行目で、注文に関する情報をユーザーへメール送信する処理を行っている。66行目と67行目でメールの本文を作成し、68行目と69行目で実際の送信を行っている。これはどちらも関数化しているので、この後詳しく解説する。

 71行目は、注文にかかわる処理がすべて完了したので、Abandonメソッドを利用して現在のセッションをキャンセルしている。セッションを明示的に破棄したい場合には、このようにAbandonメソッドを利用すればよい。ちなみに、Abandonメソッドが実行されるとセッションのEndイベントが発生する。

 72行目では、注文完了ページである「REGFIN.ASPX」に遷移する処理を実装している。注文完了ページはユーザーに対するお礼が書いてあるだけのWebページで、処理は何も行わない。注文完了ページのデザインは最後に紹介する。

 さて、ここまでの作業で注文確定にかかわる処理はほとんど実装できた。後は先ほど説明を飛ばしたメール送信を行う関数を実装しよう。


 INDEX
  実例で学ぶASP.NETプログラミング
  第13回 オートマチックな情報確認画面の構築
    1.注文情報確認画面のデザイン
    2.注文情報を一時的に格納する機能の実装
    3.画面表示とクッキー利用の実装
  4.注文確定処理の実装
    5.ASP.NETでのメール送信の実装

インデックス・ページヘ  「解説 :実例で学ぶASP.NETプログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間