• ベストアンサー

テーブルに追加できない

アクセス初心者です。 ACCESS2002で在庫DBを作成中ですが、レコードをテーブルに追加する処理がうまくいきません。 やりたいことは、 1.受払テーブルからレコードセットを抽出 (パラメータは在庫場所、開始日、終了日の3つで、明細表作成フォームから入力しVBAで利用)。 2.抽出レコードを仮テーブルに書込む。 3.仮テーブルのクエリをソースにして明細フォームを表示する。 1については、データが正しく抽出されていることをイミディエイトで確認しています。 しかし、仮テーブルに書き込む段階で次のエラーが発生し停止します。 「実行時エラー'-2147217904(80040e10)': 1つ以上の必要なパラメータの値が設定されていません。」。 問題個所のプロシージャは次の通りです。(フォーム読み込み時) cmd.commandtextでレコードセットを作成・・・ With rst cmd.CommandText = "DELETE * from T_temp2;" cmd.Execute Do Until rst.EOF cmd.CommandText = "INSERT INTO T_temp2 " & _          "(入力ID,払出日,略称,物品ID,払出元ID,払出先ID,払出)VALUES (" & _         .Fields("入力ID") & ", " & _          .Fields("払出日") & ", " & _         .Fields("略称") & ", " & _          .Fields("物品ID") & ", " & _         .Fields("払出元ID") & ", " & _          .Fields("払出先ID") & ", " & _         .Fields("数量") & ");" cmd.Execute .MoveNext Loop End With rst.Close: Set rst = Nothing cnc.Close: Set cnc = Nothing End Sub ご指導のほどよろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

INSERT INTO T_temp2 SELECT .... FROM 受払テーブル WHERE .... として一括でT_temp2に書き込んでしまうのではダメなのですか。 Dim MySql As String MySql = "INSERT INTO T_temp2 (入力ID,払出日,略称,物品ID,払出元ID,払出先ID,払出) SELECT 入力ID,払出日,略称,物品ID,払出元ID,払出先ID,数量 FROM 受払テーブル WHERE ・・・・;" DoCmd.RunSQL MySql とか Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset rstはセットしてあるとして rs.Open "T_temp2", cn, adOpenKeyset, adLockBatchOptimistic, adCmdTableDirect Do Until rst.EOF 入力ID = rs.AddNew 払出日 = rst.Fields("入力ID") rs.払出日 = rst.Fields("払出日") rs.略称 = rst.Fields("略称") rs.物品ID = rst.Fields("物品ID") rs.払出元ID = rst.ields("払出元ID")  rs.払出先ID = rst.Fields("払出先ID") rs.払出 = rst.Fields("数量") rs.Update rst.MoveNext Loop では

jetstream
質問者

お礼

O_cyanさまいつもお世話になります。 早速回答いただきありがとうございました。 ADDNEWを使った方でうまく表示されるようになりました! ・・・ rs.Open "T_temp2", cnc, adOpenKeyset, adLockOptimistic Do Until rst.EOF rs.AddNew rs!入力ID = rst.Fields("入力ID") rs!払出日 = rst.Fields("払出日") rs!略称 = rst.Fields("略称") rs!物品ID = rst.Fields("物品ID") rs!払出元ID = rst.Fields("払出元ID") rs!払出先ID = rst.Fields("払出先ID") rs!払出 = rst.Fields("数量") rs.update rst.MoveNext Loop DoCmd.Requery 感謝いたします。 またよろしくお願いします。

その他の回答 (1)

noname#22222
noname#22222
回答No.1

某HPの<SQL リファレンス>からの抜粋です。 <注意事項> 列名を指定する場合には、必ずカッコで囲みます。 複数個の列名を指定する時には、カンマで区切ります。 列名を省略した場合は、表で定義している列の順番で対応する値を VALUES節に記述します。 キーワード VALUES の後には、挿入する行の各列の値を指定します。 複数個を指定する場合には、カンマで区切り、全体をカッコで囲みます。 キーワード VALUES の後に続く CHAR型や DATE型は、それらの値をシングルクォーテーション(’)で囲みます。 <表へ行を挿入する例文>   CnnExecute("INSERT INTO id管理表                (id_name, final_value)             VALUES                ('Perform', 0)")

