【问题标题】:Microsoft access query with IIf使用 IIf 进行 Microsoft 访问查询
【发布时间】:2016-06-07 16:11:27
【问题描述】:

我有一个包含 3 个值的组合框:“是、否、*”。 * 用于表示是和否选项。

在名为服务的字段的条件框中的查询中。 CompletedOn 我已经放置了下面的 IIf 语句:

IIf([Forms]![serviceReportForm]![workcompletedDropdown]="Yes",([service].[CompletedOn]) 不为空,([service].[CompletedOn]) 为空)

我试图确保在组合框中选择“是”时,会显示包含已完成值的任何记录。如果选择否,则不显示,如果选择 *,则显示所有记录。目前,代码根本没有显示任何记录。可以请教吗?

下面的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"));

【问题讨论】:

  • 你能显示你的完整查询吗?看起来您正在尝试制作动态 sql,但 iif 不能那样使用
  • 完整查询?您是指所有其他字段和标准吗?
  • 这个查询肯定比你显示的更多。某处有一个表和列,还有一个完整的 where 子句。把它放在问题中会很有帮助。
  • 有没有办法以可读的格式打印出来?即,一个单一的声明?目前我正在查看查询编辑器,其中有很多包含不同字段和代码位的框,因此很难显示整个查询
  • 您可以在功能区左上角将视图从设计视图更改为 SQL 视图。或者点击整个窗口左下角的SQL。

标签: ms-access


【解决方案1】:

您将 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)

还请注意,我删除了 =,因为您无法使用 = 测试 null,您必须使用 is

选择* 时返回所有记录

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

【讨论】:

  • 谢谢,可以了。在下拉列表中选择“*”的情况下如何使其工作?我想显示所有记录,无论是否完成。
  • @Simon 看到我的编辑。基本上,您需要找到一种方法来消除该字段上的任何过滤器。
【解决方案2】:

这一定与null检查语法和使用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"));

【讨论】:

  • 当我尝试这个时仍然是一个空白报告
  • CompletedOn 是什么样的字段 - 是日期吗?如果您在该字段上运行单独的查询 - 当您在查询中使用 Is Null 时会显示任何内容 - 您应该向我们展示您的完整 SQL(在 View | SQL View 下),否则我们都在猜测您在做什么
  • 这是一个日期。上面添加了完整的 SQL
  • 哇——你有很多 InnerJoins 和 WHERE 子句。您是否首先对您的标准进行了故障排除 - 如果您删除 IIF 子句,您会得到任何结果吗?
  • 是的,没有 IIf 子句,所有工作都按预期工作。但是我无法按已完成的工作进行过滤
猜你喜欢
  • 1970-01-01
  • 2014-05-24
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多