前回は、入力データを閲覧できるようにサブフォームを設定する方法を紹介しました。これは、登録したデータを確認するとともに、ユーザーによる不用意なデータ処理を制限するためと紹介しました。しかしながら、実際の運用では間違えてデータ登録をした場合に削除する必要が出てきます。そこで、今回はサブフォームで選択したレコードを削除できる機能を追加するための事前準備方法を紹介したいと思います。
要件の追加に対する注意点
さて、これまで作成してきた機能では、入庫もしくは出庫時のレコードを登録し、この際に「T_在庫テーブル」にも情報を登録するというものでした。しかしながら、同一のタイミングで登録した「T_入庫テーブル」または「T_出庫テーブル」のレコードと「T_在庫テーブル」のレコードには紐づけをしていないため、仮に「T_入庫テーブル」のあるレコードを削除したときに、「T_在庫テーブル」にあるレコードの内、どれを削除して良いかが困ってしまいます。
したがって、入庫データ/出庫データと在庫データを紐づけるための仕組みを設ける必要があります。
このような場合に、各テーブルで設定したIDフィールド(主キー)を有効活用することができます。IDフィールドは「オートナンバー型」であり、レコードを登録した際に必ず付与されるものであり、また重複が禁止されているものです。したがって、入庫/出庫データを登録する際に、付与されたIDを「T_在庫テーブル」にも持たせることで、情報の紐づけをすることができるようになるわけです。
レコードの関連付けに向けて
T_在庫テーブルには、入庫/出庫データを登録される際に併せて登録されます。この際に、「入庫ID」あるいは「出庫ID」を登録できるように、フィールドを追加します。
入庫/出庫データ登録時のソースコード修正
これまでに作成したデータ登録時のソースコードでは、各ID情報を「T_在庫テーブル」に登録する仕組みは設けていませんでした。したがって、次に示すようにソースコードを追記します。
① ID変数の宣言: T_在庫テーブルにID情報を登録するため、T_入庫テーブルまたはT_出庫テーブルに登録されたレコードのIDを格納するための変数を宣言する。
② IDデータの登録: ①で宣言した変数にT_入庫テーブルまたはT_出庫テーブルに新規登録されたレコードのIDを格納する。
③ T_在庫テーブルへのID登録: ②で格納したIDを「入庫ID」または「出庫ID」フィールドに登録する。 ←この段階でレコード間の関連付けができたことになる。
以上を反映したソースコードを以下に示します。対象となるイベントは「cmd_入庫処理_Click」と「cmd_出庫処理_Click」です。
■入庫処理のソースコード
Public Sub cmd_入庫処理_Click() '品目情報が入力されていないと処理中止 If Me.t_品目情報 = "" Or IsNull(Me.t_品目情報) Then 'Nullか未入力かどちらかで処理中止 MsgBox "品目情報が選択されていません。" Exit Sub '入庫数が入力されていないと処理中止 ElseIf IsNumeric(Me.t_入庫数) = False Then MsgBox "入庫数が正しく入力されていません。(半角数字で入力)" Exit Sub ElseIf Me.t_入庫数 <= 0 Then MsgBox "入庫数にゼロ以下の値が入力されています。" Exit Sub '担当者情報が入力されていないと処理中止 ElseIf Me.t_担当者情報 = "" Or IsNull(Me.t_担当者情報) Then MsgBox "担当者情報が選択されていません。" Exit Sub End If Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset '★追加ポイント① Dim ID As Integer 'カレントデータベースへの接続 Set cn = CurrentProject.Connection 'T_入庫テーブルを開く rs.Open "T_入庫テーブル", cn, adOpenKeyset, adLockOptimistic 'レコードセットの登録(フィールド指定は、rs!~と記載する。) rs.AddNew rs!入庫数 = Me.t_入庫数 rs!入庫年月日 = Now() rs!品名 = Me.t_品目情報 rs!担当者 = Me.t_担当者情報 'Updateで情報登録が完了する。 rs.Update '★追加ポイント② 'T_在庫テーブルの出庫IDフィールドに登録するために一時変数保管 ID = rs!入庫ID 'テーブルを閉じる。 rs.Close 'T_在庫テーブルを開く rs.Open "T_在庫テーブル", cn, adOpenKeyset, adLockOptimistic 'レコードセットの登録(フィールド指定は、rs!~と記載する。) rs.AddNew rs!在庫数 = Me.t_入庫数 '入庫は在庫に対してプラスの処理。 rs!在庫年月日 = Now() rs!品名 = Me.t_品目情報 '★追加ポイント③ '出庫IDと入庫IDの情報を登録する。(これでT_入庫テーブル内レコードとの紐づけが可能。) rs!出庫ID = 0 rs!入庫ID = ID 'Updateで情報登録が完了する。 rs.Update 'テーブルを閉じる。 rs.Close 'データベース接続を閉じる。 cn.Close 'ガーベージコレクション Set rs = Nothing Set cn = Nothing Me.t_品目情報 = "" Me.t_入庫数 = "" Me.Requery 'サブフォームに情報更新の結果を反映する。 Forms!F_メイン!F_入庫サブ.Requery MsgBox "処理を完了しました。" End Sub
■出庫処理のソースコード
Private Sub cmd_出庫処理_Click() '品目情報が入力されていないと処理中止 If Me.t_出庫品目 = "" Or IsNull(Me.t_出庫品目) Then 'Nullか未入力かどちらかで処理中止 MsgBox "品目情報が選択されていません。" Exit Sub '出庫数が入力されていないと処理中止 ElseIf IsNumeric(Me.t_出庫数) = False Then MsgBox "出庫数が正しく入力されていません。(半角数字で入力)" Exit Sub '出庫数がマイナスになっていないか確認。 ElseIf Me.t_出庫数 <= 0 Then MsgBox "出庫数にゼロ以下の値が入力されています。" Exit Sub '担当者情報が入力されていないと処理中止 ElseIf Me.t_出庫担当者 = "" Or IsNull(Me.t_出庫担当者) Then MsgBox "担当者情報が選択されていません。" Exit Sub End If Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset 'カレントデータベースへの接続 Set cn = CurrentProject.Connection Dim mySQL As String 'mySQL変数にSELECT文を格納。半角スペースの記入漏れに注意!! mySQL = "SELECT Sum(T_在庫テーブル.在庫数) AS 在庫数の合計, T_在庫テーブル.品名" mySQL = mySQL + " FROM T_在庫テーブル" mySQL = mySQL + " GROUP BY T_在庫テーブル.品名 HAVING (((T_在庫テーブル.品名)= " & [Forms]![F_メイン].[t_出庫品目] & "));" 'mySQLで設定したSELECT文を開く rs.Open mySQL, cn, adOpenKeyset, adLockOptimistic '在庫数のチェック: 在庫数から出庫数を引いた値がマイナスとなれば処理を中止する。 If rs!在庫数の合計 - Me.t_出庫数 < 0 ThenMsgBox "在庫数がマイナスとなるため、処理を中止します。" 'DBを閉じることを忘れないように!!
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
Exit Sub
Else 'SELECT文で開いた内容は閉じる。 rs.Close End If '★追加ポイント① Dim ID As Integer 'T_出庫テーブルを開く rs.Open "T_出庫テーブル", cn, adOpenKeyset, adLockOptimistic 'レコードセットの登録(フィールド指定は、rs!~と記載する。) rs.AddNew rs!出庫数 = Me.t_出庫数 rs!出庫年月日 = Now() rs!品名 = Me.t_出庫品目 rs!担当者 = Me.t_出庫担当者 'Updateで情報登録が完了する。 rs.Update '★追加ポイント② 'T_在庫テーブルの出庫IDフィールドに登録するために一時変数保管 ID = rs!出庫ID 'テーブルを閉じる。 rs.Close 'T_在庫テーブルを開く rs.Open "T_在庫テーブル", cn, adOpenKeyset, adLockOptimistic 'レコードセットの登録(フィールド指定は、rs!~と記載する。) rs.AddNew rs!在庫数 = -Me.t_出庫数 '出庫は在庫に対してマイナスの処理。 rs!在庫年月日 = Now() rs!品名 = Me.t_出庫品目 '★追加ポイント③ '出庫IDと入庫IDの情報を登録する。(これでT_出庫テーブル内レコードとの紐づけが可能。) rs!出庫ID = ID rs!入庫ID = 0 'Updateで情報登録が完了する。 rs.Update 'テーブルを閉じる。 rs.Close 'データベース接続を閉じる。 cn.Close 'ガーベージコレクション Set rs = Nothing Set cn = Nothing Me.t_出庫品目 = "" Me.t_出庫数 = "" Me.Requery 'サブフォームに情報更新の結果を反映する。 Forms!F_メイン!F_出庫サブ.Requery MsgBox "処理を完了しました。" End Sub
サブフォームにID情報を追加
レコードを削除する際に、当該レコードのID情報を取得することで、「T_在庫テーブル」から削除するレコードを決めることができます。(これまで、入庫テーブルと出庫テーブルで設定をしてきた理由はここにあります。)
そのため、サブフォームから「入庫ID」あるいは「出庫ID」を取得できるようにテキストボックスを追加する必要があります。この方法は単純で、サブフォームでオブジェクトを配置した方法と同様に、「t_入庫ID」及び「t_出庫ID」なるテキストボックスを追加すれば良いです。
この際、これらテキストボックスはユーザーが確認する必要がないため、見えなくても良いものです。したがって、追加したテキストボックスのプロパティシートを開き、「可視」プロパティを「いいえ」としてください。
これで、削除をするための事前準備を一通りすることができました。
次回は、サブフォームで削除したいレコードを選択し、コマンドボタンをクリックすることで削除処理する方法を紹介します。
まとめ
今回の記事はこれまでと違って、当初と要件が異なる場合あるいは要件が追加された際の設計追加方法を紹介しました。本来であれば、要件定義をする際に考えられる事項を定めてテーブルやフォームの設計をすることが基本ですが、運用をしていくうちに機能の追加を余儀なくされることは往々にしてあります。その時に、どのような改修をすればコストを抑えて効率的に機能を実現できるかが問われます。
紹介した方法が最適解かまでは議論することが難しいですが、比較的容易に改修ができるようにしました。次回は、削除機能を実現化してより実効性の高いデータベースを作成していきたいと思います。
スポンサーリンク
コメント