jetstream
質問者

お礼

回答いただきありがとうございます。 SQLは記述方法に慣れないと一回では難しいですね! 勉強になりました。またよろしくお願いいたします。

関連するQ&A

  • 帳票フォームに全レコードを表示できない

    アクセス初心者ですが宜しくお願いします。 アクセス2002を使って在庫DBを作っています。 レコードセットで抽出集計した全レコードを、「帳票形式」のフォームにすべて表示させたいのですがうまくいきません。フォームのテキストボックスは全て非連結にしてあります。 考えているのは次のような手順です。 1.表示したい期間の「開始日付=kaisi」と「終了日付=owari」を入力 2.「在庫場所」コンボボックスで表示したい在庫場所コードを選択 3.選択された在庫場所コードによって、SELECT~CASEステートメントで該当する在庫場所テーブルからデータを抽出集計し、フォームに表示させる コードは次の通りです。 Private Sub 在庫場所_AfterUpdate() Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Dim cmd As New ADODB.Command Dim zaiko As Variant Dim kaisi, owari As Date Set cnc = CurrentProject.Connection Set cmd.ActiveConnection = cnc kaisi = Me!期間開始 owari = Me!期間終了 zaiko = Me!在庫場所 Select Case zaiko Case "1" cmd.CommandText = "SELECT 物品ID, Sum(仕入) AS 仕入計, Sum(払出) AS 払出計 FROM T_薬局受払 " & "WHERE (日付) Between #" & kaisi & "# And #" & owari & "# " & "GROUP BY 物品ID;" Set rst = cmd.Execute Do Until rst.EOF  Me!物品ID = rst!物品ID  Me!受入計 = rst!仕入計  Me!払出計 = rst!払出計  rst.MoveNext Loop rst.Close: Set rst = Nothing Case "2"・・・・・・・・・・ End Select cnc.Close: Set cnc = Nothing End Sub 実行しますと、フォームには「最後のレコード」しか表示されません。 フォームプロパティの「規定のビュー」は帳票になっています。 よろしくお願いします。

  • MySQLへのレコード追加

    VB6でMySQL4.1に接続して テーブル"table1"にレコードを追加したいんですけど MySQLには接続できるんですけど、新しいレコードを 追加できません。 エラーメッセージは  Unknown column 'ID'in'fieldlist' とでます。 教えてください。 Dim SQL As String Dim ID As Integer Dim name As String Dim cmd As ADODB.Command Set cmd = New ADODB.Command ID = Text1.Text name = Text2.Text SQL = "insert into table1(AID,Aname) values(ID,name) " cmd.ActiveConnection = cn cmd.CommandText = SQL cmd.Execute table1の内容は AID Aname ←フィールド名 -------------   1  suzuki 2 satou 3 takahasi みたいな感じです。

  • レコードセットに新規追加する

    Access2013 VBAで ■テーブルa ・id ・名前 ・id2 とあり このテーブルのレコードセットを以下のように作ります。 dim Rec = dao.Recordset Set Db = CurrentDB set Rec = Db.OpenRecordset("Select * from [テーブルa] where id2 = " & 2, dbOpenDynaset) この時、このテーブルにid2=2のレコードが何もない場合、この生成したRecで、 Rec.AddNew Rec.Fields("名前").value = "名前" Rec.Update と出来ますでしょうか? よろしくお願いします。

  • アクセス2000(ADO)のレコード更新について

    1件しかレコードがない[リスト連番T]テーブルのレコードを読みだして、(フィールド)リストNOをプラス1して更新したいです。 DOAが混ざっているのか、下記のようにエラーがでます。プラス1して更新する正しいプログラムを教えて下さい。 Private Sub リスト_Click() Dim DBS As Databasu Dim CNC As New ADODB.Connection Dim RST As New ADODB.Recordset Dim LISTNO As Intejer Set CNC = CurrentProject.Connection RST.Open "リスト連番T", CNC, adOpenKeyset,adLockOptimistic, adCmdTableDirect LISTNO = RST!リストNO RST.Close Set RST = Nothing CNC.Close Set CNC = Nothing Set DBS = CurrentDb Set RST = DBS.OpenRecordset("リスト連番T") With RST -----.Edit で コンパイルエラー-----   メソッドまたはデータメンバーがみつかりません .Edit !リストNO = LISTNO + 1 .Update .Close

  • フォーム上のフィルタで抽出されたデータをテーブルに格納したい

    フォーム上のフィルタで抽出されたデータをテーブルに格納したい 度々お世話になります。 フォーム上で3つのキーワードを使って抽出したデータを テーブルに格納したいと思っています。 以下のコードを書いたところ、矢印の部分でエラーが起こります。 お知恵を拝借できませんでしょうか? よろしくお願いいたします。 Private Sub cmd04_Click() Dim db As DAO.Database Set db = CurrentDb() Dim mySQL As String mySQL = "INSERT INTO 04_パソコン機器管理台帳 select * FROM T05_使用者一覧抽出結果 WHERE " & Me.Filter & ";" If MsgBox("該当レコードを追加します。", vbYesNo) = vbYes Then ' SQLを実行します。 db.Execute mySQL   ←エラーが発生します。 MsgBox "該当レコードを追加しました。" End If End Sub

  • VB6.0でエクセルを扱うプログラムについて

    こんにちは。VB初級者です。宜しくお願いします。 現在、VB6.0でエクセルの表を操作するようなプログラムを作っています。下に書いたプログラム(わかりにくいとは思いますが、ご教授お願いします。)で値の更新は出来たようなのですが、実際に表を開こうとすると”不正な処理が行われました”というエラーメッセージが出て開くことが出来ません。ADOオブジェクトでエクセルを扱うのがちょっとおかしい(?)のかもしれませんが、今回はEXCELオブジェクトは使わないという方針です。 自分ではどこが間違っているかわかりませんでしたので教えて頂ければと思います。宜しくお願い致します。 Private Sub Command1_Click() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.4.0" cn.Properties("Extended Properties") = "Excel 8.0" cn.Properties("Data Source") = "C:\VB\株価管理\株価.xls" cn.Open Dim cmd As ADODB.Command Dim mySQL As String mySQL = "update [株価$] set 高値 =10000 where 高値 = 7" Set cmd = New ADODB.Command cmd.ActiveConnection = cn cmd.CommandText = mySQL cmd.Execute Set rst = New ADODB.Recordset rst.Source = "Select * From [株価$]" rst.ActiveConnection = cn rst.CursorType = adOpenDynamic rst.Open , , , , adCmdText Do While Not rst.EOF Debug.Print rst.Fields("高値") rst.MoveNext Loop rst.Close cn.Close Set rst = Nothing Set cn = Nothing Set cmd = Nothing End Sub

  • 異なるフォームに属する関数間でACCESSのレコードセットを受け渡しする。

    msAccess2000のVBAコードの質問です。 元々、全てを理解しているわけではないのにVBAコードを書いているのが無茶なんですが、無茶を承知でプログラミングしています。 あるクエリの結果を、あるフォームで帳票表示しています。この帳票の一レコードにボタンをつけて、クリックイベントで、そのレコードを取得しようとしています。フォームはこの後、閉じられた後、呼び出された親にその、レコードを渡したいのです。 フォームは、親フォームのボタンクリックイベントから、DoCmd.Openformメソッドによって呼び出されるので、戻り値は使えません。 しょうがないので、広域変数rst(DAO.Recordset型)で、受け渡そうと思ったのですが、recordset型は、どうやら参照のようで、フォーム(クエリ?)を閉じると、レコードが壊れてしまうようなのです。 Module1で、 public rst as DAO.recordset として、 Private Sub コマンド34_Click() set Module1.rst=me.recordset ' この中では、rst.fields(*)で、フィールドの値を使えるのですが・・・ END Sub 呼び出した親フォームでは、module1.rst.fields(*)を使用できません。 質問は二つあります。 1)広域変数rstは、上記のような宣言・使用法で問題ないですか? 2)sub またはfunction間にわたって、レコードを渡す、いい方法はないですか?

  • CMD.Executeの結果をメッセージボックスで表示したい

    Public Sub SQLActionCmd()     Dim CN As ADODB.Connection     Dim CMD As ADODB.Command     Dim MYSQL As String     '接続     Set CN = CurrentProject.Connection     '更新     MYSQL = "SELECT * FROM 名簿 WEHRE 性別 = "男" ;"     Set CMD = New ADODB.Command     CMD.ActiveConnection = CN     CMD.CommandText = MYSQL     CMD.Execute    '終了     Set CMD = Nothing     RS.Close: Set RS = Nothing     CN.Close: Set CN = Nothing    End Sub と言う感じで実際にはAccessのフォームのボタンをクリックしたタイミングでコードをかいているのですが、このCMD.EXECUTEを実行した結果、テーブルに該当データがなければない旨のメッセージボックスを出したいのです。 そういうことは可能でしょうか?

  • アクセス VBAでレコードが追加できない

    お世話になります。 フォームのボタン(コマンド1)をクリックして テーブルにレコードを追加したいのですが、うまくいきません。 SQLの引数value('intNumber')を実数(例えば'3')とかにすると うまく1レコード追加されるのですが、新規レコードとして 連番で追加させたいので困っています。 宜しくお願いします。 Private Sub コマンド1_Click() Dim dbDao As DAO.Database Dim stSql As String Dim intNumber As Integer intNumber = DMax("[管理ID]", "[テーブル名]") + 1 Set dbDao = CurrentDb stSql = "insert into テーブル名 (管理ID,管理2,管理3) values ('intNumber','99999','99999');" dbDao.Execute stSql dbDao.Close: Set dbDao = Nothing End Sub

  • ACCESS クエリからテーブルへのコピペ

    Pzrivate Sub cmb品番_AfterUpdate() Dim Rst As DAO.Recordset Dim z As String z = DLookup("コード", "Q_コンポーネント", "専用コード='" & Me.tx専用コード & "'") Set Rst = CurrentDb.OpenRecordset("W_部品一覧", dbOpenTable) With Rst .AddNew .Fields("区分") = DLookup("部門", "Q_マスタ", "専用コード='" & z & "'") .Fields("分類1") = DLookup("分類1", "Q_マスタ", "専用コード='" & z & "'") .Fields("分類2") = DLookup("分類2", "Q_マスタ", "専用コード='" & z & "'") .Fields("品番") = DLookup("材料", "Q_マスタ", "専用コード='" & z & "'") .Fields("品名") = DLookup("品名", "Q_マスタ", "専用コード='" & z & "'") .Fields("コード") = DLookup("コード", "Q_マスタ", "専用コード='" & z & "'") .Fields("品種") = DLookup("品種", "Q_マスタ", "専用コード='" & z & "'") .Fields("重量") = DLookup("重量", "Q_マスタ", "専用コード='" & z & "'") .Update End With Rst.Close Set Rst = Nothing End Sub ------------------------------------------------------------ 上記のコードで「Q_マスタ」クエリの内容を「W_部品一覧」テーブルにコピペしています。 ※「W_部品一覧」テーブルはサブフォームです。 「Q_マスタ」クエリの専用コードフィールドには「z」と一致する値が複数あるのですが、上記コードではそのクエリ内の一番上の1レコード分しかコピペできていません。 「z」の値が一致している全てのフィールドを「Q_マスタ」→「W_部品一覧」にコピペするようにしたいです。 For~NextやDo While~Loopを使って処理回数を増やしてみたのですが、同じレコードの内容が繰り返しコピペされてしまいました。 どうすれば複数のレコードをコピペできるかご教示頂けますようお願いします。