やりたい事説明
やりたい事は、レコードに存在する複数フィールドの内、
やりたい事ポイント
複数ある指定フィールドが完全一致しない限りレコード追加
するというものであり、つまり沢山ある組み合わせ(フィールドデータの組み合わせ)のレコードを追加していきたいという事です。
沢山の項目組み合わせを履歴として蓄積して、次回の入力には、その組み合わせの中から選択すれば簡単に入力することができるような仕組みにしたいと思っています。
【具体的例】
テーブル history [NO,shipper,pu_location,pu_destination,delivery_name,trader,request_store,count]
※NOは自動採番、countは、履歴が使用される毎にカウントアップ用
※2から6フィールドを判別
1,teikoku,souko,tokyo,okinawa,net,fuji,0
2,teikoku,souko,tokyo,hokkaido,net,fuji,0・・・(追加)
3,teikoku,souko,tokyo,okinawa,net,alups,0・・・(追加)
4,teikoku,souko,tokyo,hokkaido,net,fuji,0・・・(2と同じパターンなので無視)
登録時の判別VBA
Sub add_judgement() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim st1 As Integer Dim st2 As Integer Dim st3 As Integer Dim st4 As Integer Dim st5 As Integer Dim st6 As Integer On Error GoTo ErrRtn 'アクションクエリ非表示設定 DoCmd.SetWarnings False If IsNull(shipper_jg) Or IsNull(pu_location_jg) Or IsNull(pu_destination_jg) Or IsNull(delivery_name_jg) Or IsNull(request_store_jg) Or IsNull(trader_jg) Then Exit Sub End If If DCount("*", "history", "shipper = " & shipper_jg) = 0 Then st1 = 0 Else st1 = 1 End If If DCount("*", "history", "pu_location = " & pu_location_jg) = 0 Then st2 = 0 Else st2 = 1 End If If DCount("*", "history", "pu_destination = " & pu_destination_jg) = 0 Then st3 = 0 Else st3 = 1 End If If DCount("*", "history", "delivery_name = " & delivery_name_jg) = 0 Then st4 = 0 Else st4 = 1 End If If DCount("*", "history", "request_store = " & request_store_jg) = 0 Then st5 = 0 Else st5 = 1 End If If DCount("*", "history", "trader = " & trader_jg) = 0 Then st6 = 0 Else st6 = 1 End If If (st1 + st2 + st3 + st4 + st5 + st6) = 6 Then Exit Sub Else Set cn = CurrentProject.Connection Set rs = New ADODB.Recordset rs.Open "history", cn, adOpenKeyset, adLockOptimistic ' トランザクションの開始 cn.BeginTrans rs.AddNew rs!shipper = shipper_jg rs!pu_location = pu_location_jg rs!pu_destination = pu_destination_jg rs!delivery_name = delivery_name_jg rs!trader = trader_jg rs!request_store = request_store_jg rs.Update ' トランザクションの保存 cn.CommitTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End If ExitErrRtn: MsgBox ("初パターンの為、履歴追加しました!") Exit Sub ErrRtn: MsgBox "エラー: " & Err.description 'BeginTransの時点まで戻り、変更をキャンセルする cn.RollbackTrans rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub
フィールド名_jg というのが、フォーム上に設置したテキストボックスになります。
DCount("*", "history", "shipper = " & shipper_jg) = 0
このコードから、テキストボックスに入力されたデータとhistoryテーブルに登録されているデータを比較して、
ココがポイント
フィールドに登録ありか?否かを判別しています
そして、登録有無で、変数に0か1かを代入しています。
なぜ変数にしているかと言えば、同じフィールドに同じデータが2個以上存在する場合もあるので、シンプルに重複データが有る無だけを判別したいので、0か1に変換しています。
If (st1 + st2 + st3 + st4 + st5 + st6) = 6 Then
Exit Sub
Else
登録VBAコード
End If
上のVBAコードで、変数を加算した数値が、6の時(完全一致した時)だけ登録VBAは実行されないようにしています。
調べても中々同じ例題が無い
最初は変数を使わないで何とかできないものかと試行錯誤していましたが、中々、その発想にたどり着くまで時間がかかりました。
ネット上でも探し回りましたが、フィールドの1項目だけ一致したものとか、クエリを使った方法なら可能でしたが、VBAで処理した物は見つかりませんでした。
変数を使えば簡単に処理できる事でしたが、思った以上に時間がかかったので記事にしてみました。