データベース千夜一夜第17回

プログラミングとSQL(5)
~販売データの入力処理(後編)
長谷川裕行
有限会社 手國堂

1.商品の特定

ユーザーが商品IDを入力すると、それをキーにしてテーブル「商品_mr」から該当するレコードを抽出し、品名と販売単価を表示します。

この処理は、商品IDを入力するテキストボックス“txtItemId”がフォーカスを失ったとき(入力後にユーザーがTabキーを押すなどして他のコントロールに移動したとき)に実行します。顧客を特定する場合と同じで、Changeイベントを処理してはいけません。1文字入力するたびにプロシージャが呼び出されるため、何度もエラーメッセージが表示されてしまいます。


- 売上情報の入力~txtItemId_LostFocus -

実際のレコード抽出と結果の表示は、引数にSQLを与えて下請けプロシージャ“SearchItem”を呼び出します。

  Private Sub txtItemId_LostFocus _
   (ByVal sender As System.Object, ByVal e As System.EventArgs) _
   Handles txtItemId.LostFocus
    Dim strSql As String

    ↓商品情報を抽出するためのSQL
    strSql = _
    "SELECT 品名, 販売単価 FROM 商品_mr " & _
    "WHERE 商品ID = " ---- この後ろに入力された商品IDを連結

    ↓商品IDが未入力ならエラーメッセージを表示
    If Me.txtCstmId.Text = "" Then
      MessageBox.Show("商品IDを入力してください。", _
      "入力エラー", MessageBoxButtons.OK)
    Else  ↓SQLにパラメータを付け足す
      strSql = strSql & txtItemId.Text
      SearchItem(strSql) ---- 下請けプロシージャを呼び出す
    End If
  End Sub


- 商品情報を表示~SearchItem -

Subプロシージャ“txtItemId_LostFocus”から呼び出され、引数のSQL文を使ってテーブル「商品_mr」から該当する商品のレコードを抽出して、品名と販売単価をラベルに表示します。併せて、グローバル変数“SlipData”の各メンバにも値を代入します

接続文字列の設定やデータベースのオープン処理などは、既に何度も説明してきたので割愛します。SQLの結果セットはDataReaderオブジェクトに受け取ります。

商品情報の入力で品名や販売単価が未入力となることは考えられないので、テーブル「商品_mr」にNULL値を持つフィールドは存在しないのが普通ですが、ここでも(前回紹介したように)NULL値対策としてIf命令でフィールドの値を調べ、NULL値(DBNull)なら空文字列("")に変換するようにしています。

販売単価は数値なので、ラベル“lblItemValue”に表示する前にFormat関数で3桁ごとのカンマ(,)を挿入するよう書式化しています。

  Private Sub SearchItem(ByVal strSql As String)
    Dim objConnect As New SqlConnection
    Dim objCommand As New SqlCommand
    Dim objDataReader As SqlDataReader

    Try
            : (オープン処理などは省略)
      ↓引数のSQLを設定
      objCommand.CommandText = strSql
      objDataReader = _
       objCommand.ExecuteReader(CommandBehavior.SingleRow)
      If objDataReader.Read() Then ---- レコードが抽出された場合
        ↓NULL値(DBNull)なら空文字列に変換する
        If Not IsDBNull(objDataReader("品名")) Then
          lblItemName.Text = objDataReader("品名")
        Else
          lblItemName.Text = ""
        End If
        If Not IsDBNull(objDataReader("販売単価")) Then
          ↓書式化して表示
          lblItemValue.Text = _
           Format(objDataReader("販売単価"), "#,##0")
        Else
          lblItemValue.Text = ""
        End If
        SlipData.strItemName = lblItemName.Text
        SlipData.intItemValue = CInt(lblItemValue.Text)

      Else ---- 該当レコードが存在しない場合
        MessageBox.Show( _
        "該当する商品が見つかりません。", _
        "検索エラー", _
        MessageBoxButtons.OK, MessageBoxIcon.Error)
        InitForm()
        txtItemId.Text = ""
        txtItemId.Select()
        Exit Sub
      End If
            : (例外処理などは省略)
  End Try



トップページ
後半部分の概要
1.商品の特定
売上情報の入力~txtItemId_LostFocus
商品情報を表示~SearchItem
2.数量の入力~txtNumItems_LostFocus
3.1件の追加
その他の処理
補足
あとがき
Copyright © MESCIUS inc. All rights reserved.