2015-12-29 113 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