三流君 ken3のmemo置き場

メモ置き場、保管庫として利用。まとまっていませんがヨロシク

挨拶・自己紹介:
失敗続きのAB型の変わり者 :三流プログラマー Ken3です
フリーのエンジニア・個人事業主です・・と書くと聞こえはイイが(それとなくカッコよく聞こえるが)、 現在は小さな案件の受注請負 と 短期派遣 で 日々つつましく?ほそぼそと暮らしてます。
(※詳細は[三流君 三流プログラマーとは?]を見てください)


広告:


[記事一覧、バックナンバーを見る]

Accessの名簿データをExcelへ 1208修正・追加 3.2 チェックボックスの値が変わったら、FLG更新のSQLを実行する

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

↑さらっと、書いてるけど、いつものようにハマってます。
↓こんな感じでハマりながら、たどりつきました。

[試行錯誤の動画]を入れる。

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 が無かったら、
データが更新されているのに、
画面がそのままだったりして・・・・


たった数行のプログラムを書くのに三流プログラマーらしくハマってしまった(笑)

今回の問い合わせ2009-12-08の分は
http://ken3hitori.g.hatena.ne.jp/bbs/2/28?mode=tree
のツリーを見てください。

全体の開発の流れを見るには
http://ken3hitori.g.hatena.ne.jp/bbs/2?mode=tree
のツリーを見てください。

サンプルファイルは
Test20091208.zip 直
を保存して使ってみてください。

※少し種類が違うけど、続きは http://d.hatena.ne.jp/ken3memo/20091221/1261369986 を見てください。