パソコン情報

【Access】複数のレコードセットを使って別テーブルの更新

Gerd AltmannによるPixabayからの画像

マイクロソフトアクセス(以下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

 

別の備忘録ブログ記事にて、レコードセットの追加や更新、削除などの処理方法は記事にしてみたいと思います。