我构建了一个带有多个组合框的未绑定表单,目的是将收到的参数传递给SQL查询。当所有字段都包含值时,我的SQL工作,但当一个为空时,整个查询失败。我已将每个字段的where子句设置为各自的(tblIRS.[Field]=Forms!frmSUPIR![Field] OR Forms!frmSUPIR![Field] IS NULL OR tblIRS.[Field] IS NULL) AND (...
我还尝试将未绑定的值从变量传递到变量,然后在VBA中构造SQL也无济于事。每个字段的在线类似于以下内容:
Dim strFilter As String
Dim strSQL As String
If Nz(Me.EMP1, "") <> "" Then
strFilter = strFilter & "tblIRS.[EMP1] = '" & PQ(Me.txtEMP1) & "' And " ...
strSQL = "SELECT * FROM tblIRS " & _
"WHERE" & strFilter
End If
以上内容包括替换PQ的功能。
我找到了许多资源来处理上述内容但没有包含如何处理空表值和/或表单条目的资源。
我的目标是让用户使用尽可能少的组合框缩小搜索范围。理想情况下,表单将接受组合框中的空值以视为null,并且不显示该字段具有空表值的所有记录。
例如:
我希望让查询返回EMP3的所有实例,其中EMP3为EMP3,约翰 AND EMP2 =琼斯,标记 AND ANY 。最好的方法是什么?
希望我很清楚,并提前感谢你,
JS
答案 0 :(得分:1)
实现此目的的一种简单方法是为where子句的每个部分创建一个不同的变量:
Dim strWhereEmp1 As String
Dim strWhereEmp2 As String
Dim strWhereEmp3 As String
Dim strFilter As String
If IsNull(Me.EMP1) Then /*Or use If Nz(Me.Emp1, "") = "" if you wish*/
strWhereEmp1 = "TRUE"
Else
strWhereEmp1 = "tblIRS.[EMP1] = '" & Me.Emp1 & "'"
End If
If IsNull(Me.EMP2) Then
strWhereEmp2 = "TRUE"
Else
strWhereEmp2 = "tblIRS.[EMP2] = '" & Me.Emp2 & "'"
End If
If IsNull(Me.EMP3) Then
strWhereEmp3 = "TRUE"
Else
strWhereEmp3 = "tblIRS.[EMP3] = '" & Me.Emp3 & "'"
End If
strFilter = strWhereEmp1 " AND " & strWhereEmp2 & _
" AND " & strWhereEMp3
strSQL = "SELECT * FROM tblIRS " & _
"WHERE " & strFilter
您可以为任意数量的过滤器执行此操作。它只会贴上&#34;和真#34;如果表单中的值为null,则返回where子句。
如果Me.Emp1不为空,我删除了你的条件只创建SQL,但可以根据需要放回。
答案 1 :(得分:0)
这是一个用于创建WHERE子句的小型控制台应用程序和方法。您不必担心结果where子句中的EMP3,因为任何值都是可接受的。
class Program
{
static void Main(string[] args)
{
var dict = new Dictionary<string, string>()
{
{ "EMP1", "Smith, John" },
{ "EMP2", "Jones, Mark" },
{ "EMP3", "" } //This could be null and it would still work
};
Console.WriteLine(CreateWhereClause(dict));
Console.ReadKey();
}
public static string CreateWhereClause(Dictionary<string, string> keyValues)
{
var result = "WHERE ";
//Ignore blank values using lamda
foreach (var kvPair in keyValues.Where(kvp => !String.IsNullOrWhiteSpace(kvp.Value)))
{
//If we've already added a clause, add an AND
if (result.Length > 6)
result += " AND ";
result += String.Format(@"tblIRS.[{0}] = '{1}'", kvPair.Key, kvPair.Value);
}
return result;
}
}