查询显示表,即使未输入某些字段

时间:2013-10-24 13:31:27

标签: sql ms-access jet

我有一个查询和一个表。表的名称是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] & "*"));

2 个答案:

答案 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