Microsoft Access 掲示板

SQLの実行方法 / 2

17 コメント
views
4 フォロー
2
hiroton 2024/05/14 (火) 17:05:54 43b60@f966d

この[cb発注先選択]部を Me.Filter にしたいのです。T納品書まだ分.納品書入り日) Is Nullの後にどうコードをつないだらいいのかが分からなくて。

Me.Filterの中には

そのフォームには仕入先、入荷日、直送先等の抽出条件

ということで、[cb発注先選択]以外の情報が含まれている可能性があります。この中(Me.Filter)から[cb発注先選択]だけの情報を抜き取りたいということであれば、それは普通やらないです。[cb発注先選択]の情報はそのままMe!cb発注先選択で参照できるので、わざわざMe.Filterから抜き出したりしません

strSQL = _
    " UPDATE T納品書まだ分 SET T納品書まだ分.チェック1 = Yes" & _
    " WHERE (((T納品書まだ分.納品書入り日) Is Null) AND ((T納品書まだ分.発注先ID)=" & Me![cb発注先選択] & "));"

フィルターを何かの手法で直接操作して、その状態でフィルター文字列から何かの情報を取得したいというのは方向性が逆ですね。元となる個別の情報を個別に扱えるような設計を考えましょう

DoCmd.OpenQuery

動的にSQLを生成するなら、そのままSQLを実行するコマンドがあります
DoCmd.RunSQL メソッド (Access)

もっといえば、VBAで処理をするならDoCmd オブジェクト (Access)はあまり使う場面がありません。たいていは、より直接的に扱える手法が用意されています。クエリ、SQLの実行であればDatabase.Execute メソッド (DAO)が使いやすいと思います

使用例

strSQL = _
    " UPDATE T納品書まだ分 SET チェック1 = Yes" & _
    " WHERE 納品書入り日 Is Null AND 発注先ID=" & Me!cb発注先選択 & ";"
CurrentDb.Execute strSQL

最終的にはチェックYes分に納品書日付を一括代入するボタンもSQL(更新)で処理させたいです。

納品書日付に入力する値もフォームのテキストボックスで事前に入力しておけば、そのテキストボックスを参照してSQLの文字列に入れ込めばいいですね

If Not IsDate(Me!納品書日付) Then
    MsgBox "納品書日付を入力してください"
    Me!納品書日付.SetFocus
    Exit Sub
End If
strSQL = _
    " UPDATE T納品書まだ分 SET チェック1 = Yes, 納品書日付 = #" & Me!納品書日付入力テキストボックス & "#" & _
    " WHERE 納品書入り日 Is Null AND 発注先ID=" & Me!cb発注先選択 & ";"
CurrentDb.Execute strSQL

改めてですが、フォームに読み込んだデータをフォーム上の作業で更新するならDAO処理のほうが楽ですね。それはそれとして、VBAでSQLを動的に扱うことはあるので、それ用のケーススタディということで

通報 ...