Accessを最初使って戸惑った事は、フォームのフィールドの値を触った時点でテーブルの値も書き換えられてしまうところ。
これは当然テーブルに保存されているレコードを直接表示して触っているのですから、当たり前と言えば当たり前の事なのですが、右も左も分かっていない初心者の頃は、保存処理もしていないのに書き換わってしまう事に「なぜ?」と当時は思いました。
書店で売られている殆どの参考書には、仮テーブルを使う事や非連結でやる方法は目にした事がないですが、これをやり出すと最終本テーブルに保存する際に追加クエリ或いは更新クエリが必要で、その際複数のテーブルに処理が跨る場合は、処理中にエラーがあった時に処理前に戻す必要がありますので、トランザクション処理が必須となります。
これをやっておかないと、処理が途中でストップしますので、1つ目のテーブル保存処理は終わっているけど、2つ目のテーブル処理が出来ていない状態となり、整合性を保つことが出来ません。
トランザクション処理をやっておけば、途中でエラーで処理がストップした場合、処理前の状態に戻る(厳密には一連の処理が終わるまではテーブルに保存せず、エラーがない場合)ので、必ずやっておきましょう。
Googleで検索しておりますと、下記のサイトに分かりやすく説明してくれておりますので、引用させていただきました。
Private Sub サンプル_Click()
Dim cn As New ADODB.Connection
Dim cmd As ADODB.Command
If MsgBox("処理を実行しますか? ", vbYesNo, "更新確認") = vbYes Then
Set cn = CurrentProject.Connection
Set cmd = New ADODB.Command
cmd.ActiveConnection = cn
On Error GoTo ErrorHandler
cmd.CommandText = "BEGIN TRANSACTION"
cmd.Execute
DoCmd.SetWarnings False
DoCmd.OpenQuery "クエリ1"
DoCmd.OpenQuery "クエリ2"
DoCmd.OpenQuery "クエリ3"
DoCmd.OpenQuery "クエリ4"
cmd.CommandText = "COMMIT TRANSACTION"
cmd.Execute
Set cmd = Nothing
cn.Close: Set cn = Nothing
Else
MsgBox "処理せずに終了しました。"
Exit Sub
End If
ExitErrorHandler:
Exit Sub
ErrorHandler:
cmd.CommandText = "ROLLBACK TRANSACTION"
cmd.Execute
Set cmd = Nothing
cn.Close: Set cn = Nothing
MsgBox "エラーが発生しました。処理せずに戻ります。"
End
End Sub私はあまりクエリを使わずSQLを直接書く事が多いんですが、その場合クエリ部分に直接書いてもいいですし、関数にしてもいいと思います。
