2016-06-07 113 views
1

我有一個組合框有3個值:「是,否,*」。 *旨在代表是和否選項。Microsoft訪問查詢與IIf

在名爲service的字段的條件框內的查詢中。 CompletedOn我已經放置了下面的IIf語句:

IIf([Forms]![serviceReportForm]![workcompletedDropdown] =「Yes」,([service]。[CompletedOn])不爲空([service]。[ CompletedOn])是空)

我想確保在組合框中選擇是時,顯示任何包含完成的值的記錄。如果選擇no,則不顯示,如果選擇*,則顯示所有記錄。目前代碼根本沒有顯示任何記錄。您能否提一些建議?

SQL低於

SELECT customer.CustomerID, 
customer.[Customer Name], 
Equipment.Description, 
Equipment.PurchaseID, 
service.Date, 
service.Fault, 
service.JobNo, 
service.costOfRepair, 
service.ServiceID, 
service.CompletedOn, 
CalloutUrgency.CalloutDescription, 
CalloutUrgency.CalloutUrgencyID, 
service.AgentID, 
agent.Serviceagentname, 
supplier.supplierID, 
supplier.supplierName, 
Equipment.ManufacturerID, 
Manufacturer.[Manufacturer Name] 
FROM Manufacturer 
INNER JOIN ((customer 
INNER JOIN (supplier 
INNER JOIN Equipment 
    ON supplier.supplierID = Equipment.SupplierID) 
    ON customer.CustomerID = Equipment.CustomerID) 
INNER JOIN (agent 
INNER JOIN (CalloutUrgency 
INNER JOIN service 
    ON CalloutUrgency.CalloutUrgencyID = service.CalloutUrgencyID) 
    ON agent.AgentID = service.AgentID) 
    ON Equipment.EquipmentID = service.EquipmentID) 
    ON Manufacturer.ManufacturerID = Equipment.ManufacturerID 
WHERE (((customer.[Customer Name]) Like [Forms]![ServiceReportForm]![houseDropdown]) 
AND ((service.Date) Between [Forms]![ServiceReportForm].[fromDate] And [Forms]![ServiceReportForm].[toDate]) 
AND ((service.CompletedOn)=IIf([Forms]![ServiceReportForm]![workcompletedDropdown]="Yes",Not Null,Null)) 
AND ((CalloutUrgency.CalloutDescription) Like [Forms]![ServiceReportForm]![urgencyDropdown]) 
AND ((agent.Serviceagentname) Like [Forms]![ServiceReportForm]![serviceagentDropdown]) 
AND ((supplier.supplierName) Like [Forms]![ServiceReportForm]![supplierDropdown])) 
    OR (((service.Date) Between [Forms]![ServiceReportForm].[fromDate] And [Forms]![ServiceReportForm].[toDate]) 
    AND (([Forms]![ServiceReportForm])=" All")); 
+0

你能告訴你的完整的查詢?它看起來像你正在試圖使動態SQL,但iif不能像那樣使用 – Brad

+0

完整的查詢?你的意思是所有其他領域和標準? – Simon

+0

當然,這個查詢比您所展示的還要多。有一個表和列的某個地方和一個完整的where子句。把這個問題放在這個問題上會非常有幫助。 – Brad

回答

2

您正在處理IIF功能,就好像它正在返回一個字符串,然後將其插入到您的查詢中,然後執行查詢。但是,這不是處理事物的順序。 IIF應該返回一個檢查值或一個布爾值本身。更換此

((service.CompletedOn)=IIf([Forms]![ServiceReportForm]![workcompletedDropdown]="Yes",Not Null,Null)) 

與此

IIf([Forms]![ServiceReportForm]![workcompletedDropdown]="Yes",service.CompletedOn is Not Null,service.CompletedOn is Null) 

注意過,我擺脫了=的,因爲你不能測試使用=空,則必須使用is

返回所有記錄時*選擇

IIF([Forms]![ServiceReportForm]![workcompletedDropdown] = "*" 
    ,True 
    , IIf([Forms]![ServiceReportForm]![workcompletedDropdown]="Yes" 
    ,service.CompletedOn is Not Null 
    ,service.CompletedOn is Null)) 
+0

謝謝,這很奏效。如何在下拉菜單中選擇「*」的情況下工作?我想顯示所有記錄是否已完成。 – Simon

+0

@Simon看我的編輯。基本上你需要找到一種方法來消除該領域的任何過濾器。 – Brad

0

它必須有事情做與空檢查語法和使用IIF

在SQL

((service.CompletedOn)=IIf([Forms]![ServiceReportForm]![workcompletedDropdown]="Yes",Not Null,Null))

替換此有了這個

((service.CompletedOn Is Not Null) AND ([Forms]![ServiceReportForm]![workcompletedDropdown]="Yes")) OR ((service.CompletedOn Is Null) AND ([Forms]![ServiceReportForm]![workcompletedDropdown]<>"Yes"));

+0

當我嘗試此操作時,仍然是空白報告 – Simon

+0

CompletedOn是什麼類型的 - 是日期嗎?如果您在該字段上運行單獨的查詢 - 在查詢中使用Is Null時是否顯示任何內容 - 您應向我們展示完整的SQL(在View | SQL View下),否則我們都在猜測您正在做什麼 – dbmitch

+0

這是一個日期。在上面添加完整的SQL – Simon