我有一个查询和一个表。表的名称是OrderT,而查询的名称是SearchQ。查询就在那里,所以我可以让子表单显示表单上的搜索结果。虽然我的查询在表格中没有显示任何字段中的任何数据。例如,如果我有CustomerName,OrderNumber和OrderDueDate字段,我填写CustomerName,OrderNumber但是将OrderDueDate留空;查询不会显示它存在,因此搜索无法获取它。
如果查询显示表格中的所有内容,即使某些字段未填写,我将如何进行查询?
查询的SQL:
SELECT OrderT.CustomerName, OrderT.OrderName, OrderT.OrderDesc, OrderT.DateOfPurchase, OrderT.ProjectDueDate, OrderT.EngineerDueDate, OrderT.ProjectComplete, OrderT.CutplanDueDate, OrderT.MaterialSpecs, OrderT.CutplanCode, OrderT.HardwareSpecs, OrderT.HardwareDueDate, OrderT.HardwareComplete, OrderT.PurchaseOrder, OrderT.PurchaseSupplier
FROM OrderT
WHERE (((OrderT.CustomerName) Like "*" & [Forms]![SearchF]![CustomerName] & "*") AND ((OrderT.OrderName) Like "*" & [Forms]![SearchF]![OrderName] & "*") AND ((OrderT.OrderDesc) Like "*" & [Forms]![SearchF]![OrderDesc] & "*") AND ((OrderT.DateOfPurchase) Like "*" & [Forms]![SearchF]![DateOfPurchase] & "*") AND ((OrderT.ProjectDueDate) Like "*" & [Forms]![SearchF]![ProjectDueDate] & "*") AND ((OrderT.EngineerDueDate) Like "*" & [Forms]![SearchF]![EngineerDueDate] & "*") AND ((OrderT.ProjectComplete) Like "*" & [Forms]![SearchF]![ProjectComplete] & "*") AND ((OrderT.CutplanDueDate) Like "*" & [Forms]![SearchF]![CutplanDueDate] & "*") AND ((OrderT.MaterialSpecs) Like "*" & [Forms]![SearchF]![MaterialSpecs] & "*") AND ((OrderT.CutplanCode) Like "*" & [Forms]![SearchF]![CutplanCode] & "*") AND ((OrderT.HardwareSpecs) Like "*" & [Forms]![SearchF]![HardwareSpecs] & "*") AND ((OrderT.HardwareDueDate) Like "*" & [Forms]![SearchF]![HardwareDueDate] & "*") AND ((OrderT.HardwareComplete) Like "*" & [Forms]![SearchF]![HardwareComplete] & "*") AND ((OrderT.PurchaseOrder) Like "*" & [Forms]![SearchF]![PurchaseOrder] & "*") AND ((OrderT.PurchaseSupplier) Like "*" & [Forms]![SearchF]![PurchaseSupplier] & "*"));
答案 0 :(得分:2)
创建一个更简单的测试用例并计算出那里的逻辑。
SELECT
o.CustomerName,
o.OrderName
FROM OrderT AS o
WHERE
(
o.CustomerName Like "*" & [Forms]![SearchF]![CustomerName] & "*"
OR [Forms]![SearchF]![CustomerName] Is Null
)
AND
(
o.OrderName Like "*" & [Forms]![SearchF]![OrderName] & "*"
OR [Forms]![SearchF]![OrderName] Is Null
);
在CustomerName
文本框中输入值时,该查询将仅返回CustomerName
字段包含该文本框值的行。如果在文本框中未输入任何值,则查询不会根据CustomerName
字段值排除任何行。 (我发现通过为文本框提供与字段不同的名称来更容易保持这一点:txtCustomerName
;以及CustomerName
。)
OrderName
相同。
如果这种方法不实用或难以理解,您可以使用VBA代码在运行时根据包含值的文本框构造WHERE
子句。
答案 1 :(得分:0)
实际上这是一种更好的方法,但它更像是一种中级知识水平(不确定你是否在那里)。实际上,您应该遍历控件并检查每个控件是否为NULL值,并且您最终会得到一个WHERE子句,该子句只包含实际上具有值的控件。上面的问题是当你有一个NULL时,它会说
((MyField) LIKE "*NULL*")
因为它在AND语句中,所以它会跳过那一行。你需要这样的东西:
Dim sSQL as String
Dim ctl As Control
sSQL = "SELECT OrderT.CustomerName, OrderT.OrderName, OrderT.OrderDesc, OrderT.DateOfPurchase, OrderT.ProjectDueDate, OrderT.EngineerDueDate, OrderT.ProjectComplete, OrderT.CutplanDueDate, OrderT.MaterialSpecs, OrderT.CutplanCode, OrderT.HardwareSpecs, OrderT.HardwareDueDate, OrderT.HardwareComplete, OrderT.PurchaseOrder, OrderT.PurchaseSupplier
FROM OrderT
WHERE ("
For Each ctl In frm
If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox _
Or ctl.ControlType = acListBox Then
If Len(Trim(ctl.Value)) > 0 Then
sSQL = sSQL & "((OrderT." & ctl.Name & ") Like "*" & [Forms]![SearchF]![" & ctl.Name & "] & "*") AND "
End If
End If
Next ctl
sSQL = Left(sSQL, Len(sSQL)-4)
sSQL = sSQL & ");"
DoCmd.RunSQL sSQL