選択クエリを開けない

このQ&Aのポイント
  • OSはXP、ACCESS2002でDB作成中。ADOで選択クエリを開きたいがエラー発生。
  • 上記コードで、”Q_残高計算”という選択クエリを開きたいがエラーメッセージが表示される。
  • どこがまずいのかわからない。
回答を見る
  • ベストアンサー

選択クエリを開けない

お尋ねします。 OSはXP、ACCESS2002でDB作成中です。 ADOで選択クエリを開きたいのですが、エラーが出てうまくいきません。 Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Set cnc = CurrentProject.Connection stSQL = "Q_残高計算" rst.Open stSQL, cnc ・・・・・・・・・・・・・・・・・・・・・・・ 上記のコードで、”Q_残高計算”という選択クエリを開きたいのですが、実行すると、 「実行時エラー'2147217900(80040e14)': SQLステートメントが正しくありません。'DELETE'、'INSERT'、'PROCEDURE'、'SELECT'、または'UPDATE'を使用してください。」 というエラーメッセージが出てしまいます。 どこがまずいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • sakko99
  • ベストアンサー率63% (19/30)
回答No.4

> パラメータの指定は「開始日」「終了日」「仕入先」の3つが必要なのでしょうか。 その通りです。 ・「クエリ」-「パラメータ」でその3つを定義 ・SQL条件で上記パラメータを参照 ・ADOからパラメータ値を指定して実行

jetstream
質問者

お礼

ありがとうございました。おかげさまでパラメータクエリの考え方がなんとか理解できました。またよろしくお願いします。

その他の回答 (3)

  • sakko99
  • ベストアンサー率63% (19/30)
回答No.3

「Q_残高計算」はパラメータを使用していますか? 外部パラメータを必要とするクエリの場合は、それを指定する必要があります。 例) cmd.CommandText = "Q_残高計算" cmd.Parameters.Append cmd.CreateParameter("param", adVarChar, adParamInput, 4, "TEST") Set rst = cmd.Execute

jetstream
質問者

お礼

回答ありがとうございます。 ご指摘のとおりパラメータクエリです。 フォームから ・「開始日」と「終了日」を入力 ・「仕入先」をコンボボックスで選択 して仕入先別の取引台帳を表示させたいのです。 SQLは次の通りです。 SELECT Sum([数量]*[単価]*1.05) AS 仕入計, Sum([支払金額]) AS 支払計 FROM (T_外部取引 LEFT JOIN T_物品マスター ON T_外部取引.物品ID = T_物品マスター.物品ID) INNER JOIN T_業者繰越残高 ON T_外部取引.仕入先ID = T_業者繰越残高.仕入先ID WHERE (((T_外部取引.仕入先ID)="04") AND ((T_外部取引.納品日) Between [Forms]![F_台帳表示]![開始日]and [Forms]![F_台帳表示]![開始日])) OR (((T_外部取引.仕入先ID)="04") AND ((T_外部取引.支払日) Between [Forms]![F_台帳表示]![開始日]and [Forms]![F_台帳表示]![開始日])); おわかりのように、取引テーブル(T_外部取引) と物品テーブル(T_物品マスター)、繰越テーブル(T_業者繰越残高)の3つのテーブルを結合し、仕入先IDと指定した期間をもとに仕入・払出取引を抽出し、それぞれの合計を求めるものです。 パラメータの指定は「開始日」「終了日」「仕入先」の3つが必要なのでしょうか。

  • sakko99
  • ベストアンサー率63% (19/30)
回答No.2

これではだめですか? ------------------------------------ Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Dim cmd As New ADODB.Command Set cnc = CurrentProject.Connection cmd.ActiveConnection = cnc cmd.CommandType = adCmdStoredProc cmd.CommandText = "Q_残高計算" Set rs = cmd.Execute

jetstream
質問者

お礼

やってみましたが、下記エラーが出ました。 「実行時エラー '-2147217904 (80040e10)': パラメータが少なすぎます。1を指定してください。」 どういう意味なのでしょうか。 アドバイスをいただけますか。

jetstream
質問者

補足

早速のご回答ありがとうございます。いま出張中なのでDBアクセスができません。月曜日にやってみます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

