2

そのため、正確に 2 つのパラメーターを持つ比較的単純なクエリがあります。そのうちの 1 つはフォームから long を取得し、1 つのフィールドにその値がある単一のテーブルからレコードのみを選択します。(これはデザイン プロジェクトのテーブルであり、ユーザーはプロジェクトを一覧表示するデザイナーを選択しています。)

フォームを開いて手動でクエリを開くと、完全に機能します。2 番目のフォーム (リストボックスにクエリ結果を入力するフォーム) を使用して、クエリ結果と同じレコードセットを設定しようとすると、「実行時エラー '3061'. パラメーターが少なすぎます。1 が必要です.」というエラーが表示されて失敗します。

パラメータを 3 などの静的な整数に設定すると、問題なく動作します (ただし、明らかに役に立ちません)。Access 自体は明らかにできるのに、VBA コードがフォームのテキスト フィールドからテキストを読み取ることができないのはなぜですか?

これが私のクエリです:

SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID
FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1
WHERE ((([Project Request Log TABLE].Designer1)=[Forms]![frm_selectDesigner]![txtDesignerId]) AND (([Project Request Log TABLE].PercentComplete)<>1))
ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority;

エラーが発生する VBA の行は次のとおりです。

  Set rst_projects = dbs.OpenRecordset("qryDesignerProjectPrioritySet", dbOpenDynaset)

ありがとう。

編集: デザイナーを選択したフォームは、上記のコードがレコードセットを開こうとする 2 番目のフォームを開きます。元の frm_selectDesigner は閉じていません。[OK] をクリックすると非表示になりますが、開いたままです。

編集2:行を含める場合

DoCmd.OpenQuery "qryDesignerProjectPrioritySet"

クエリが開き、正しい結果が得られます。次の行でそのクエリの結果を上記のようにレコードセットとして割り当てようとすると、3601 エラーが発生しますか? OpenRecordset コマンドの書き方に何らかのエラーがあるはずですよね?

4

4 に答える 4

0

あまり満足のいく答えではありません。面倒なことをするのではなく、VBA にテキスト フィールドを読み取らせる代わりに、クエリの SQL コードを使用し、(フォーム ラインに基づいて設定される) 変数に代入しました。私の最終的なコードは次のようになります。

designerToPrioritize = Me.designerList.Column(2, Me.designerList.ListIndex + 1)

    queryText = "SELECT [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectName, [Project Request Log TABLE].Manager, [Project Request Log TABLE].SME1, [Project Request Log TABLE].Priority, [Project Request Log TABLE].ProjectID"
    queryText = queryText & vbCrLf & "FROM Designers INNER JOIN [Project Request Log TABLE] ON Designers.ID = [Project Request Log TABLE].Designer1"
    queryText = queryText & vbCrLf & "WHERE ((([Project Request Log TABLE].Designer1)=" & **designerToPrioritize** & " AND (([Project Request Log TABLE].PercentComplete)<1)))"
    queryText = queryText & vbCrLf & "ORDER BY [Project Request Log TABLE].Designer1, [Project Request Log TABLE].Priority;"
'That should recreate my original query. Let's see how it works.
        Set rst_projects = dbs.OpenRecordset(queryText, dbOpenDynaset)

これで問題なく動作するので、別の方法を探すことにこれ以上努力するつもりはありません。今後数日以内に誰も素晴らしい回答を投稿しない場合は、この質問に回答済みのマークを付けます。これを解決するのを助けてくれたみんなに感謝します。

于 2013-04-29T14:47:54.570 に答える
0

クエリ条件をコードに入れることで、実行時エラー '3061' を回避することができました。Query1 の SQL は次のようになりました。

SELECT * FROM tbl1 WHERE field1=[Forms]![form1]![txt1]

コード:

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("Query1")

実行時エラー「3061」がトリガーされました。query2 を次のように書きました。

SELECT * FROM tbl1

コードを次のように変更しました。

dim txt1 as string
txt1=[Forms]![form1]![txt1]"
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("SELECT * FROM Query2 WHERE field1=" & txt1)

そしてそれはうまくいきました。

于 2015-10-19T17:49:57.013 に答える