解説

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

第5回 DB連携ページをASP.NETで構築する(後編)

小田原 貴樹(うりゅう)
2003/04/22
Page1 Page2 Page3 Page4 Page5 Page6

■季節限定酒表示機能の実装

 季節限定酒表示機能を実現するためには、指定された主キーとなるIDをもとに、商品情報を表示するためのメソッドが必要になる。また、「酒カテゴリ」の中から季節限定に指定されているカテゴリを探し、そのカテゴリに属している商品の中からランダムに1商品を選び出して、IDを1つ抽出するメソッドも作成しなければならない。

 2つのメソッドのうち、先に必要になるのはIDを抽出するメソッドなので、そちらから作成しよう。新着情報表示機能構築のときと同じように、コンポーネント・クラス(CORE.VB)の中に作成した情報表示用クラス「INFOV」の中に以下のコードを追加する。

 1: Public Function KPRODID() As Integer
 2:   Dim PSET As New PVSET()
 3:   Dim CSET As New CASET()
 4:   Dim PVIEW As New DataView()
 5:   Dim CVIEW As New DataView()
 6:   Dim RID As New Random()
 7:   DC.FDPV(PSET)
 8:   DC.FDCA(CSET)
 9:   PVIEW.Table = PSET.Tables("酒完成表")
10:   CVIEW.Table = CSET.Tables("酒カテゴリ")
11:   CVIEW.RowFilter = "季節限定 = 1"
12:   PVIEW.RowFilter = "酒種ID = " & CVIEW(0)("ID")
13:   Return PVIEW(RID.Next(0, PVIEW.Count - 1))("ID")
14: End Function
ランダムにIDを抽出するメソッド
前回の新着情報表示機能構築と同様に、コンポーネント・クラス(CORE.VB)の中に作成した情報表示用クラス「INFOV」に追加する。

 5行目までの宣言部は、それぞれ「酒カテゴリ」と「銘柄表」のDataSetオブジェクトとDataViewオブジェクトの作成を行っている。また、6行目は乱数を発生させるのに便利なRandomクラスの作成を行っている。続く、7行目〜10行目は実際のデータの取得と、DataViewオブジェクトに対する対象テーブルの指定で、これも「新着情報表示機能の作成」の項で出てきた通りだ。

 11行目と12行目では、DataViewオブジェクトのプロパティであるRowFilterを利用して取得したデータにフィルタをかけている。このRowFilterプロパティに指定するのは、SQLの「WHERE」と同じ書式が利用でき、任意タイミングのいつでもフィルタを実行できる大変便利な機能だ。この連載でも今後何度も出てくるので、ぜひ利用していただきたい。

 11行目では「酒カテゴリ」に格納されている「CVIEW」に対して、季節限定に指定されているものだけを抽出し、12行目では11行目で抽出した季節限定に指定されている「酒カテゴリ」の中の該当レコードのIDを用いて、「酒完成表」に対してフィルタをかけている。

 最後の13行目では、実際に表示を行う商品をランダムに取り出して、その商品のIDを返す処理をしている。DataViewオブジェクトでは1つ目の()内に取得するレコードのインデックスを記述するのは前回で解説したが、ここではRandomクラスのNEXTメソッドを利用して、乱数を指定している。NEXTメソッドにはいくつかのオーバーロード(構文)が存在するが、ここでは第1引数に最小の値、第2引数に最大の値を指定することでその間の正数を取得するオーバーロードを利用している。ちょっとパズル的な構文に見えるかもしれないが、すでに「PVIEW」にフィルタがかかっているのを考えれば理解できると思う。このメソッドを利用すればランダムに表示する商品のIDが返ってくる。続いて、受け取ったIDから商品情報を表示するためのメソッドを作成しよう。

 1: Public Sub KPRODIN(ByVal KL As Label, ByVal KN As Label, ByVal KC As Label, ByVal KI As ImageButton, ByVal PID As Integer)
 2:   Dim PSET As New PVSET()
 3:   Dim CSET As New CASET()
 4:   DC.FDPV(PSET)
 5:   DC.FDCA(CSET)
 6:   Dim PR As PVSET.酒完成表Row = PSET.酒完成表.FindByID(PID)
 7:   Dim CR As CASET.酒カテゴリRow = CSET.酒カテゴリ.FindByID(PR.酒種ID)
 8:   KL.Text = CR.酒種
 9:   KN.Text = PR.銘柄
10:   KC.Text = PR.特徴
11:   KI.ImageUrl = "./PIMGM/" & PR.酒画像
12: End Sub
受け取ったIDから商品情報を表示するためのメソッド

 メソッドの引数として、デザイン作成時に配置したラベル・コントロール(KL、KN、KC)、写真を表示するためのイメージ・コントロール(KI)と、先ほど作成したメソッドで取得した表示対象となる商品ID(PID)を指定している。メソッド内のコード5行目までは宣言とデータの取得を行っているだけで先ほど作成したメソッドと全く同じだ。

 このメソッドで注目してほしいのは6行目の宣言文なのだが、パッと見では何をしようとしているのかわからないかもしれない。以下に、プログラムを日本語に直して文章的に解説してみよう。

 PRというオブジェクトはDataSetオブジェクト「PVSET」内の「酒完成表」に属するDataRowオブジェクト(テーブル内の任意な1行と考えてほしい)である。初期化では、DataSetオブジェクト「PSET」内の「酒完成表」から「PID」を主キーとして一意なレコードを抽出し、データを格納している。

 この構文はDataRowオブジェクトを利用したデータ取得の例で、DataSetのベース・オブジェクトに含まれているDataRowのベース・オブジェクトを型として指定することで、テーブル内の、ある1レコード分のオブジェクトが作成できる。

 また、初期化に利用しているFindByIDメソッドは、引数として「一意な主キー」を渡してやることで、該当のレコードのみを取得できる大変便利なメソッドだ。この2つの組み合わせによって、オブジェクト「PR」は表示対象のレコード情報だけを保持している。特定のレコードを取得したいケースでは非常ににお勧めの構文だ。

 VS.NETには、IntelliSenseという入力支援機能が搭載されており、コードを記述する際にオート・コンプリートやオート・コレクトを行ってくれる。先ほどの例では、テーブルの各列名などをPRオブジェクトのメンバとして入力しなければならないが、IntelliSenseを利用することで入力の手間やミスを減らせるので開発効率が飛躍的に向上する。最初のうちは宣言と初期化のDataSetオブジェクトの順番を間違えたりすることもあるだろうが(筆者はよく間違えた(笑))、ぜひ覚えて利用していただきたい。


 INDEX
  実例で学ぶASP.NETプログラミング
  第5回 DB連携ページをASP.NETで構築する(後編)
    1.季節限定酒表示機能のデザインを作成する
  2.季節限定酒表示機能の実装
    3.DataSetオブジェクトの主キー作成
    4.今月のお買い得酒表示機能のデザインを作成する
    5.今月のお買い得酒表示機能の実装
    6.全体デザイン修正とデバッグ
 
インデックス・ページヘ  「解説 :実例で学ぶ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 記事ランキング

本日 月間