1208修正・追加 3.2 チェックボックスの値が変わったら、FLG更新のSQLを実行する
チェックボックスの値が変わったら、FLG更新のSQLを実行する
もう一つの方法として、
□ALL印刷FLG
とチェックボックスを1つ作成して、ヘッダーに配置します。
チェックボックスの値が変化したら(外す・付ける)、
更新のSQLを走らせる、そんな処理を作ってみたいと思います。
ア.タイミングと値の確認
まずは、タイミングを知りたいので、
フォームにチェックボックスを配置したら、
更新後の処理でテストしてみます。
Private Sub ALL印刷FLG_AfterUpdate() If Me.ALL印刷FLG Then MsgBox "on" Else MsgBox "off" End If End Sub
イ.SQL文の確認 SQLピューで確認する
実行したいSQL文を確認するには(直接書ける人は必要ないのですが)
一番簡単なのが、クエリーで作成後にSQLピューを見る方法です。
SQLピュー↑で簡単に確認することができます
UPDATE 社員テーブル SET 社員テーブル.印刷FLG = Yes;
ウ.SQLの実行コマンドを調べる
次に、SQLの実行コマンドを調べたいので、
マクロでSQLの実行を1つ作り、
作成後に 名前を付けて保存 モジュール を選択してコードを作成します。
すると、下記のようなモジュールが作成されます。
'------------------------------------------------------------ ' マクロ1 ' '------------------------------------------------------------ Function マクロ1() On Error GoTo マクロ1_Err DoCmd.RunSQL "UPDATE 社員テーブル ", -1 マクロ1_Exit: Exit Function マクロ1_Err: MsgBox Error$ Resume マクロ1_Exit End Function
ここから、DoCmd.RunSQL "SQL文"が SQLを実行するVBAと知ることができます。
エ.チェックボックスのON/OffでSQL文を実行させる
やっとパーツがそろったので、チェックボックスの値が変化したら、
テーブルの印刷フラグを全て更新するSQL文を走らせたいと思います。
いきなり完成した形を書くとこんな感じです。
Private Sub ALL印刷FLG_AfterUpdate() Me.Refresh '編集中のFLGを強制的に更新する DoCmd.SetWarnings False '警告メッセージをOFFにする If Me.ALL印刷FLG Then 'フラグの状態によって発行するSQLを変化させる DoCmd.RunSQL "UPDATE 社員テーブル SET 社員テーブル.印刷FLG = Yes;", -1 Else DoCmd.RunSQL "UPDATE 社員テーブル SET 社員テーブル.印刷FLG = No;", -1 End If Me.Requery '再描画を兼ねて、再クエリーでフォームデータをキレイにする End Sub
↑さらっと、書いてるけど、いつものようにハマってます。
↓こんな感じでハマりながら、たどりつきました。
[試行錯誤の動画]を入れる。
www.youtube.com
http://www.youtube.com/watch?v=X2rUiWnLB6A
Me.Refresh が無かったら
Me.Refresh の強制更新が無かったら、データの競合
このレコードは他のユーザーによって変更されています。[レコードの保存] を選択すると他のユーザーによる変更を無視し、自分が行った変更を反映します。
と、メッセージが表示されます。その後、
実行時エラー3197:
他のユーザーが同じデータに対して同時に変更を試みているので、プロセスが停止しました。
なんて感じになったりします。
Me.Refreshで更新してから、SQLが走ればメッセージがでません(正常に処理できます)
DoCmd.SetWarnings False が無かったら
DoCmd.SetWarnings False の警告無視が無かったらレコードが更新されます。と親切なメッセージが表示されます。
Me.Requery が無かったら
Me.Requery が無かったら、データが更新されているのに、
画面がそのままだったりして・・・・
たった数行のプログラムを書くのに三流プログラマーらしくハマってしまった(笑)
※少し種類が違うけど、続きは http://d.hatena.ne.jp/ken3memo/20091221/1261369986 を見てください。