SQLを勉強中の者です。ファーム(S_1)値を使いテーブル(T1)の更新するのに下記のコードで実行したところSQLエラーとなります。どこが間違ってますでしょうか? 多分クオーテーションだと思うのですが・・・
strSQL1 = "UPDATE [T_1] " & _
"SET [F1]=[Forms]![S_1]![c1], " & _
"[F2]=[Forms]![S_1]![c2], " & _
"[F3]=[Forms]![S_1]![c3], " & _
"[F4]=[Forms]![S_1]![c4], " & _
"WHERE [ID]=" & [Forms]![S_1]![txID] & " ;"
あと [Forms]![S_1]![c1~C4]を変数にした場合、どうつないだらいいでしょうか?
テーブル[T_1]のそれぞれのフィールドのデータ型は何なのか。
その SQL 文をどのオブジェクトのどのメソッドによって実行しようとしているのか。
とりあえず以上の 2 点について明記されることをお奨めします。
SK様 T_1のF1は数値型、F2は通貨型、F3は日付型、F4はテキスト型です。
T_1テーブルの上記フィールドを非連結フォームに入力値に更新したいのです。T_1の入力済み値をS_1フォームから変更したいのです。 説明不足でした。
以上の点についてもお答え下さい。
明らかに誤っているのは「最後の代入式の直後に ","(カンマ) が挿入されている」という点ですが、もし DoCmd オブジェクトの RunSQL メソッドではなく DAO.Database オブジェクト(または ADODB.Connection オブジェクト)の Execute メソッドによって SQL を実行されようとしているのであれば、それとはまた別の理由によって実行に失敗するでしょう。
SK様 実行はDoCmd.RunSQL strSQL1 でしてます。明らかに間違ってのカンマを削除したら更新できました(初歩的なミスでした。) すみませんでした。あと SQL部の[Forms]![S_1]![c1~C4]を変数にした場合はどう記述するといいでしょうか? これが上手く出来なくて
各非連結コントロールの値を「 SQL 文におけるリテラル」として組み込みたい、
という意味でおっしゃっているのであれば、その SQL の実行時において、
いずれかの非連結コントロールの値が Null であることを許容するか否か次第です。
単純に Null 値をそのまま文字列連結させてしまうと、実行時に構文エラーが
発生する可能性が極めて高いでしょう。
1箇所修正。
もう1箇所。
各コントロールの入力チェック、コントロールの値に応じた条件分岐、
文字列に含まれる引用符のエスケープ処理などを考慮するのであれば、
以上のサンプルのような形となるでしょう。
ただ私個人の見解としては、こういうまどろっこしい文字列連結を行うコードを
記述するより、パラメータクエリを実行するようにした方が良いと思います。
変数は文字列の外(""の外)に出して&で結合すればいいでしょう。
あと、SQL内では日付時刻型は#で囲む、文字列は'で囲みます。
日付をFormatで書式設定しているのは、OSの日付書式設定によってはうまく行かない場合があるのでその対策です。
テキストボックスが未入力だったりした場合のエラー対策は別途必要になります。
hatena様 ありがとうございます。そのコードで問題なく更新できました。VBA内での改行が絡み頭が混乱してました。
一つ教えて頂きたいのですが、SQL内でフォーム値を使う場合も変数と同じ様に&でつなぎ外に出さないといけないのですよね? 質問時の "SET [F1]=[Forms]![S_1]![c1], " & _ は本来間違っているのですね?( "SET [F1]=" & [Forms]![S_1]![c1] & ", " & _ が正しい) たまたま動作していたのですね?
SK様 失礼しました。hatena様の分の前に詳しい回答を沢山頂いていたのを見落としてました。申し分けありません。
Null値の事は気になってました。説明不足でしたがフォームAのレコードをダブルクリックで変更用のフォームS1が開き、S1で変更しSQLで更新の仕組みにしてます。S1のNULL対策として元々のフォームA値をS1の別のテキストボックスに代入してNULLのテキストボックスにはそれを代入してから更新としてます。
それぞれの投稿の投稿者アイコンの下にある番号が、このスレッドにおける投稿順を示しています。
私が回答したのは hatena さん( 5 番)よりも後です。
ビギナーさんの投稿( 4 番)に返信する形を取ったため、その階層ツリーのノードとして表示されているだけです。
[フォームA]がテーブル[T_1]をレコードソースとする帳票フォームであるとして、
フォーム[S_1]の各非連結コントロールへの値の代入に際し、[フォームA]のカレントレコードから参照されたいずれかのフィールドの値が元から Null であるケースはないのでしょうか。
少なくとも、フォーム[S_1]のいずれかの非連結コントロールの値がユーザーの操作によって Null にされる可能性はゼロではないはずです。
sk様 回答の表示はそういう事だったのですね。
変更用フォーム[S_1]の非連結コントロールは編集可能なのでユーザーでNullにされる可能性はありますので、変更実行ボタン(それに更新SQLコードを記載)に実行前にNull値には別のコントロール値(元から代入させていた)を代入する方法をとってます。