毎回大変お世話になっています。今回はUPDATEについてです。
テーブル(T_製造履歴)にはフィールド[履歴ID] [製品名] [顧客ID] [firmID] [製造担当者ID] [check](yes/no型) 等があります。このテーブルを基に作成したクエリをソースにしたリスト型フォームがあり、それに[check]=yes した分に対して内容を変更したいのです。変更内容はそのフォームに非連結コントロールを作成してます。変更対象のフィールドは5ヶありまして、変更する項目だけ入力する形です。なので変更項目が入力されたフィールドだけテーブル更新となります(未入力項目はテーブル値のまま)。変更対象の5項目が全て入力済みなら下記コードで更新出来ているのですが未入力がある場合どうすれば一纏めのコードにしたらいいのか分かりません。各フィールドに対して個々の更新コードでは出来ると思うのですが、入力/未入力の組合せが多くなってしまうので。いいアイデアがあれば宜しくお願いします。
Dim txDt As Variant, koID As Variant, fiID As Variant, taID As Variant, txBiko As Variant
'change○○が一覧フォームの非連結コントロールです
txDt = Me.[change_Date].Value
koID = Me.[change_Kokyaku].Value
fiID = Me.[change_Firm].Value
taID = Me.[change_Tanto].Value
txBiko = Me.[change_Biko].Value
Dim strSQL As String
strSQL = "UPDATE [T_製造履歴] " & _
"SET [完成日付]=#" & Format(txDt, "yyyy/mm/dd") & "#, " & _
"[顧客ID]=" & koID & ", " & _
"[firmID]=" & fiID & ", " & _
"[製造担当者ID]=" & taID & ", " & _
"[備考]='" & txBiko & "' " & _
"WHERE [check]=-1 ;"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
プログラミングにおける変数への値の代入処理は右辺に自分自身(変数)を指定して、自身の内容を書き換える処理が記述できます
ここで記述している「
=
」は変数への代入命令の記述であるということに注意してください入力状態をチェックしながら
strSQL
を生成していけばいいですねもしくは、「元の値と同じ値で書き換える」としても更新分だけを更新することになります
Nz関数を使って、「更新後の値がなければ元の値を使う」ように指示しています
前者のコードだと、Me!change_Biko がNullのとき、
WHERE
の直前に,
が来ることになりSQLエラーになりますね。例えば、直前に
,
を付けておいて最後に先頭の,
を削除してSQL文を完成させるようにすればいいでしょう。後者のコードはカレントレコードの値で上書きしてしまいますね。
「元の値と同じ値で書き換える」なら下記のような感じになるかと。
あー、そうですね。訂正ありがとうございます
フォームに見えてるデータならDAOでやるかなぁとか考えていたらろくにテストもせず投稿してしまいました
履歴って更新するものなの?
hirotonさん hatenaさん ありがとうございます。
なるほどです! 複数FilterのWHERE組立の様にしたらいいのですね(,の件も確かにそうですね)。
コマンドボタンにコード記述したら上手くいきました。
あと一つだけアイデア頂きたいのですがchange_Bikoに誤って""(長さ0の文字列)だけが入力されて、それが更新に反映されるのを防ぎたいのですが、それはどうすればいいでしょうか?
★この履歴の更新ですが登録ミスの変更や仕様変更等が発生した場合の変更をまとめてする為のものです(最終的な正しい履歴にする為の)。
宜しくお願いします。
通常、非連結のテキストボックスに
""
(長さ0の文字列)が入ることはありませんフォーム上での人の操作で「何か入力」→「Delete等で削除」を行うと、非連結のテキストボックスの内容は
NULL
になります。(レコードソースに連結されたコントロールの場合、設定によっては""
が入る場合があります)VBAによる操作等で、直接
Me!テキストボックス = ""
のような処理を行うと、非連結のテキストボックスでもその値が""
になったりはしますそもそも気にしていなかったのですが、逆に、「備考を削除したい」という場合はないのでしょうか?
「NULLなので更新対象外」と、「内容削除のために
""
が入力されている」は実作業の上では判別できないので、「備考を削除する」チェックボックスを追加で用意するとかになると思いますまた、とりあえず、回答では
IsNull()
を使っていますが、NULL
も""
同じように扱われればよいならMe!テキストボックス & "" = ""
で判定できますそのほかのコントロールについても、データ型が文字列型以外になるのならば
IsDate()
やIsNumeric()
等で判定してあげるとより良いと思いますhirotonさん ありがとうございます。大変勉強になります。
""では上手く検出出来ませんでしたが、よく考えると全角スペースには有効ではありませんでした。この非連結テキストボックスには入力し易い様にプロパティに ひらがな 設定してます。なので全角状態になっているからでした。なのでフォーカス喪失後イベントに下記を記述しました。他の変更用非連結部は全てコンボボックスからの選択ですので大丈夫です。
確かに「備考を削除する」の想定もありますね。様子みて作成していきます。
Nullと""、" " の違いは難しいですね。本当にありがとうございました。