1

クエリとテーブルがあります。テーブルの名前は 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] & "*"));
4

2 に答える 2

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; and CustomerName.)

についても同じですOrderName

このアプローチが扱いにくい、または理解しにくい場合は、VBA コードを使用してWHERE、値を含むテキスト ボックスに基づいて実行時に句を作成できます。

于 2013-10-24T14:01:20.080 に答える
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
于 2013-10-24T14:09:11.257 に答える