• 締切済み

INSERT INTO ステートメントの横文エラー。の解決

INSERT INTO ステートメントの横文エラー。の解決 Access VBAについての質問です。 在庫管理のフリーソフトを落とし改良している者です。 見よう見まねで手を加えてきたのですがタイトルのようなエラーが発生しました。 全くの初心者(というか未経験者です)なもので調べてみてもエラーの意味がよく分からず解決できずにいます。 こんな私にも分かりやすいようにどなたかご教授願えませんでしょうか? Access2003を使用しています。 ソフトはhttp://ebe.jp/psoft/zaiko/様から落としたものです。 DoCmd.RunSQL ("INSERT INTO 入出庫(日付, 取引先No, 取引先名, 区分, 商品コード, メーカー名, 商品名, カナ, 大分類, 中分類, 小分類, 単価, 入庫数量, 出庫数量, 備考) VALUES(" & strDate & ", '', '棚卸', '棚卸', '" & RS.Fields("コード") & "', '" & RS.Fields("メーカー名") & "', '" & RS.Fields("商品名") & "', '" & RS.Fields("カナ") & "', '" & RS.Fields("大分類") & "', '" & RS.Fields("中分類") & "', '" & RS.Fields("小分類") & "', " & RS.Fields("単価") & ", 0, " & Abs(dblSa) & ", '')") これが元のソースで当然ですが落としたソフト自体は問題なく動作していました。 これに手を加えたものが(下矢印)のソースになります。 DoCmd.RunSQL ("INSERT INTO 入出庫(日付, 取引先No, 取引先名, 区分, 商品コード, メーカー名, 商品名, 型番, カナ, 大分類, 中分類, 小分類, 単価, 入庫数量, 出庫数量, 備考) VALUES(" & strDate & ", '', '棚卸', '棚卸', '" & RS.Fields("コード") & "', '" & RS.Fields("メーカー名") & "', '" & RS.Fields("商品名") & "', '" & RS.Fields("型番") & "', '" & RS.Fields("カナ") & "', '" & RS.Fields("大分類") & "', '" & RS.Fields("中分類") & "', '" & RS.Fields("小分類") & "', " & RS.Fields("単価") & ", 0, " & Abs(dblSa) & ", '')") 元のソフトに『型番』というフィールドを追加しています。 このソースはもちろん、元のソースを移行してみても同じエラーが起こります。 フィールドを追加したときに他のテーブルやフォーム、クエリ、ソースにももちろん追加したのですが、 フォームだけスペースの問題で「大分類・中分類・小分類」のラベル・テキストを削除しました。 削除したのはソースとは全く別のフォームですがこれが原因になっていることもあるのでしょうか? 念のため関連していそうなフォームにこれらのラベルとテキストを再度作成しましたが結果は同じでした。 下手な説明かもしれませんがよろしくお願いします。

みんなの回答

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

