Кнопка поиска по нескольким полям (запрос) Отображение записей с отсутствующими полями или без них

#sql #vba #ms-access

#sql #vba #ms-access

Вопрос:

У меня есть база данных, содержащая только 1 таблицу, в этой таблице более 27 полей, и не все из них будут содержать значение (некоторые будут пустыми). У меня есть кнопка («поисковый сигнал») в форме навигации, которая выполняет поиск по нескольким полям, есть 6 различных полей, по которым пользователь может выполнять поиск, и пользователь может использовать от 1 до 6 критериев одновременно (пожалуйста, смотрите фото). Форма поиска.
Например, я могу выполнять поиск только по имени или по имени и тегу и т.д. и т.д., И я хочу, чтобы отображались все записи, содержащие эти элементы, даже если в этой записи есть некоторые другие отсутствующие поля.

Ниже приведен код, который выполняется при нажатии на кнопку.

 varI = DLookup("Tag", "tblAlarms", "Tag Like '*" amp; Forms![frmHomePage]!inputTag amp; "*'")
varJ = DLookup("Name", "tblAlarms", "Name Like '*" amp; Forms![frmHomePage]!inputName amp; "*'")
varX = DLookup("Plant_Identification_Number", "tblAlarms", "Plant_Identification_Number Like '*" amp; Forms![frmHomePage]!inputPlantID amp; "*'")
varY = DLookup("Priority", "tblAlarms", "Priority Like '*" amp; Forms![frmHomePage]!inputPriority amp; "*'")
varZ = DLookup("Group", "tblAlarms", "Group Like '*" amp; Forms![frmHomePage]!inputGroup amp; "*'")
varK = DLookup("Classification", "tblAlarms", "Classification Like '*" amp; Forms![frmHomePage]!inputClass amp; "*'")

        If Not IsNull(varI) And Not IsNull(varJ) And Not IsNull(varX) And Not IsNull(varY) And Not IsNull(varZ) And Not IsNull(varK) Then
            DoCmd.OpenForm "frmAlarms", acNormal, "", "Tag Like ""*"" amp; [Forms]![frmHomePage]![inputTag] amp; ""*"" and Name Like ""*"" amp; [Forms]![frmHomePage]![inputName] amp; ""*"" and Plant_Identification_Number Like ""*"" amp; Forms![frmHomePage]!inputPlantID amp; ""*"" and Priority Like ""*"" amp; Forms![frmHomePage]!inputPriority amp; ""*"" and Group Like ""*"" amp; Forms![frmHomePage]!inputGroup amp; ""*"" and Classification Like ""*"" amp; Forms![frmHomePage]!inputClass amp; ""*""", acEdit, acNormal
            DoCmd.Close acForm, "frmHomePage", acSaveNo
            Me.Visible = False
        Else
            MsgBox "0 Search Results Were Found!"
            Me.Visible = True
        End If
  

Моя проблема в том, что я не могу запустить запрос / поиск (строка DoCmd.OpenForm), когда в таблицах данных отсутствуют поля.

Я попытался удалить условие ‘If’, чтобы оно выполняло команду независимо от того, отсутствует поле или нет, однако ms access не возвращает никаких записей, если запись не содержит данные во всех полях. Есть ли способ обойти это?

Я подумал о следующем:

  1. Наличие инструкций ‘If’ для выполнения различных запросов в зависимости от введенных данных, но с 6 различными полями для поиска, что составляет 720 различных комбинаций.

  2. Построение строки запроса (строка DoCmd.OpenForm в коде) в зависимости от вводимых данных поиска, но я не могу придумать способ, которым код узнает, когда ставить ‘amp;’ между ними.

  3. Пробовал использовать кнопку просто для запуска запроса, но снова проблема в том, что если в записи отсутствуют поля, эта запись не будет отображаться, даже если критерии поиска совпадают. Например, если я буду искать все записи с тегом = 1234, эти записи будут отображаться только в том случае, если все 27 полей в этой записи содержат значение.

  4. Возможно, можно было бы поместить «n / a» во все пустые поля, но есть ли способ автоматически сделать это? Поскольку в этой базе данных есть часть для ввода пользователя, было бы идеально, если бы она автоматически заполняла пустые поля «n / a» при создании новой записи. Хотя это сделает таблицу / данные немного запутанными, поэтому я предпочел бы обойти поисковый запрос и отсутствующие поля.

Любая помощь была бы высоко оценена! Заранее спасибо.

Ответ №1:

Конкатенация строк неверна. Рассмотрим:

 DoCmd.OpenForm "frmAlarms", acNormal, , "[Tag] LIKE '*" amp; Me.inputTag amp; _
          "*' AND [Name] LIKE '*" amp; Me.inputName amp; _
          "*' AND Plant_Identification_Number LIKE '*" amp; Me.inputPlantID amp; _
          "*' AND Priority LIKE '*" amp; Me.inputPriority amp; _
          "*' AND [Group] LIKE '*" amp; Me.inputGroup amp; _ 
          "*' AND Classification LIKE '*" amp; Me.inputClass amp; *'", acEdit, acNormal
  

LIKE и подстановочный знак не будут работать должным образом в числовом поле.

Обработка пустых (Null) полей в параметрах записи:

  1. вычисление в запросе, который возвращает значение, если поле равно null — идея «N / A» — и применяет критерии фильтрации к этому полю

  2. включение OR Is Null в критерии для каждого поля скобок вокруг обеих частей фразы OR будет иметь решающее значение

Однако, если вы собираетесь использовать VBA для построения строки критериев (в отличие от динамического параметризованного объекта запроса), то, вероятно, лучшим подходом будет условное построение строки. Не включайте критерий, если в текстовом поле нет ввода. Обзор http://allenbrowne.com/ser-62.html

Тег, имя и группа являются зарезервированными словами. Не следует использовать зарезервированные слова в качестве имен, чтобы избежать неожиданных результатов. Включение в [ ] должно разрешиться, но лучше избегать.