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

プログラミングとSQL(3)
~フィールドの更新とレコードの追加処理
長谷川裕行
有限会社 手國堂

レコードの追加処理(2)~商品IDの重複検査

商品IDは主キーなので、テーブル中で唯一の値でなければなりません。入力された新規商品の商品IDが既存商品のものと重複していないときにだけ、レコードを追加できるようにします。


- グローバル変数の宣言 -

商品IDの重複検査と商品の追加は異なるプロシージャで実行されるため、商品IDの重複を調べた結果はグローバル変数に記録しなければなりません。レコードの追加処理では、それを参照して追加できるかどうかを判断します。

宣言セクションで論理型の変数“IsOverlap”を宣言し、これをフラグとして利用します。商品IDが重複していれば“IsOverlap”はTrue、重複していなければFalseとし、初期値はTrueに設定しておきます。

  Dim IsOverlap As Boolean ' 商品IDが重複していればTrue

このグローバル変数とフォーム上の各コントロールは、“InitForm”プロシージャで初期化します。InitFormはフォームが生成されたときに実行されるフォームのLoadイベントに対応するプロシージャ(ここでは“Form1_Load”)から呼び出されます。

Private Sub InitForm()
     IsOverlap = True ---- グローバル変数をTrueで初期化する
txtItemId.Text = ""
txtItemName.Text = ""
txtSupplierId.Text = ""
lblSupplier.Text = "?"
txtBuyPrice.Text = "0"
txtSalePrice.Text = "0"
End Sub


- 基本は検索処理 -

テキストボックス“txtItemId”に入力された商品IDが、テーブル「商品_dmy」に既に記録されているかどうかを調べます。この処理は、単純に“txtItemId”に入力された値をキーにして「商品_dmy」からレコードを抽出し、それが成功すれば「重複あり」、失敗(該当するレコードがない)なら「重複なし」と判断します。

従って、既に説明したSELECT命令とDataReaderオブジェクトを使用します。この処理は、btnIdCheckのClickイベントに割り当てます。“btnIdCheck_Click”ではSQLの準備を行い、実際の重複検査は商品の検索処理と同じようにSubプロシージャ“Search”で行います。


Dim strSql As String

↓検索用の接続文字列を設定
strSql = _
"SELECT 商品ID, 品名 FROM 商品_dmy " & _
"WHERE 商品ID = "

↓テキストボックスの未入力チェック
If Me.txtItemId.Text = "" Then
     MessageBox.Show("商品IDを入力してください。", _
"入力エラー", MessageBoxButtons.OK)
Else ---- パラメータを付け足して検索を実行
     strSql = strSql & txtItemId.Text
Search(strSql)
End If


- フラグの値で判断する -

Subプロシージャ“Search”では、既に紹介した商品の検索処理とほとんど同じ処理を実行します。ただ、検索結果によってグローバル変数“IsOverlap”を、検索が成功すれば「重複あり」としてTrueに、失敗すれば「重複なし」としてFalseに設定するところが異なっています。

以下のソースの★マークの箇所で、「重複あり」の場合にIsOverlapにTrueを代入していますが、実際には次に呼び出す初期化用のプロシージャ“InitForm”の中で同じことをしているので、この部分は実は記述する必要がありません。ただ、ソースを読んで処理の流れを理解しやすいよう、くどい書き方をしているだけです。

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

Try
            :
接続文字列の設定など
       :
objConnect.Open()

↓引数のSQLを設定
objCommand.CommandText = strSql

↓検索処理(結果をデータリーダに受け取る)
objDataReader = objCommand.ExecuteReader(CommandBehavior.SingleRow)
If objDataReader.Read() Then ---- 商品IDが重複しているとき
        txtItemName.Text = objDataReader("品名")
strMessage = "商品ID:" & txtItemId.Text & vbCrLf & _
         "品名 : " & objDataReader("品名") & vbCrLf & _
         "この商品IDは既に存在しています。"
MsgBox(strMessage, MsgBoxStyle.OKOnly, "IDの重複")
↓フラグをセット★
IsOverlap = True
InitForm()
Exit Sub
     Else ---- 重複がなければ追加処理を続行
        MsgBox("この商品IDは未登録です。", MsgBoxStyle.OKOnly, "追加可能")
IsOverlap = False ' フラグがFalseの場合だけ追加可能となる
     End If
       :
End Try
End Sub



トップページ
フィールドの更新処理(1)~SQLとアプリの仕様
フィールドの更新処理(2)~ソースコードの記述
レコードの追加処理(1)~SQLとアプリの仕様
レコードの追加処理(2)~商品IDの重複検査
グローバル変数の宣言
基本は検索処理
フラグの値で判断する
レコードの追加処理(3)~仕入先名の表示
レコードの追加処理(4)~実際の追加処理
あとがき
Copyright © MESCIUS inc. All rights reserved.