Microsoft Access 2013 条件参数查询
Microsoft Access 2013 Conditional Parameter Query
我有一个表单,它使用两个参数来 search/filter 列出可用的案例。共有三个控件:txtCaseFiler、cboClients 和 lstCases。
cboClients 仅显示当前分配给个案的客户列表
lstCases 显示可过滤的案例列表
在 txtCaseFilter 中,我有 VBA 用于重新查询 lstCases 的 onChange 事件和 lstCases 的行源中的以下条件,而在 cboClients 上,我有 VBA 用于相同的 AfterUpdate 事件。
喜欢“”&[表格]![frmCaseSearch]![txtCaseFilter].[文本]&“”
这部分工作正常。
考虑到某人可能想要搜索尚未分配客户的案例,因此希望以一种忽略 cboClient(如果它为空)但仅过滤掉选择一个客户的案例。
我试过这个:Nz([Forms]![frmCaseSearch]![cboClients],[ClientID]) 如果我只是在寻找已分配客户但无法引入任何案例的案例,它可以正常工作没有客户的案例。
这是我目前所拥有的SQL。
SELECT tblCases.CaseNumber, tblCasesClients.ClientID
FROM tblCases LEFT JOIN tblCasesClients ON (tblCases.AgencyID = tblCasesClients.AgencyID) AND (tblCases.CaseNumber = tblCasesClients.CaseNumber)
WHERE (((tblCases.CaseNumber) Like "*" & [FORMS]![frmCaseSearch]![txtCaseFilter].[Text] & "*") AND ((tblCasesClients.ClientID)=Nz([Forms]![frmCaseSearch]![cboClients],[ClientID])))
ORDER BY tblCases.CaseNumber;
如何编写此查询,以便它在 cboClients 为 null 时忽略它,但在它不是 null 时使用它?我考虑的唯一其他选择是将 VBA 函数写入 return 行源字符串,但这似乎有点过分了。
这对你有用吗?
SELECT tblCases.CaseNumber,
tblCasesClients.ClientID
FROM tblCases
LEFT JOIN tblCasesClients
ON (tblCases.AgencyID = tblCasesClients.AgencyID)
AND (tblCases.CaseNumber = tblCasesClients.CaseNumber)
WHERE
tblCases.CaseNumber Like "*" & [FORMS]![frmCaseSearch]![txtCaseFilter].[Text] & "*"
AND (tblCasesClients.ClientID = [Forms]![frmCaseSearch]![cboClients])
or nz([Forms]![frmCaseSearch]![cboClients].[Text],"")="")
ORDER BY tblCases.CaseNumber;
考虑使用 VBA:
动态构建查询
strSQL = "SELECT tblCases.CaseNumber, tblCasesClients.ClientID"
strSQL = strSQL & " FROM tblCases"
strSQL = strSQL & " LEFT JOIN tblCasesClients ON (tblCases.AgencyID = tblCasesClients.AgencyID)"
strSQL = strSQL & " AND (tblCases.CaseNumber = tblCasesClients.CaseNumber)"
strSQL = strSQL & " WHERE (((tblCases.CaseNumber) Like '*" & [Forms]![frmCaseSearch]![txtCaseFilter] & "*')"
If Not IsNull([Forms]![frmCaseSearch]![cboClients]) Then
strSQL = strSQL & " AND ((tblCasesClients.ClientID)=([Forms]![frmCaseSearch]![cboClients])))"
Else
strSQL = strSQL & ")"
End If
strSQL = strSQL & " ORDER BY tblCases.CaseNumber;"
Forms!frmCaseSearch!lstCases.RowSource = strSQL
我有一个表单,它使用两个参数来 search/filter 列出可用的案例。共有三个控件:txtCaseFiler、cboClients 和 lstCases。
cboClients 仅显示当前分配给个案的客户列表
lstCases 显示可过滤的案例列表
在 txtCaseFilter 中,我有 VBA 用于重新查询 lstCases 的 onChange 事件和 lstCases 的行源中的以下条件,而在 cboClients 上,我有 VBA 用于相同的 AfterUpdate 事件。
喜欢“”&[表格]![frmCaseSearch]![txtCaseFilter].[文本]&“”
这部分工作正常。
考虑到某人可能想要搜索尚未分配客户的案例,因此希望以一种忽略 cboClient(如果它为空)但仅过滤掉选择一个客户的案例。
我试过这个:Nz([Forms]![frmCaseSearch]![cboClients],[ClientID]) 如果我只是在寻找已分配客户但无法引入任何案例的案例,它可以正常工作没有客户的案例。
这是我目前所拥有的SQL。
SELECT tblCases.CaseNumber, tblCasesClients.ClientID
FROM tblCases LEFT JOIN tblCasesClients ON (tblCases.AgencyID = tblCasesClients.AgencyID) AND (tblCases.CaseNumber = tblCasesClients.CaseNumber)
WHERE (((tblCases.CaseNumber) Like "*" & [FORMS]![frmCaseSearch]![txtCaseFilter].[Text] & "*") AND ((tblCasesClients.ClientID)=Nz([Forms]![frmCaseSearch]![cboClients],[ClientID])))
ORDER BY tblCases.CaseNumber;
如何编写此查询,以便它在 cboClients 为 null 时忽略它,但在它不是 null 时使用它?我考虑的唯一其他选择是将 VBA 函数写入 return 行源字符串,但这似乎有点过分了。
这对你有用吗?
SELECT tblCases.CaseNumber,
tblCasesClients.ClientID
FROM tblCases
LEFT JOIN tblCasesClients
ON (tblCases.AgencyID = tblCasesClients.AgencyID)
AND (tblCases.CaseNumber = tblCasesClients.CaseNumber)
WHERE
tblCases.CaseNumber Like "*" & [FORMS]![frmCaseSearch]![txtCaseFilter].[Text] & "*"
AND (tblCasesClients.ClientID = [Forms]![frmCaseSearch]![cboClients])
or nz([Forms]![frmCaseSearch]![cboClients].[Text],"")="")
ORDER BY tblCases.CaseNumber;
考虑使用 VBA:
动态构建查询strSQL = "SELECT tblCases.CaseNumber, tblCasesClients.ClientID"
strSQL = strSQL & " FROM tblCases"
strSQL = strSQL & " LEFT JOIN tblCasesClients ON (tblCases.AgencyID = tblCasesClients.AgencyID)"
strSQL = strSQL & " AND (tblCases.CaseNumber = tblCasesClients.CaseNumber)"
strSQL = strSQL & " WHERE (((tblCases.CaseNumber) Like '*" & [Forms]![frmCaseSearch]![txtCaseFilter] & "*')"
If Not IsNull([Forms]![frmCaseSearch]![cboClients]) Then
strSQL = strSQL & " AND ((tblCasesClients.ClientID)=([Forms]![frmCaseSearch]![cboClients])))"
Else
strSQL = strSQL & ")"
End If
strSQL = strSQL & " ORDER BY tblCases.CaseNumber;"
Forms!frmCaseSearch!lstCases.RowSource = strSQL