2015-12-29 82 views
2

我建立了一个未结合的形式与多个组合框与通过接收到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的函数。

我发现很多资源处理上面,但没有包括如何处理空值表和/或表格条目。

我的目标是让用户通过使用尽可能少的组合框尽可能缩小搜寻范围。理想情况下,表单接受组合框中的空值,将其视为空值,并且不显示该字段的空值表的所有记录。

例如:

  • 形式frmSUPIR [EMP1] = [张三]
  • 形式frmSUPIR [EMP2] = [琼斯,马克]
  • 形式frmSUPIR [!!!!! EMP3] = NULL

我渴望拥有查询返回的所有实例,其中EMP1 =史密斯,约翰 EMP2 =琼斯,马克ANY EMP3的值。什么是最好的方式去做这件事?

希望我是不够清楚,谢谢你提前,

JS

回答

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 

您可以为任意数量的过滤器做到这一点。如果表单中的值为null,它只会在where子句中加上“AND TRUE”。

我删除了你的病情,只创建SQL如果Me.Emp1不是空的,但期望它可以被放回。

+0

谢谢OpiesDad,这似乎让我走上了正轨。运行代码时出现语法错误。特别是运行时间3075.我尝试设置然后= TRUE,=“TRUE”,='“”'。有任何建议吗?我使用:DoCmd.OpenReport “repSUPIR”,acViewPreview,STRSQL打开报表。再次感谢你。 – atomedic

+0

'WHERE'之后缺少一个空格... – Gustav

+0

我会检查最终的SQL字符串,然后尝试在VBA之外运行,以查看是否有任何错误。该错误通常是SQL语法错误。你绝对想要=“真”.....正如我所说,这将使where子句“在哪里x和y和z ....“如果你放入= TRUE,它实际上可能工作(如果VBA自动将布尔转换为字符串),但它不是很好,如果你放入=”“那么你的where子句看起来就像”WHERE x AND AND z“,这肯定不起作用 – OpiesDad

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; 
    } 
} 
+0

这不是VBA。 – OpiesDad