マイクロソフトアクセス(以下Access)を使っていて、できるだけVBAは使わない方(使えない方)なのですが、レコードセットという仮想的な機能を使うと処理速度も速く簡単に処理ができる場合がある。
具体的には、
仮想的なテーブルがある
サンプルVBA
2個のレコードセットを準備して、一つのレコードセットのあるフィールドの値によって、「memo」という変数に文字を代入しています。
もう一つのレコードセットでは、その「memo」に値(文字入力)があった場合には、「memo」の変数が代入され、値が無かった場合は、フォームの「input_メモ」の内容が書き込まれるというVBAになります。
Private Sub btn_納入処理実行_Click()
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
Dim SQL As String
Dim memo As String
SQL = "SELECT * FROM dbo_outsourcing_running WHERE 外注手配番号 ='" & Me!call_外注手配番号 & "'"
Set cn = CurrentProject.Connection
rs.Open "dbo_details_outsourcing_running", cn, adOpenKeyset, adLockOptimistic
rs2.Open SQL, cn, adOpenKeyset, adLockOptimistic
While Not rs2.EOF
If IsNull(rs2!再伝発行日) Then
Else
If rs2!再伝理由 = 1 Then
memo = "紛失による伝票再発行"
ElseIf rs2!再伝理由 = 2 Then
memo = "修正による伝票再発行"
End If
End If
rs2.Update
rs2.MoveNext
Wend
rs.AddNew
rs!外注手配番号 = Me!call_外注手配番号
rs!納品日 = Me!input_納品日入力
rs!納品数 = Me!input_納入数入力
If memo = "" Then
rs!メモ = Me!input_メモ
Else
rs!メモ = memo
End If
rs.Update
rs.Close: Set rs = Nothing
rs2.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
DoCmd.ShowAllRecords
Me.外注手配番号入力.SetFocus
input_納品日入力 = Null
input_納入数入力 = Null
input_メモ = Null
End Sub
複数のレコードセット
参考書等見ても、複数のレコードセットを開く方法がないので、自分で試用して備忘録にするしかないのですが、この方法が本当に正解かどうかは分かりませんが、とりあえず動きましたので備忘録にしてみました。
複数レコードセットを開くには、
Dim rs As New ADODB.Recordset
Dim rs2 As New ADODB.Recordset
のような感じで、増やしていけばいいのかと思います。
次に、下記のように開いて仮想空間にテーブルを開くという感覚ですかね。
Set cn = CurrentProject.Connection
rs.Open "dbo_details_outsourcing_running", cn, adOpenKeyset, adLockOptimistic
rs2.Open SQL, cn, adOpenKeyset, adLockOptimistic
ポイントは、変数を使えば、他のテーブルにデータを追加したり、計算結果を更新したりできるんじゃないかと思います。
変数を使ってレコードセットの数値を追加更新
そして、レコードセットの処理が終わったら閉じて終了ですね。
rs.Close: Set rs = Nothing
rs2.Close: Set rs = Nothing
cn.Close: Set cn = Nothing
上記のサンプルでは、下記のVBAで更新
While Not rs2.EOF
処理内容
rs2.Update
rs2.MoveNext
Wend
そして、下記のVBAでレコードを追加
rs.AddNew
処理内容
rs.Update
別の備忘録ブログ記事にて、レコードセットの追加や更新、削除などの処理方法は記事にしてみたいと思います。