Ms Access/SQL带条件动态查询问题:下拉列表行值不匹配
解决Access表单多值查询下拉列表按职位ID匹配候选人的问题
问题背景
在Access中创建了用于生成表单的多值查询,其中[Candidat Nom]列是基于Query 1的下拉列表。当前查询能获取候选人选项,但所有行的下拉列表值完全相同:比如职位ID12对应2位候选人,其余职位各对应1位,但所有职位的下拉列表均显示全部候选人,无法按职位ID匹配对应候选人。
最初的Query 1代码:
SELECT T_SALARIE.SALARIE_nom & " " & T_SALARIE.SALARIE_prenom AS Candidat Nom FROM T_EMPLOI INNER JOIN (T_SALARIE INNER JOIN (T_SALARIE_EMPLOI LEFT JOIN T_STATUT_EMPLOI ON T_SALARIE_EMPLOI.SALARIE_EMPLOI_statut_id = T_STATUT_EMPLOI.STATUT_EMPLOI_id) ON T_SALARIE.SALARIE_NNI = T_SALARIE_EMPLOI.SALARIE_EMPLOI_salarie_nni) ON T_EMPLOI.EMPLOI_identifiant = T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant WHERE (((T_STATUT_EMPLOI.STATUT_EMPLOI_statut) Like "*valid*" Or (T_STATUT_EMPLOI.STATUT_EMPLOI_statut) Like "*décidé*") AND ((T_EMPLOI.EMPLOI_entreprise_id)=1));
尝试添加职位ID匹配条件后,执行查询会弹出弹窗要求输入Job ID,无法自动匹配:
SELECT T_SALARIE.SALARIE_nom & " " & T_SALARIE.SALARIE_prenom AS Candidat, T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant FROM T_EMPLOI INNER JOIN (T_SALARIE INNER JOIN (T_SALARIE_EMPLOI LEFT JOIN T_STATUT_EMPLOI ON T_SALARIE_EMPLOI.SALARIE_EMPLOI_statut_id = T_STATUT_EMPLOI.STATUT_EMPLOI_id) ON T_SALARIE.SALARIE_NNI = T_SALARIE_EMPLOI.SALARIE_EMPLOI_salarie_nni) ON T_EMPLOI.EMPLOI_identifiant = T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant WHERE (((T_STATUT_EMPLOI.STATUT_EMPLOI_statut) Like "*valid*" Or (T_STATUT_EMPLOI.STATUT_EMPLOI_statut) Like "*décidé*") AND ((T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant)=[R_Select_COMOB]![ACTION_identifiant_emploi]));
解决方案
核心是让下拉列表的数据源动态引用当前表单行的职位ID,而非全局参数或无筛选条件。以下是两种可行方法:
方法1:直接在表单控件的Row Source中写入动态SQL
打开表单设计视图,选中[Candidat Nom]控件,在属性表的Row Source中替换为以下SQL:
SELECT T_SALARIE.SALARIE_nom & " " & T_SALARIE.SALARIE_prenom AS Candidat FROM T_EMPLOI INNER JOIN (T_SALARIE INNER JOIN (T_SALARIE_EMPLOI LEFT JOIN T_STATUT_EMPLOI ON T_SALARIE_EMPLOI.SALARIE_EMPLOI_statut_id = T_STATUT_EMPLOI.STATUT_EMPLOI_id) ON T_SALARIE.SALARIE_NNI = T_SALARIE_EMPLOI.SALARIE_EMPLOI_salarie_nni) ON T_EMPLOI.EMPLOI_identifiant = T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant WHERE ( (T_STATUT_EMPLOI.STATUT_EMPLOI_statut Like "*valid*" OR T_STATUT_EMPLOI.STATUT_EMPLOI_statut Like "*décidé*") AND T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant = Forms!R_Select_COMOB!ACTION_identifiant_emploi )
- 这里用
Forms!R_Select_COMOB!ACTION_identifiant_emploi明确指定表单控件路径,Access会直接读取当前表单行的职位ID值,不会弹出参数输入框。 - 确保表单
R_Select_COMOB处于打开状态,且ACTION_identifiant_emploi是绑定到当前记录职位ID的控件。
方法2:创建带表单参数的查询
- 创建新查询,写入以下SQL:
PARAMETERS [Forms]![R_Select_COMOB]![ACTION_identifiant_emploi] Long; -- 根据职位ID字段类型调整 SELECT T_SALARIE.SALARIE_nom & " " & T_SALARIE.SALARIE_prenom AS Candidat FROM T_EMPLOI INNER JOIN (T_SALARIE INNER JOIN (T_SALARIE_EMPLOI LEFT JOIN T_STATUT_EMPLOI ON T_SALARIE_EMPLOI.SALARIE_EMPLOI_statut_id = T_STATUT_EMPLOI.STATUT_EMPLOI_id) ON T_SALARIE.SALARIE_NNI = T_SALARIE_EMPLOI.SALARIE_EMPLOI_salarie_nni) ON T_EMPLOI.EMPLOI_identifiant = T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant WHERE ( (T_STATUT_EMPLOI.STATUT_EMPLOI_statut Like "*valid*" OR T_STATUT_EMPLOI.STATUT_EMPLOI_statut Like "*décidé*") AND T_SALARIE_EMPLOI.SALARIE_EMPLOI_emploi_identifiant = [Forms]![R_Select_COMOB]![ACTION_identifiant_emploi] )
- 将该查询设置为
[Candidat Nom]控件的Row Source。
- 声明参数后,Access会明确识别这是表单控件的引用,而非需要手动输入的参数。
注意事项
- 确保表单控件名称与表字段名称无冲突,避免Access混淆参数和字段。
- 若使用连续表单,下拉列表会自动根据每一行的
ACTION_identifiant_emploi值筛选对应的候选人,因为控件引用的是当前记录的字段值。
内容的提问来源于stack exchange,提问作者Kais
相关产品推荐
相关产品推荐