DoCmd.RunSQL (SQLString) このコマンドのSQLStringの部分はSQL文として正しい構文になっていなければなりません。 質問のコマンドをみると、SQLStringの部分は、RS.Fields("xxxx")の値を代入してからRunSQLを実行しています。 なので、RS.Fields("xxxx")の値がどうなっているかでSQLStringの内容が変わり、構文エラーになる可能性を除くことはできません。 質問のコマンドを、 SQLString = "INSERT INTO 入出庫(日付, ・・・・・" & Abs(dblSa) & ", '')" DoCmd.RunSQL (SQLString) のように2つに分けて記述し、SQLStringにどんな値が入っているかを確認してみてはどうでしょうか。 考えられる原因の1つは、 RS.Fields("xxxx")で参照した値をシングルクォーテーション(')で括っている場合は、RS.Fields("xxxx")で参照した値自体にシングルクォーテーションが入っていると構文エラーになります。

_dejitto_
質問者

お礼

ソースに問題があるものとばかり思っていました。 こんな落とし穴もあるんですね。 時間を割いて回答してもらったのに結局自己解決という形になってしまいましたが、 おかげでまた一つ勉強になりました。 ありがとうございました。 今後の参考にさせてもらいます。

_dejitto_
質問者

補足

アドバイスありがとうございます。 教わったことを試してみたのですが空振りでした。 その後も色々探っているうちに特定の商品を見積もり登録するときのみエラーが起こることがわかりました。 特定の商品というのが単価の設定をしていないもので、 どうやら単価の値をNULLにしていたのが原因だったみたいです。。 NULLを全て「0」にしたところ正常に動作するようになりました。

関連するQ&A

  • Insert Intoでアップデートをかけたい

    テーブルから他テーブルへデータの更新をしたいと思っています。 テーブルは下記のような構成になっています。 テーブルSTOCK(主キーは商品コード) 商品コード(varchar),数量(int) A001,5 B002,10 C003,30 テーブルTOTAL(主キーは商品コード) A001,10 B002,20 やりたいことは、テーブルTOTALを更新させる事です。テーブルSTOCKの商品コードがテーブルTOTALにあれば、減算をおこないたいです。 そこで下記のSQLを書きました。 INSERT INTO テーブルTOTAL SELECT * FROM テーブルSTOCK ON DUPLICATE KEY UPDATE テーブルTOTAL.数量 = テーブルTOTAL.数量 - テーブルSTOCK.数量 更新結果 A001,5 B002,10 C003,30 商品コードがA001、B002は欲しい結果がでました。欲しい結果はC003が「-30」になることです。 テーブルTOTALにはC003の商品コードがないため、30でアップデートされてしまうのですが、なんとか「-30」で更新できるようにできないでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • INSERT INTOステートメント構文エラー

    はじめまして。 急遽VB6.0、Accessで開発を行うことになりまして、小さなアプリを練習がてら作成したのですが、上記エラーが出てしまい、困っています。当方まったくの初心者で本を片手にコーディングしております。。 機能:CSVからデータを取り出して、DBにINSERTする コード Private cn As New ADODB.Connection Private Rs As New ADODB.Recordset Private Sub フォームフッター_Click() End Sub Private Sub トグル27_Click() Dim filPath As String ' [ファイルを開く]ダイアログ WizHook.Key = 51488399 damy = WizHook.GetFileName(0, "", "", "", filPath, "", "すべてのファイル (*.*)|*.*", 0, 0, 0, True) Me!fp = filPath WizHook.Key = 0 End Sub Private Sub トグル28_Click() Set cn = CurrentProject.Connection Open Me!fp For Input As #1 Dim varData As Variant Dim buf As String Dim a As String Dim b As String Dim c As String Do Until EOF(1) Line Input #1, buf varData = Split(buf, ",", , vbTextCompare) Dim mySql As String a = varData(0) b = varData(1) c = varData(2) MsgBox a MsgBox b MsgBox c mySql = "INSERT INTO COUNT(f,s,t) VALUES ('" & a & "','" & b & "','" & c & "')" Debug.Print mySql cn.Execute (mySql) MsgBox "更新されました。" Loop Close #1 cn.Close End Sub テーブル: フィールド名 f,s,t すべてテキスト型 イミディエイトウィンドウ表示内容:INSERT INTO COUNT(f,s,t) VALUES ('1','2','3') 恐れ入りますが、ご教授いただければ幸いです。 よろしくお願いします!

  • ACCESS2007 VBA 「INSERT INTO~」について

    ACCESS2007を使用しています。 VBAにて、下記の内容を記述しています。(前後は略しています) 特にエラーも出ていなくて、最後まできちんと実行されるのですが、顧客マスタにデータが追加されません。 strSQL = "INSERT INTO 顧客マスタ(得意先ID,得意先名,得意先名カナ,郵便番号,住所,電話番号,FAX番号) " & _ "VALUES(" & tID & ",'" & rs!顧客名 & "','" & rs!カナ & "','" & rs!郵便番号 & "','" & rs!住所 & "','" & rs!電話番号 & "','" & rs!FAX & "');" db.Execute strSQL イミディエイトウィンドウで、strSQLの内容を表示してみたら、下記のようになりました。 特におかしな所もなく、テーブル名も正しいです。 INSERT INTO 顧客マスタ(得意先ID,得意先名,得意先名カナ,郵便番号,住所,電話番号,FAX番号) VALUES(9265,'テスト顧客','テスト','5555555','テスト住所','111-111-1111','222-222-2222'); その他にも、「INSERT INTO~」を使ってテーブルにデータを追加していますが、それはちゃんと追加されていて、なぜか顧客マスタのみ追加されません。 エラーも出ないので解決できなくて困っています。 よろしくお願いします。

  • INSERT INTOステートメント構文エラーにつ

    初めましてご教授よろしくお願いします。 ■環境 office365(ExcelとAccess) INSERT INTOステートメント構文エラーについての質問です。 著:今村ゆうこさんの『Excel&Access連携 実践ガイド』を読みながら現在作業を しています。 やりたいことはExcelのデータをaccessに書き込むことです。 エラー内容は「INSERT INTO ステートメントの構文エラーです。」と表示されます。 しかし、何度も見直して見ましたが、どこがエラーの原因かわかりません。 VBAは基本的部分が分かる程度で、現在勉強中です。 正直手詰まりといった感じで何を修正すれば良いかわからないというのが現状でこちらに質問させていただきました。 皆様の知恵を貸してください。どうかよろしくお願い致します。 ▼Excelデータ Product Name / Merchant SKU / ASIN / Condition / qty ○○(商品名) / テキスト / テキスト / テキスト / 個数 strSQL = _ "INSERT INTO テーブル(" & _ "Product Name, " & _ "Merchant SKU, " & _ "ASIN, " & _ "Condition, " & _ "qty) " & _ "VALUES(" & _ "'" & Cells(n, 1) & "', " & _ "'" & Cells(n, 2) & "', " & _ "'" & Cells(n, 3) & "', " & _ "'" & Cells(n, 4) & "', " & _ Cells(n, 5) & ");" ▼書籍に記載のあった例(添付CDのデータを丸々コピペしています) strSQL = _ "INSERT INTO 販売管理(" & _ "商品コード, " & _ "商品名, " & _ "売上日, " & _ "数量, " & _ "売価, " & _ "製造場所, " & _ "定価, " & _ "原価, " & _ "取引先, " & _ "営業所, " & _ "社員名) " & _ "VALUES(" & _ "'" & Cells(n, 1) & "', " & _ "'" & Cells(n, 2) & "', " & _ "#" & CDate(Cells(n, 3)) & "#, " & _ Cells(n, 4) & ", " & _ Cells(n, 5) & ", " & _ "'" & Cells(n, 6) & "', " & _ Cells(n, 7) & ", " & _ Cells(n, 8) & ", " & _ "'" & Cells(n, 9) & "', " & _ "'" & Cells(n, 10) & "', " & _ "'" & Cells(n, 11) & "');" ▼全体の文 Option Explicit '変数の宣言を強制する '---ACCESS接続用 Private adoCn As Object 'ADOコネクションオブジェクト Private adoRs As Object 'ADOレコードセットオブジェクト Private strSQL As String 'SQL文 Sub DBconnect(flg As Boolean) 'DB接続プロシージャ Dim DBpath As String DBpath = ThisWorkbook.Path Set adoCn = CreateObject("ADODB.Connection") 'ADOコネクションオブジェクトを作成 If flg = True Then Set adoRs = CreateObject("ADODB.Recordset") 'ADOレコードセットオブジェクトを作成 adoCn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & DBpath & "\SampleData.accdb;" 'Accessファイルを開く End Sub Sub DBcut_off(flg As Boolean) 'DB切断プロシージャ If flg = True Then adoRs.Close 'レコードセットのクローズ adoCn.Close 'コネクションのクローズ Set adoRs = Nothing 'オブジェクトの破棄 Set adoCn = Nothing End Sub Sub DBinsert_all() 'DB一括書込 Dim start_i As Long, end_i As Long, n As Long If MsgBox("一括書込を実行しようとしています。続けますか?", vbOKCancel) <> 1 Then 'メッセージ Exit Sub 'OK以外なら終了 End If If MsgBox( _ "Accessの「販売管理」テーブルのデータを一度削除し、" & vbCrLf & _ "現在このシートにある情報のみが書き込まれます。" & vbCrLf & _ vbCrLf & _ "実行してよろしいですか?", vbOKCancel + vbExclamation, "一括書込み") <> 1 Then 'メッセージ Exit Sub 'OK以外なら終了 End If start_i = 2 'スタート行 end_i = Range("A1").End(xlDown).Row '最終行を取得 Call DBconnect(False) 'DB接続 On Error GoTo Err_Handler 'エラーが起きたら"Err_Handler"へ adoCn.BeginTrans 'トランザクション開始 strSQL = "DELETE FROM 販売管理;" 'テーブル内データを全削除 adoCn.Execute strSQL '削除実行 For n = start_i To end_i 'データのある行を繰り返す strSQL = _ adoCn.Execute strSQL '書込実行 Next n adoCn.CommitTrans 'トランザクション終了(確定処理) Call DBcut_off(False) 'DB切断 MsgBox "正常に完了しました" Exit Sub

    • ベストアンサー
    • MySQL
  • SQL SERVER INSERT文

    決まった件数単位にデータをINSERTしたい。 例)仕入明細→仕入伝票明細(行は2行まで) 仕入明細 商品CD 商品名 数量 000001 AAA   1 000002 BBB   2 000003 CCC   3 000004 DDD   1 000005 EEE    2 を仕入伝票明細へINSERTするときに2行単位に伝票ID、行をつけて INSERTしたい 仕入伝票明細へは 伝票ID 行 商品CD 商品名 数量 001  1  000001 AAA  1 001  2  000002 BBB  2 002  1  000003 CCC  3 002  2  000004 DDD  1 003  1  000005 EEE  2 伝票IDはコントロールの伝票IDに+1してセットする こんな感じのINSERT文を作りたいのですが、どなたか教えてください 宜しくお願いします

  • insert文について

    Access2000を使用しています。 テーブルがメインとサブの2つあり、 どちらにも同じ項目があります。 その項目をリレーションシップで関連付けました。 フォームがあり、いくつかあるテキストボックスは非関連です。 そのテキストの1つが関連付けた項目となります。 フォームに入力した項目はほどんどがサブテーブルにinsertされます。 しかし、SQL文は実行されるのですが、 そのあと、エラーメッセージにより追加されることができません。 リレーションシップをしていると追加することができないのでしょうか? 項目名は ・コード ・学校名 ・学部

  • access2003

    2000種ほどの商品を扱っています。商品コードひとつにつき、仕入先・取引先が1箇所ずつ決まっていて、値段の変化もあまりありません。伝票を見ながら、フォームから直接売上入力を行い、請求処理と売上分析に利用したく思います。 ◆親)売上入力フォーム:売上管理番号/日付/取引先/取引先伝票番号/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付/取引先伝票番号 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 入力の効率化を図るため、1部品1取引先であることを利用して、親フォームで取引先を選択することで商品を絞り込み、子フォームの商品選択コンボボックスにはその取引先の商品だけが表示させるようにしたいと思います。どのような方法が考えれるでしょうか? クエリを使うのだと思いますが、いろいろ試しても失敗してしまいます。 また、その上でさらなる絞込みとして、明細の各行で各商品を選択する際に、商品コードの一部を入れたり、仕入先名を入れると部品が絞り込めるようにできないでしょうか? アドバイス、参考資料、なんでもお寄せください! どうぞよろしくお願いいたします。

  • 票フォーム-データ更新について

    Access2003を利用しています。 伝票入力用のワークテーブルを帳票フォームで入力しようとしています。 (ワークテーブル内容) ID 商品コード 商品名 数量 単価区分 単価 金額 単価A 単価B 単価C  ・  ・ (10種類の単価設定あり) 単価J 帳票フォームのレコードソースにワークテーブルをセットして (表示) 商品コード、商品名、数量、単価 金額 (非表示)A単価、B単位、C単価、~J単価 としています。 商品コードが入力されると、商品マスターから情報を取得して 単価A~Jに値をコピーしています。 txt単価A = recW("単価A")  txt単価B = recW("単価B")  txt単価C = recW("単価C")    ・   ・ txt単価J = recW("単価J")  ここで質問ですが、 現状だとレコードに値を入れたい場合、 非表示のテキストボックスを利用していますが フォームのレコードセットにそのまま代入する方法はないでしょうか? 初心者の質問でお恥ずかしいですが、何卒、ご教授ください

  • NULL文字のINSERT

    こんにちは。 SQLServer初心者です。 Access VBAで SQLServerから抽出したデータをDBにINSERT しようとしてるのですが、抽出した項目にNULLデータがあるので エラーになってしまいます。 どのように回避すればよろしいでしょうか? ISNULL関数を使えば回避できるのでしょうか? たとえば以下のようなINSERT分を実行したいのですが、 顧客名_漢字のフィールドにはNULL文字が入ってる場合があるとします。 よろしくお願い致します。 strSQL2 = "" strSQL2 = strSQL2 & " INSERT INTO NORSE_TMP_DATA ( " strSQL2 = strSQL2 & " ポート名" strSQL2 = strSQL2 & ", 顧客名_漢字" strSQL2 = strSQL2 & ", 顧客名_カナ" strSQL2 = strSQL2 & ", 契約状態" strSQL2 = strSQL2 & ", 契約番号" strSQL2 = strSQL2 & ", 契約枝番号" strSQL2 = strSQL2 & ", 顧客番号" strSQL2 = strSQL2 & " VALUES (" strSQL2 = strSQL2 & " '" & rs.Fields("ポート名").Value & "'" strSQL2 = strSQL2 & ", '" & rs.Fields("顧客名_漢字").Value & "'" strSQL2 = strSQL2 & ",'" & rs.Fields("顧客名_カナ").Value & "'" strSQL2 = strSQL2 & ",'" & rs.Fields("契約状態").Value & "'" strSQL2 = strSQL2 & "," & rs.Fields("契約番号").Value strSQL2 = strSQL2 & "," & rs.Fields("契約枝番号").Value strSQL2 = strSQL2 & "," & rs.Fields("顧客番号").Value strSQL2 = strSQL2 & " )"

  • access2003 抽出条件が持ち越されてしまう

    http://okwave.jp/qa3580875.html ↑にて質問させていただいた者です。  一部繰り返しになりますが、2000種ほどの商品を扱っています。伝票を見ながらフォームから直接売上入力を行いたく思います。 ◆親)売上入力フォーム:売上管理番号/日付/取引先/取引先伝票番号/売上合計金額 ◆子)売上明細フォーム:商品コード/商品名/単価/数量/明細金額 ◆売上入力テーブル:売上管理番号/取引先/日付/取引先伝票番号 ◆売上明細テーブル:明細番号/売上管理番号/商品コード/数量/明細単価 子フォームで商品コードのフィルターとして、 1)親フォームで選択した取引先の商品のみ→[Forms]![売上入力フォーム]![取引先]を導入 2)ワイルドカード「Like "*" & [商品コードの一部を入力] & "*"」 のふたつを使っていますが、うまく動作してくれません。 いったん商品コードを選択すると、明細の次の行に移動しても取引先選択のポップアップが出ず、コンボボックスには同じ選択肢が提示されます。さらに、新しいレコードに移動してもポップアップなし&同じ選択肢が続きます。 この状態を回避する方法を教えてください。 長くなりましたが、どうぞよろしくお願いします。

専門家に質問してみよう