Добавить опцию «Все» в ComboBox, используемый для фильтрации отчетов в MS Access - PullRequest
2 голосов
/ 05 ноября 2010

Я пытаюсь следовать примеру Microsoft о том, как добавить опцию «Все» в ComboBox в Microsoft Access, но их статья не обеспечивает адекватную работу по предоставлению руководства, за исключением указания код.

Я пытаюсь создать форму, которая позволяет пользователю выбирать параметр в ComboBox (параметры создаются из записей в таблице), а затем создавать отчет, отфильтрованный на основе выбранного параметра. ComboBox состоит из 2 столбцов: первичный ключ / идентификатор записей и их отображаемые имена.

Я не могу понять код VBA, который Microsoft предоставляет достаточно, чтобы выяснить, что происходит, но я бы хотел, чтобы опция «Все» в моем ComboBox имела либо пустой первичный ключ / идентификатор, либо тот, который = 0. Это не так, поскольку выбор опции «Все» при использовании формы приводит к сообщению об ошибке «Введенное вами значение недопустимо для этого поля». Это наводит меня на мысль, что текст «Все» заполняется в столбец первичного ключа / идентификатора вместо столбца отображения. В примере показано, как назначить номер отображаемого столбца в качестве свойства «Tag» ComboBox, и в этом случае мой номер отображаемого столбца равен 2. Однако это (и в значительной степени любое другое добавленное мной значение) приводит к вышеупомянутой ошибке сообщение.

Есть идеи, применим ли пример Microsoft к моему случаю, или мне нужно как-то скорректировать их код?

1 Ответ

4 голосов
/ 05 ноября 2010

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

Допустим, что источником строки вашего комбо является запрос, подобный следующему:

SELECT id, disp_name
FROM YourTable
ORDER BY disp_name;

Вы можете добавить строку «all» с запросом UNION:

SELECT id, disp_name
FROM YourTable
UNION ALL
SELECT TOP 1 0, "**ALL**"
FROM AnyTable
ORDER BY disp_name;

AnyTable canбудь только этим.Если у вас есть таблица, которая содержит только одну строку, используйте эту ... и вам даже не понадобится часть TOP 1 .Просто попробуйте не использовать ReallyBigTable в качестве AnyTable.

Редактировать : На самом деле некоторый ReallyBigTable может подойти, если у него есть первичный ключ или другое уникальное поле, которое можно использовать в выражении WHERE для извлеченияодна строка:

SELECT id, disp_name
FROM YourTable
UNION ALL
SELECT 0, "**ALL**"
FROM ReallyBigTable
WHERE pk_field = 1
ORDER BY disp_name;

UNION ALL вернет все объединенные строки.Если у вас есть повторяющиеся строки, вы можете уменьшить их, используя UNION вместо UNION ALL.

...