MS ACCESS:如何使用组合框和查询条件过滤报告

时间:2019-02-11 14:25:41

标签: forms ms-access access-vba

我有一个包含3个表( ListOfDevice,DeviceType,Employee )的数据库。

ListOfDevice表

  1. DeviceName
  2. 设备型号
  3. DeviceType ------>使用ID和ID引用到DeviceType表                     设备类型。
  4. EmployeeID ------>使用ID和名字引用到Employee表。
  5. DeviceStatus ------>这只有两个值“工作”或“损坏”。

某些记录没有employeeID,并且那些记录在设备状态字段上标记为“损坏”。

我创建了一个查询并将其命名为“ QryDeviceLists”,并在该查询中导入了这3个表,并开始为查询和报告结果进行过滤。我使用“喜欢”和通配符进行过滤。

示例:Like"*" &[Form]![FormName]![ControlName or Combo box name]&"*"

我要在此处过滤的是 DeviceType EmployeeID DeviceStatus 。我希望此过滤器工作的方式是通过组合框,我有一个名为过滤器的表单,该表单内部是3个未绑定的组合框,它们链接到这3个表。这是我将如何生成报告的方法:

  • 如果我从设备类型组合框中选择一个值,则为“台式机或笔记本电脑” 然后将其他组合框留空,它应该给我以下结果: 具有所有用户和设备状态的笔记本电脑或台式机 工作或损坏。

  • EmployeeID 组合框相同,如果我选择了姓名或员工ID,则应给出专门为该员工分配的特定设备的结果。

    li>
  • 对于设备状态组合框,根据组合框中的选择,结果应该为工作或损坏。

  • 并且通过将所有组合框保留为空白,它应该显示设备的所有记录,无论是笔记本电脑还是台式机,工作中的或损坏的,都分配给所有员工。

这是我尝试使用组合框提取报表时遇到的问题。

  • 如果我从“设备类型”中选择一个值并留下员工ID 和状态为空白,没有记录显示。同样的问题 员工ID组合框,如果我将设备类型和状态保留为 空白,也没有记录显示。

  • 如果我将所有组合框都留空,那么只有记录 显示为“正在处理设备状态”的标签。这也许是 因为其他记录为“已损坏”的记录对 员工ID字段。因为当我尝试在 员工ID字段,并保留所有组合以重新生成查询 框为空,然后显示所有记录。

注意:我没有任何VBA经验,我正在使用Access 2013-2016

以下是查询SQL行SELECT ListOfDevices.ID, ListOfDevices.DeviceName, ListOfDevices.[Device Model], DeviceType.DeviceType, Employee.FirstName, ListOfDevices.DeviceStatus FROM Employee RIGHT JOIN (DeviceType RIGHT JOIN ListOfDevices ON DeviceType.ID = ListOfDevices.DeviceType) ON Employee.ID = ListOfDevices.EmployeeID WHERE (((DeviceType.DeviceType) Like "*" & [Forms]![filter]![CboDevType] & "*") AND ((Employee.FirstName) Like "*" & [Forms]![filter]![CboEmp] & "*") AND ((ListOfDevices.DeviceStatus) Like "*" & [Forms]![filter]![CboStat] & "*"));

2 个答案:

答案 0 :(得分:0)

考虑使用带有指向组合框的WHERE子句(无LIKE表达式)的纯SQL解决方案。如果组合框为空,则NZ()将返回字段本身。如果报表/表单绑定到此查询,则不需要VBA。

QryDeviceLists

SELECT l.ID, l.DeviceName, l.[Device Model], d.DeviceType, e.FirstName, l.DeviceStatus 
FROM Employee e
RIGHT JOIN (DeviceType d
RIGHT JOIN ListOfDevices l ON d.ID = l.DeviceType) 
   ON e.ID = l.EmployeeID 

WHERE ((d.DeviceType) = NZ([Forms]![filter]![CboDevType], d.DeviceType)
   AND (e.ID) = NZ([Forms]![filter]![CboEmp], e.FirstName)
   AND (l.DeviceStatus) = NZ([Forms]![filter]![CboStat], l.DeviceStatus))

    OR     
    (
        IIF([Forms]![filter]![CboDevType] IS NULL, d.DeviceType IS NULL, [Forms]![filter]![CboDevType] = d.DeviceType)
    AND IIF([Forms]![filter]![CboEmp] IS NULL, e.ID IS NULL, [Forms]![filter]![CboEmp] = e.ID)
    AND IIF([Forms]![filter]![CboStat] IS NULL, l.DeviceStatus IS NULL, [Forms]![filter]![CboStat] = l.DeviceStatus)
    )

    OR    
    (
      IIF([Forms]![filter]![CboDevType] IS NULL AND 
          [Forms]![filter]![CboEmp] IS NULL AND
          [Forms]![filter]![CboStat] IS NULL, 

          d.DeviceType IS NULL OR e.ID IS NULL OR l.DeviceStatus IS NULL , 

          [Forms]![filter]![CboDevType] = d.DeviceType OR
          [Forms]![filter]![CboEmp] = e.ID OR
          [Forms]![filter]![CboStat] = l.DeviceStatus)         
    )

注意:

  • 取决于您的设置,可能需要在表单或报表上进行Requery调用(作为宏命令可用)

  • 在表单上添加一个删除过滤器按钮,该按钮使用SetValue宏事件并将所有值分配给NULL

    li>

答案 1 :(得分:0)

我在其他论坛上找到了一个解决方案,我无法提及,因为如果这里允许,我就不会。但是,这是我用来解决此问题的SQL Line。

SELECT ListOfDevices.ID, ListOfDevices.DeviceName, ListOfDevices.[Device Model], DeviceType.DeviceType, Employee.FirstName, ListOfDevices.DeviceStatus FROM Employee RIGHT JOIN (DeviceType RIGHT JOIN ListOfDevices ON DeviceType.ID = ListOfDevices.DeviceType) ON Employee.ID = ListOfDevices.EmployeeID WHERE ((([DeviceType.DeviceType] Like "*" & [Forms]![filter]![CboDevType] & "*" Or [Forms]![filter]![CboDevType] Is Null)=True) AND (([FirstName]=[Forms]![filter]![CboEmp] Or [Forms]![filter]![CboEmp] Is Null)=True) AND (([DeviceStatus]=[Forms]![filter]![CboStat] Or [Forms]![filter]![CboStat] Is Null)=True));

感谢帕菲特先生的出色努力。