オブジェクトとしてのクエリ「Q_残高計算」を開くことはできるのですか? できないならば、そこからデバッグですね。 できるのならば、コピー&ペーストで半角英数文字のみでクエリ名を作成してみるとVBAで開けますか?

jetstream
質問者

お礼

すべて英文字の「zan」という名前にしてやってみましたが、下記エラーメッセージが出てデバッグ画面になります。 「実行時エラー '-2147217904 (80040e10)': パラメータが少なすぎます。1を指定してください。」 どうすればいいのか、アドバイスを頂けないでしょうか。

jetstream
質問者

補足

早速のご回答ありがとうございます。出張中なのでDBアクセスができません。月曜日にやってみます。

関連するQ&A

  • アクセス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

  • 【MS ACCESS】 クエリの結果を文字列で書き出す事に悩んでいます。

    お世話になります。 選択クエリの結果を文字列として書き出したいので、いろいろ調べてみると 以下のコードを見つけました。 ======================== Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset Dim strData As String Set cnn = CurrentProject.Connection With rst .Open "顧客マスタ", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect strData = .GetString(adClipString, 10) Debug.Print strData .Close End With cnn.Close ================================== これはテーブルを文字列としてイミディエイトウィンドに書き出すものなのですが、これがテーブルだけしか使えず、難儀しております。変更しようにもなにぶん実力がないもので手が出ません。 どうぞ、選択クエリの結果を文字列として表示させる方法を教えてください。 お願いします。

  • これらはどういう意味ですか?

    On Error GoTo ErrorHandler Me!開始日 Dim cnn As ADODB.Connection Dim rst As New ADODB.Recordset よろしくお願いします♪

  • access2000VBAで、外部ファイルに書き込むには

    access2000 VBAで 「sample.htmlを作成、 tableテーブルのデータを書き込む」 をして、htmlファイルを自動作成したいのですが、 うまくVBAがかけません。 とりあえず、外部ファイルにデータを出力に取り組んでいます 外部ファイルの作成の仕方と、書き込みのところで、 どうしたらいいのか分からず、困っています。 アドバイスおねがいします。<(_ _)> Dim cnc As New ADODB.Connection Dim rst As New ADODB.Recordset Set cnc = CurrentProject.Connection rst.Open "table", cnc, adOpenKeyset, adLockOptimistic, adCmdTableDirect Open sample.html For Output As #1 If rst.EOF Then MsgBox "There are not recordset" GoTo db_Close End If Do Until rst.EOF Debug.Print rst!種類, rst!名前, rst!url Write #1, rst!種類, rst!名前, rst!url rst.MoveNext Loop Close #1 db_Close: rst.Close Set rst = Nothing cnc.Close Set cnc = Nothing End Sub

  • Newがどのような役割をしているのかわからない

    エクセルからアクセスの更新クエリを実行する際に エクセル側のコードで Sub ACCESSのアクションクエリを実行する() Dim cn As ADODB.Connection Dim myCmd As ADODB.Command Set cn = New ADODB.Connection Set myCmd = New ADODB.Command cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ".accdb;Jet OLEDB:Database" だとうまくいきませんでしたが、 Dim cn As New ADODB.Connection にしたらうまくいきました。 Newを付けることによって成功したのですが、 Newがどのような役割をしているのかわからないので教えてください。

  • Access2000でVBAからパラメータクエリを実行

    Access2000でフォームからの値を参照して実行するクエリを作りました。 SQLで表すと、以下のようなものです。 クエリ名:test SELECT TEST.HAKKODTE FROM TEST WHERE (((TEST.HAKKODTE)=Format([Forms]![F_メニュー]![txtNyukinDate],"yyyymmdd"))); このクエリをダブルクリックで実行すると問題なく実行できます。 これを、VBAからレコードを参照したいと思い、 以下のように記述しました。 Dim cn As ADODB.Connection Set cn = CurrentProject.Connection Dim rs1 As ADODB.Recordset Set rs1 = New ADODB.Recordset Dim sqlstr As String sqlstr = "SELECT * FROM test;" rs1.Open sqlstr, cn, adOpenKeyset, adLockOptimistic しかし、Open処理で、「1つ以上の必要なパラメータの値が設定されていません」 というエラーになってしまいます。 VBAを実行するときに、[Forms]![F_メニュー]![txtNyukinDate]に きちんと値は入力されています。 これを実行する方法はあるでしょうか?

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

    アクセス初心者ですが宜しくお願いします。 アクセス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 実行しますと、フォームには「最後のレコード」しか表示されません。 フォームプロパティの「規定のビュー」は帳票になっています。 よろしくお願いします。

  • VBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更される

    エクセルVBAからaccessへの接続で、RecordsetのCursorTypeが勝手に変更されてしまいます。 Dim rst As New ADODB.Recordset rst.CursorType = adOpenStatic と「adOpenStatic」に設定したいのですが、 Set rst = con.Execute(sql_str, , adCmdText) のようにクエリを実行した直後にCursorTypeを調べると、「adOpenForwardOnly」に変わってしまっています。 (設定直後に調べると、ちゃんとadOpenStaticになっています) 「CursorType」を何に設定しても、Execute直後に「adOpenForwardOnly」になってしまっていまうようです。 CursorTypeをadOpenStaticにして、RecordCountを使いたいのですが、、、 CursorTypeが変わってしまう原因をお知りの方は、教えていただけるとありがたいです。 Dim rst As New ADODB.Recordset Dim con As New ADODB.Connection con.Open "Provider=Microsoft.jet.OLEDB.4.0;" & "Data Source=" & ThisWorkbook.Path & "\" & mdb_file & ";" rst.CursorType = adOpenStatic rst.LockType = adLockReadOnly MsgBox "前 = " & rst.CursorType Set rst = con.Execute(sql_str, , adCmdText) MsgBox "後 = " & rst.CursorType

  • 抽出条件のあるクエリにADOで新規にレコードを追加

    抽出条件のあるクエリにADOで新規にレコードを追加する事は不可能でしょうか? フォーム1にテキスト0を配置し SELECT テーブル1.色 FROM テーブル1 WHERE (((テーブル1.色)=[Forms]![フォーム1]![テキスト0])); というクエリを作成しました。 テーブル1のデータは 色 黄 黒 青 赤 です。 ADOでクエリにデータを追加したいのですが Public Sub Exsample() Dim CN As ADODB.Connection Dim RS As ADODB.Recordset Dim SQL As String Set CN = CurrentProject.Connection Set RS = New ADODB.Recordset SQL = "SELECT * FROM クエリ1" ここの時点で 「実行時エラー:'-2147217904 (80040e10)': 1つ以上の必要なパラメータの値が設定されていません。」 と表示されてしまいます。 「クエリ1」を「テーブル1」にしたらうまくいきます。 だったらテーブルに追加したら?と思われると思いますが 今回は例であり、実際はクエリに追加したいです。 回避方法があれば教えてください。 よろしくお願い致します。 (ヴァージョンはアクセス2003です)

  • ACCESSを活用して商品変動を捉えたい(5再再)

    http://okwave.jp/qa/q8782706.html 上記について標準モジュールも作成して、先のクエリーを実行しましたが、 その際に !コンパイル エラー: ユーザー定義型は定義されていません。 と出ます。 5行目の rst As ADODB.Recordset 箇所が反転されています。 一回でできるのは魅力なのですが、本当に実装できるのでしょうか。 (クエリーはたしかに保存できました) Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function Public Function DBLookup(ByVal strQuerySQL As String, _              Optional ByVal ReturnValue = Null) As Variant On Error GoTo Err_DBLookup   Dim DataValue   Dim rst     As ADODB.Recordset   Set rst = New ADODB.Recordset   With rst     .Open strQuerySQL, _        CurrentProject.Connection, _        adOpenStatic, _        adLockReadOnly     If Not .BOF Then       .MoveFirst       DataValue = .Fields(0)     End If   End With Exit_DBLookup: On Error Resume Next   rst.Close   Set rst = Nothing   DBLookup = IIf(Len(DataValue & ""), DataValue, ReturnValue)   Exit Function Err_DBLookup:   MsgBox "SELECT 文の実行時にエラーが発生しました。(DBLookup)" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & Err.Description & Chr$(13) & _       "・SQL Text=" & strQuerySQL, _       vbExclamation, " 関数エラーメッセージ"   Resume Exit_DBLookup End Function