MS ACCESS: Как отфильтровать отчет, используя поле со списком и критерии запроса - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть база данных с 3 таблицами ( ListOfDevice, DeviceType, Employee ).

ListOfDevice Table

  1. DeviceName
  2. Модель устройства
  3. DeviceType ------> Ссылка на таблицу DeviceType с использованием ID и DeviceType.
  4. EmployeeID ------> Ссылка на таблицу Employeeиспользуя ID и FirstName.
  5. DeviceStatus ------> У этого есть только два значения, Работающее или Поврежденное.

У некоторых записей нет employeeID, и онис пометкой «Поврежден» в поле состояния устройства.

Я создал запрос и назвал его «QryDeviceLists», и внутри этого запроса я импортировал эти 3 таблицы и начал фильтровать результаты запроса и отчета.Я использовал «Нравится» и подстановочный знак для фильтрации.

Пример: Like"*" &[Form]![FormName]![ControlName or Combo box name]&"*"

Здесь я пытаюсь отфильтровать это DeviceType , EmployeeID и DeviceStatus .И способ, которым я хочу, чтобы этот фильтр работал, через поля со списком, у меня есть форма, которую я назвал фильтром, и внутри этой формы есть 3 несвязанных поля со списком, связанных с этими тремя таблицами.И вот как я сгенерирую отчет:

  • Если я выберу значение из комбинированного списка devicetype либо «Рабочий стол, либо ноутбук» и оставлю остальные поля со списком пустыми, тогда это должно дать мнерезультат работы ноутбука или настольного компьютера со всеми пользователями и состоянием устройства, работающего или поврежденного.

  • То же самое для поля со списком EmployeeID , если я выбралимя или идентификатор сотрудника, который должен давать результат конкретного устройства, назначенного специально для этого сотрудника.

  • А для поля со списком состояния устройства он должен давать результат либо работающий, либо поврежденный в зависимости отвыбор из поля со списком.

  • И оставляя все поля со списком пустыми, он должен показывать все записи устройств, будь то ноутбук или настольный компьютер, работающий или поврежденный, назначенный всем сотрудникам.

Вот проблемы, с которыми я сталкиваюсь при попытке извлечь отчет с помощью комбинированных полей.

  • Если я выберу значение из Тип устройства иоставьте идентификатор сотрудника и статус пустым, записи не отображаются.Та же проблема касается поля со списком идентификаторов сотрудников. Если я оставляю тип и состояние устройства пустыми, записи также не отображаются.

  • Если я оставляю все поля со списком пустыми, то только записикоторые помечены как Работа над статусом устройства.Возможно, это связано с тем, что другая запись, помеченная как поврежденная, не имеет значения в поле идентификатора сотрудника.Потому что, когда я попытался поместить значение в поле идентификатора сотрудника и заново сгенерировать запрос, оставив все поля со списком пустыми, все записи отображаются.

Примечание: у меня нетлюбой опыт VBA, и я использую Access 2013-2016

Вот запрос SQL Lines SELECT ListOfDevices.ID, ListOfDevices.DeviceName, ListOfDevices.[Device Model], DeviceType.DeviceType, Employee.FirstName, ListOfDevices.DeviceStatus FROM Employee RIGHT JOIN (DeviceType RIGHT JOIN ListOfDevices ON DeviceType.ID = ListOfDevices.DeviceType) ON Employee.ID = ListOfDevices.EmployeeID WHERE (((DeviceType.DeviceType) Like "*" & [Forms]![filter]![CboDevType] & "*") AND ((Employee.FirstName) Like "*" & [Forms]![filter]![CboEmp] & "*") AND ((ListOfDevices.DeviceStatus) Like "*" & [Forms]![filter]![CboStat] & "*"));

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я нашел решение на другом форуме, о котором не могу упомянуть, потому что не могу, если оно разрешено здесь.Однако вот строка SQL, которую я использую для решения этой проблемы.

SELECT ListOfDevices.ID, ListOfDevices.DeviceName, ListOfDevices.[Device Model], DeviceType.DeviceType, Employee.FirstName, ListOfDevices.DeviceStatus FROM Employee RIGHT JOIN (DeviceType RIGHT JOIN ListOfDevices ON DeviceType.ID = ListOfDevices.DeviceType) ON Employee.ID = ListOfDevices.EmployeeID WHERE ((([DeviceType.DeviceType] Like "*" & [Forms]![filter]![CboDevType] & "*" Or [Forms]![filter]![CboDevType] Is Null)=True) AND (([FirstName]=[Forms]![filter]![CboEmp] Or [Forms]![filter]![CboEmp] Is Null)=True) AND (([DeviceStatus]=[Forms]![filter]![CboStat] Or [Forms]![filter]![CboStat] Is Null)=True));

Спасибо, господин Парфе, за ваши замечательные усилия.

0 голосов
/ 11 февраля 2019

Рассмотрим это решение на чистом SQL с предложениями WHERE, указывающими на комбинированные списки (без выражений LIKE).И если выпадающие списки пусты, NZ() возвращает само поле.VBA не требуется, если отчет / форма привязаны к этому запросу.

QryDeviceLists

SELECT l.ID, l.DeviceName, l.[Device Model], d.DeviceType, e.FirstName, l.DeviceStatus 
FROM Employee e
RIGHT JOIN (DeviceType d
RIGHT JOIN ListOfDevices l ON d.ID = l.DeviceType) 
   ON e.ID = l.EmployeeID 

WHERE ((d.DeviceType) = NZ([Forms]![filter]![CboDevType], d.DeviceType)
   AND (e.ID) = NZ([Forms]![filter]![CboEmp], e.FirstName)
   AND (l.DeviceStatus) = NZ([Forms]![filter]![CboStat], l.DeviceStatus))

    OR     
    (
        IIF([Forms]![filter]![CboDevType] IS NULL, d.DeviceType IS NULL, [Forms]![filter]![CboDevType] = d.DeviceType)
    AND IIF([Forms]![filter]![CboEmp] IS NULL, e.ID IS NULL, [Forms]![filter]![CboEmp] = e.ID)
    AND IIF([Forms]![filter]![CboStat] IS NULL, l.DeviceStatus IS NULL, [Forms]![filter]![CboStat] = l.DeviceStatus)
    )

    OR    
    (
      IIF([Forms]![filter]![CboDevType] IS NULL AND 
          [Forms]![filter]![CboEmp] IS NULL AND
          [Forms]![filter]![CboStat] IS NULL, 

          d.DeviceType IS NULL OR e.ID IS NULL OR l.DeviceStatus IS NULL , 

          [Forms]![filter]![CboDevType] = d.DeviceType OR
          [Forms]![filter]![CboEmp] = e.ID OR
          [Forms]![filter]![CboStat] = l.DeviceStatus)         
    )

Примечания:

  • В зависимости от настроек, возможно, вызов Requery в форме илинеобходим отчет (доступен в виде макрокоманды)

  • Включите в форму кнопку Удалить фильтр , которая использует макрос события SetValue и назначаетдля всех элементов управления значение NULL.

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