2016-06-07 75 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