Microsoft Access 掲示板

フォームの入力/未入力に対応する更新SQL / 1

7 コメント
views
1
hiroton 2025/04/09 (水) 16:18:37 96ec1@f966d

プログラミングにおける変数への値の代入処理は右辺に自分自身(変数)を指定して、自身の内容を書き換える処理が記述できます

x = 1
x = x + 1
Debug.Print x '=>2

ここで記述している「=」は変数への代入命令の記述であるということに注意してください


入力状態をチェックしながらstrSQLを生成していけばいいですね

If IsNull(Me!change_Date) And IsNull(Me!change_Kokyaku) And IsNull(Me!change_Firm) And IsNull(Me!change_Tanto) And IsNull(Me!change_Biko) Then Exit Sub

Dim strSQL As String
strSQL = "UPDATE [T_製造履歴] SET "
If Not IsNull(Me!change_Date) Then strSQL = strSQL & "[完成日付]=#" & Format(Me!change_Date, "yyyy/mm/dd") & "#, " 
If Not IsNull(Me!change_Kokyaku) Then strSQL = strSQL & "[顧客ID]=" & Me!change_Kokyaku & ", "
If Not IsNull(Me!change_Firm) Then strSQL = strSQL & "[firmID]=" & Me!change_Firm & ", "
If Not IsNull(Me!change_Tanto) Then strSQL = strSQL & "[製造担当者ID]=" & Me!change_Tanto & ", "
If Not IsNull(Me!change_Biko) Then strSQL = strSQL & "[備考]='" & Me!change_Biko & "' "
strSQL = strSQL & "WHERE [check]=-1 ;"

CurrentDb.Execute strSQL

もしくは、「元の値と同じ値で書き換える」としても更新分だけを更新することになります

If Me!change_Date & Me!change_Kokyaku & Me!change_Firm & Me!change_Tanto & Me!change_Biko & "" = "" Then Exit Sub

Dim strSQL As String
strSQL = "UPDATE [T_製造履歴] " & _
         "SET [完成日付]=#" & Format(Nz(Me!change_Date, Me!完成日付), "yyyy/mm/dd") & "#, " & _
         "[顧客ID]=" & Nz(Me!change_Kokyaku, Me!顧客ID) & ", " & _
         "[firmID]=" & Nz(Me!change_Firm, Me!firmID) & ", " & _
         "[製造担当者ID]=" & Nz(Me!change_Tanto, Me!製造担当者ID) & ", " & _
         "[備考]='" & Nz(Me!change_Biko, Me!備考) & "' " & _
         "WHERE [check]=-1 ;"

CurrentDb.Execute strSQL

Nz関数を使って、「更新後の値がなければ元の値を使う」ように指示しています

通報 ...
  • 3
    hatena 2025/04/09 (水) 23:03:51 修正 >> 1

    前者のコードだと、Me!change_Biko がNullのとき、WHERE の直前に , が来ることになりSQLエラーになりますね。
    例えば、直前に, を付けておいて最後に先頭の, を削除してSQL文を完成させるようにすればいいでしょう。

    Dim strSQL As String
    If Not IsNull(Me!change_Date) Then strSQL = ", [完成日付]=" &  Format(Me!change_Date, "\#yyyy/mm/dd\#") 
    If IsDate(Me!change_Kokyaku) Then strSQL = strSQL & ", [顧客ID]=" & Me!change_Kokyaku
    If Not IsNull(Me!change_Firm) Then strSQL = strSQL & ", [firmID]=" & Me!change_Firm
    If Not IsNull(Me!change_Tanto) Then strSQL = strSQL & ", [製造担当者ID]=" & Me!change_Tanto
    If Not IsNull(Me!change_Biko) Then strSQL = strSQL & ", [備考]='" & Me!change_Biko & "'"
    
    If strSQL = "" Then Exit Sub
    
    strSQL = "UPDATE [T_製造履歴] SET " & Mid(strSQL, 3) & " WHERE [check]=True;"
    CurrentDb.Execute strSQL
    

    後者のコードはカレントレコードの値で上書きしてしまいますね。
    「元の値と同じ値で書き換える」なら下記のような感じになるかと。

    Dim txDt  As String, koID As String, fiID As String, taID As String, txBiko As String
    txDt = IIf(IsNull(Me!change_Date), "[完成日付]", Format(Me!change_Date, "\#yyyy/mm/dd\#"))
    koID = Nz(Me.change_Kokyaku, "[顧客ID]") 
    fiID = Nz(Me.change_Firm, "[firmID]") 
    taID = Nz(Me.change_Tanto, "[製造担当者ID]")
    txBiko = IIf(IsNull(Me.change_Biko), "[備考]", "'" & Me.change_Biko & "'")
    
    Dim strSQL As String
    strSQL = "UPDATE [T_製造履歴] " & _
             "SET [完成日付]=" & txDt & ", " & _
             "[顧客ID]=" & koID & ", " & _
             "[firmID]=" & fiID & ", " & _
             "[製造担当者ID]=" & taID & ", " & _
             "[備考]=" & txBiko & " " & _
             "WHERE [check]=True;"
    
    CurrentDb.Execute strSQL
    
    4
    hiroton 2025/04/10 (木) 09:26:05 b4b71@f966d >> 3

    あー、そうですね。訂正ありがとうございます
    フォームに見えてるデータならDAOでやるかなぁとか考えていたらろくにテストもせず投稿してしまいました