0

メイン フォーム frm_Main があり、その中にサブフォーム subform_Child があります。メインフォームが表示されると、サブフォームも表示されますが、データが含まれていないため、空白になっています (これはまったく問題ありません)。ユーザーがメイン フォームのボタンをクリックすると、ユーザーがテキスト ボックスに入力した内容に基づいて、コードによって WHERE 句を含む SQL 文字列が作成されます。これまでのところとても良いです、私はこれを以前にやったことがあります。今、私が把握できない部分 (以前に行ったことがないため) は、作成したばかりの SQL を使用してそのサブフォームにデータを入力することです! SQL文字列を作成することは問題ありません.メインフォームからサブフォームを更新し、クエリの実行後にレコードセットを表示するために使用するコードを知るのに十分なAccess VBAを知りません.

編集: QueryDef を使用することは推奨される方法ではないというのは私の理解ですよね?

4

1 に答える 1

0

それがそれをする唯一の方法であるように思われるので、これが私がしたことです。

1)「zqry_PlaceHolder」という名前のクエリを作成しました。私の場合、これは使用されているデータセットです(WHEREのみが変更されます)。これにWHERE句を追加しましたが(WHERE dbo_project.projectid = "_")、メインフォームの表示を遅らせないように何も返さないようにしました。

2)サブフォームで、ソースオブジェクトを先ほど作成したクエリ「Query.zqry_PlaceHolder」に設定します。これは必須です。

3)ユーザーがメインフォームのボタンをクリックすると、VBAコードが実行されます。文字列変数sWhereFilterにWHERE句を作成し、それをSQL文字列に追加します。

'Build SQL string
sSQL = Empty  'Ensure string is empty
sSQL = "SELECT Proj_Locs.ProjectID, dbo_PROJECTS.PROJECTID, Proj_Locs.Location, Master_Scans.FileName, Proj_Locs.Title, dbo_PROJECTS.TITLE" & vbCrLf
sSQL = sSQL & "FROM (tbl_Project_Locations AS Proj_Locs" & vbCrLf
sSQL = sSQL & "    LEFT JOIN dbo_PROJECT AS dbo_PROJECTS ON Proj_Locs.ProjectID = dbo_PROJECTS.PROJECTID)" & vbCrLf
sSQL = sSQL & "    LEFT JOIN tblMasterScans AS Master_Scans ON Proj_Locs.ProjectID = Master_Scans.Project" & vbCrLf
sSQL = sSQL & sWhereFilter
sSQL = sSQL & "ORDER BY Proj_Locs.ProjectID ASC, dbo_PROJECTS.PROJECTID ASC;"

次に、「お待ちください」フォームをスローして、処理中であることをユーザーに通知し、サブフォームのRecordSourceをビルドされたSQL文字列に設定します。

DoCmd.OpenForm "frm_PleaseWait", acNormal
DoCmd.Hourglass True
DoCmd.RepaintObject acForm, "frm_PleaseWait"  'Needed to show everything in the form immediately, otherwise there's a delay
Me.subform_Results.Form.RecordSource = sSQL  'This updates the subform AND executes it, refreshing the results
Beep  'Let user know processing completed
Me.txt_RecordsReturned = Me.subform_Results.Form.Recordset.RecordCount  'Let user know how many records were returned with their query (if any)

これは機能し、プレースホルダークエリ「zqry_PlaceHolder」は変更されません。

私には直感的ではなかったので、これが他の人に役立つことを願っています。別の/より良い方法があれば、私はすべて新しいことを学ぶためです!

于 2012-10-05T22:45:05.170 に答える