Microsoft Access 掲示板

Error#: 3134 INSERT INTO ステートメントの構文エラーです。 / 9

20 コメント
views
4 フォロー
9

下記の部分でエラーということですね。

    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
        rs.AddNew
        For Each fld In rs.Fields
         fld.Value = Me(依頼ID).Value '←ここでエラー
         fld.Value = Me(依頼日).Value
         fld.Value = Me(依頼者).Value
         fld.Value = Me(W_No).Column(2)
         fld.Value = Me(W_Noロット).Value
         fld.Value = Me(品名).Value
         fld.Value = Me(希望処置).Value
         fld.Value = Me(補足説明).Value
    Next
    rs.Update
    rs.Close

前回の回答で、
一つずつ、フィールドに対応するテキストボックスの値を代入する方法と、
フィールド名とテキストボックスを同じにしておいて、いちいち指定せずにループで代入しておく方法、
の2つを提案したのですが、それを混ぜ和せてしまっては正常に動きません。

前者の方法でいくなら、上記のコードは、下記のようになります。(フィールド名とテキストボックス名は同じにしてあるという前提です)

    Dim rs As DAO.Recordset, fld As DAO.Field
    Set rs = CurrentDb.OpenRecordset("T_依頼")
    rs.AddNew
    rs("依頼ID").Value = Me.依頼ID.Value
    rs("依頼日").Value = Me.依頼日.Value
    rs("依頼者").Value = Me.依頼者.Value
    rs("W_No").Value = Me.W_No.Value 'コンボボックスの連結列をフィールドのデータと合うものにしておく
    rs("W_Noロット").Value = Me.W_Noロット.Value
    rs("品名").Value = Me.品名.Value
    rs("希望処置").Value = Me.希望処置.Value
    rs("補足説明").Value = Me.補足説明.Value
    rs.Update
    rs.Close
通報 ...
  • 10

    後者の方法なら、下記のコードになります。

    入力しないフィールドがある場合  "フィールド1,フィールド2" とカンマ区切りで指定してください。
    全てのフィールドに入力するならIf文は不要です。

        Dim rs As DAO.Recordset, fld As DAO.Field
        Set rs = CurrentDb.OpenRecordset("T_依頼")
        rs.AddNew
        For Each fld In rs.Fields
            If Not "フィールド1,フィールド2" Like "*" & fld.Name & "*" Then
                fld.Value = Me(fld.Name).Value
            End If
        Next
        rs.Update
        rs.Close
    
    11

    すっきりして見やすいですねぇなんて思いながら見てましたが、OpenRecordsetにはSQL文も指定できるのでハイブリッドでやるのもいいかなぁと思いました

        strSQL = "SELECT 依頼ID, 依頼日, 依頼者, W_No, W_Noロット, 品名, 希望処置, 補足説明 FROM T_依頼;"
    
        Set rs = CurrentDb.OpenRecordset(strSQL)
        rs.AddNew
        For Each fld In rs.Fields
            fld.Value = Me(fld.Name).Value
        Next
        rs.Update
    

    不要な分を弾く処理よりは必要分を記述していくほうが分かりやすいかと
    単純なSELECT文なので間違いも起きにくいですし

    それから、エイリアス使ってひねってやるとフィールド名とコントロール名が別でも良かったりしますね

        strSQL = "SELECT 依頼ID AS txt依頼ID, 依頼日 AS txt依頼日, 依頼者 AS cmb依頼者, W_No AS txtW_No, W_Noロット AS txtW_Noロット, 品名 AS txt品名, 希望処置 AS cmb希望処置, 補足説明 AS txt補足説明 FROM T_依頼;"
    

    フォームに配置できないフィールド名(詳細)とかはこの手法で


    質問だと後半のINSERTは「依頼ID」が共通で最大10レコード登録な処理ですかね(追記内容だと「依頼ID」にもiがついているので真実は不明)
    これの時は、別入力処理も使っていくことになりそうです

        Dim strSQL As String
        strSQL = "SELECT 依頼ID, ロット番号 AS txtロット番号, ロット枝 AS cmbロット枝, 依頼理由_1 AS cmb1依頼理由, 依頼理由_2 AS cmb2依頼理由, 依頼理由_3 AS cmb3依頼理由, 巻き長さ AS txt巻き長さ, 詳細補足説明 AS txt詳細補足説明, 更新日時 FROM T_依頼詳細"
        Set rs = CurrentDb.OpenRecordset(strSQL)
        Dim i As Long
        For i = 1 To 10
            If Not IsNull(Me("依頼理由" & i).Value) Then
                rs.AddNew
                For Each fld In rs.Fields
                    If Not ",依頼ID,更新日時," Like "*," & fld.Name & ",*" Then
                        fld.Value = Me(fld.Name & i).Value
                    End If
                Next
                '//レコード共通項目や計算結果を入れるものは個別に処理
                rs!依頼ID.Value = Me!依頼ID.Value
                rs!更新日時.Value = Now
                rs.Update
            End If
        Next i
        rs.Close
    

    更新日時のような計算で求めるものも外に出して個別に処理ですかねぇ


    Like判定は誤動作しそうで怖い。完全一致で判定(Select Caseで列挙するとか)したくなります