商品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 |
|
|
|