Кнопка поиска в нескольких полях (запрос), показывающая записи с отсутствующими полями или без них - PullRequest
0 голосов
/ 18 марта 2019

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

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

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

        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 ""*"" & [Forms]![frmHomePage]![inputTag] & ""*"" and Name Like ""*"" & [Forms]![frmHomePage]![inputName] & ""*"" and Plant_Identification_Number Like ""*"" & Forms![frmHomePage]!inputPlantID & ""*"" and Priority Like ""*"" & Forms![frmHomePage]!inputPriority & ""*"" and Group Like ""*"" & Forms![frmHomePage]!inputGroup & ""*"" and Classification Like ""*"" & Forms![frmHomePage]!inputClass & ""*""", acEdit, acNormal
            DoCmd.Close acForm, "frmHomePage", acSaveNo
            Me.Visible = False
        Else
            MsgBox "0 Search Results Were Found!"
            Me.Visible = True
        End If

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

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

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

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

  2. Построение строки запроса (строка DoCmd.OpenForm в коде), зависящей от входных данных поиска, но я не могу придумать, как в коде узнать, когда ставить '&' между ними.

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

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

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

1 Ответ

0 голосов
/ 18 марта 2019

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...