2013-10-24 2 views
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] & "*")); 
+0

Пожалуйста, покажите нам запрос SQL. Я никогда не слышал ничего подобного, если нет предложения join или WHERE, которое исключает записи на основе заданного поля. –

+0

Там, OP отредактирован. – D347HxD

+0

Значения полей не указываются в таблице или форме поиска? – 4dmonster

ответ

1

Создание простой тест, и выработать логику там.

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 во время выполнения на основе тех текстовых полей, которые включают значение.

+0

Благодарим вас за помощь и быстрый ответ! Огромная благодарность, и я должен вам мир. Надеюсь, если вам понадобится помощь в будущем, вы получите это так быстро, как вы мне помогли, вы этого заслужили! – D347HxD

0

На самом деле есть лучший способ сделать это, но это более средний уровень знаний (не уверен, что вы там или нет). Фактически вы должны прокручивать элементы управления и проверять каждый из них на значения NULL, и вы получите предложение WHERE, которое имеет только элементы управления, которые фактически имеют значения в них. Проблема в том, что выше, когда у вас есть NULL, это говорит

((MyField) LIKE "*NULL*") 

и так как это в элемент И заявление, что собирается пропустить эту строку. Вам понадобится примерно следующее:

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 
+0

Я был посреди публикации этого бегемота, когда HansUp отправил свой ответ, и его, вероятно, лучше, но я оставлю это здесь на всякий случай. Вы действительно должны ограничить, какие поля могут выполнять люди, или создать форму поиска, где люди могут выбрать один или два критерия из раскрывающегося списка и только поиск по этим критериям. –

+0

Я использовал HansUp, и он работает безупречно. Я открыто признаю, что я определенно не на промежуточном уровне знаний SQL, Access или что-либо действительно в Access.Хотя я знаю понимание новичков, и с этим мне удалось завершить 99% базы данных, над которой я работаю! Спасибо за попытку, и загрузите быстрый ответ. Вы не понимаете, насколько я благодарен вам и HansUp! Большая любовь. – D347HxD

Смежные вопросы