我有一个包含3个表( ListOfDevice,DeviceType,Employee )的数据库。
ListOfDevice表
某些记录没有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] & "*"));
答案 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
。
答案 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));
感谢帕菲特先生的出色努力。