Access передача параметров в запрос

4 JPM [2010-05-15 07:39:00]

Я хотел бы знать, есть ли способ установить параметры в запросе Access 2007 с помощью VBA. Я новичок в использовании VBA в Access, и мне было поручено добавить немного функциональности в существующее приложение.

Проблема, с которой я сталкиваюсь, заключается в том, что тот же отчет можно вызвать в двух разных местах приложения. Первый — на кнопке команды в форме ввода данных, другой — на кнопке коммутатора. Сам отчет основан на запросе параметра, который требует от пользователя ввода идентификатора поставщика.

Пользователь не хочет вводить идентификатор поставщика в форме ввода данных (поскольку форма уже отображает идентификатор поставщика), но из коммутатора им будет предложено ввести идентификатор поставщика.

Где я застрял — как вызвать запрос отчета (в открывшемся событии отчета) и передать RequestID из формы в качестве параметра. Я пытался какое-то время, и я не могу заставить что-то работать правильно. Вот мой код до сих пор, но я явно смущен.

Private Sub Report_Open (Отменить как целое)

Я пробовал Me.Supplier >

ПАРАМЕТРЫ [Enter Supplier] Long; SELECT Suppliers.Supplier >

Я знаю, что есть способы обойти эту проблему (и, вероятно, простой способ), но, как я уже сказал, мой недостаток опыта использования Access и VBA осложняет ситуацию. Если бы кто-нибудь из вас мог помочь, это было бы здорово!

parameters ms-access report

2 ответа

Предлагаемое предложение — 100% УДАЛИТЬ параметр из запроса. Это не только решает вашу проблему, но и означает, что вы можете использовать запрос для кода, других форм и не разваливать весь дизайн, потому что одна глупая форма не открыта (следовательно, ОЧЕНЬ причина вашего вопроса).

Итак, удалите параметры из запроса. Это также означает, что вашему отчету теперь не потребуется какая-то форма, которая уже открыта. И снова, если какая-то глупая форма не открывается, почему ваш отчет не работает?

Итак, удалите параметр. Теперь, в вашей форме, которая открывает отчет, он может передать фильтр, а больше использовать то, что называется предложением "where". Это предложение "where" разработано в MS-доступе, чтобы решить проблему того, что нужно заранее знать, какие параметры и фильтры вам нужны. Это происходит во время выполнения, и поэтому МНОГИЕ РАЗНЫЕ формы могут вызывать и открывать этот отчет.

Теперь в форме, которая вызывает и открывает форму, вы идете:

Итак, в приведенном выше примере параметр создается "на лету". Большим преимуществом является то, что завтра вы можете иметь другую форму, открыть тот же отчет и, возможно, фильтровать по регионам.

В случае передачи предложения NO where и пользователя, просто открывающего форму, никакие фильтры не будут использоваться, и никаких запросов не будет, и все записи будут отображаться. Это, вероятно, ваш лучший подход.

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

Тем не менее, я бы действительно старался избегать жесткого кодирования некоторого глупого имени формы в открывшемся событии отчетов. Это не только означает, что ваши жесткие кодировки зависят от какой-то глупой формы, которая теперь привязана к отчету, но если вы позже скопируете этот отчет или даже скопируете оригинальную форму (или даже переименуете любой из этих объектов), тогда вам придется заходите в приложение и охотитесь за и теперь находите места, где вы как разработчик вносили зависимости. Такой подход может существенно увеличить затраты на обслуживание приложения и, следовательно, следует рекомендовать.

Итак, предложение здесь — сбросить запрос параметра. Просто создайте форму или какую-нибудь оперативную систему для запуска отчетов. Эти формы должны запрашивать у пользователя информацию, которую вы хотите фильтровать. Или, как в вашем случае, связанная форма и текущая запись предоставляют эту информацию. Красота этой системы теперь не отражается на отчете.

Любая форма, или даже любой код в дороге, может свободно передавать pramaeter, и он не будет ограничен ProviderID, но может быть любым типом фильтра или параметра, который вы хотите.

Имейте в виду, что, возможно, пользователь может не захотеть открывать эту форму и, возможно, не хочет приглашения. С вашим дизайном и вопросом пользователь будет вынужден вводить значение параметра даже при запуске отчета без каких-либо открытых форм и не желая, чтобы ему было предложено разрешить им просматривать все реордсы в этом отчете.

Как я изложил в недавнем сообщении, я стараюсь никогда не устанавливать какие-либо параметры или создавать контрольные ссылки в источниках отчетов или форм. Вместо этого я устанавливаю их во время выполнения. Самый простой способ — передать свойство WhereCondition в DoCmd.OpenForm/DoCmd.OpenReport:

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

Читайте также:  1С своя нумерация документов

Более сложным является использование события OnOpen отчета для установки источника отчетов. Это то, что я изложил в приведенном выше сообщении. Но этот пример затрудняет выбор формы выбора, тогда как вы можете вместо этого предлагать различные варианты выбора в зависимости от контекста. Есть два способа справиться с этим:

если A2003 и более поздние версии, передайте OpenArg (последний параметр DoCmd.OpenReport), чтобы сообщить событию OnOpen, что делать, чтобы собирать информацию о том, что фильтровать.

используйте внешнюю структуру, такую ​​как автономный класс, чтобы хранить критерии, которые событие OnOpen будет читать и действовать соответственно.

Если вам необходимо, чтобы запрос в Access при запуске каждый раз предлагал ввести параметры, создайте запрос с параметрами.

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

В этой статье

Обзор

С помощью условий в запросе с параметрами в Access можно ограничить набор записей, возвращаемых запросом. Функциональности диалоговых окон в запросе с параметрами может оказаться недостаточно. В этом случае можно создать форму, которая лучше подойдет для ввода параметров в вашей ситуации. В этой статье рассказывается, как настроить форму для ввода параметров запросов и отчетов. Здесь предполагается, что вы уже знакомы с принципами создания запросов и определения параметров в них. Прежде чем продолжать, ознакомьтесь как минимум с процедурой создания запроса на выборку.

В этой статье приведены примеры использования параметров в запросах. Она не содержит полной справочной информации о настройке условий.

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

Дополнительные сведения о запросах в целом см. в статье Знакомство с запросами.

Дополнительные сведения о создании параметров в запросах см. в статье Использование параметров для ввода данных при выполнении запроса.

Дополнительные сведения о настройке условий в запросах см. в статье Примеры условий запроса.

Использование параметров в запросах

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

Добавление параметра в запрос

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

В строке Условия поля, для которого вы хотите применить параметр, введите в квадратных скобках текст, который должен отображаться в соответствующем диалоговом окне. Пример:

При выполнении запроса с параметрами этот текст отобразится в диалоговом окне без квадратных скобок.

При запросе параметров также можно использовать выражения. Пример:

Between [Дата начала] And [Дата окончания]

Примечание: Для каждого параметра выводится отдельное диалоговое окно. Во втором примере появляется два окна: одно для даты начала, второе — для даты окончания.

Повторите шаг 2 для каждого поля, для которого хотите добавить параметры.

С помощью описанных выше действий можно добавить параметр в запрос любого из следующих типов: выборка, добавление, создание таблицы и обновление, а также перекрестный запрос.

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

Откройте запрос на объединение в режиме SQL.

Добавьте предложение WHERE, содержащее каждое поле, для которого требуется ввести параметр.

Если предложение WHERE уже существует, убедитесь в том, что поля, для которых нужно ввести параметры, уже есть в этом предложении; в противном случае добавьте их.

Вместо условия в предложении WHERE используйте запрос параметра.

Указание типов данных для параметра

Вы также можете указать, данные какого типа разрешается вводить в качестве значения параметра. Тип данных можно настроить для любого параметра, но особенно важно сделать это для числовых и денежных данных, а также значений даты и времени. Когда для параметра указан тип данных, пользователи получают более осмысленные сообщения об ошибках в случае ввода значений неправильного типа (например, текста вместо денежных величин).

Примечание: Если параметр настроен для ввода текстовых данных, любое введенное значение будет распознаваться как текст, а сообщение об ошибке не будет выводиться.

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

Когда запрос открыт в конструкторе, на вкладке Конструктор в группе Показать или скрыть нажмите кнопку Параметры.

В диалоговом окне Параметры запроса в столбце Параметр введите текст запроса на ввод значения для каждого параметра, для которого требуется указать тип данных. Убедитесь, что каждый из параметров соответствует запросу, который используется в строке Условие отбора в бланке запроса.

В столбце Тип данных выберите тип данных для каждого параметра.

Создание формы для ввода параметров

Хотя в запросах с параметрами есть встроенные диалоговые окна для ввода значений, они предлагают лишь простейшие функции. В то же время форма для ввода параметров поддерживает перечисленные ниже дополнительные возможности.

Использование элементов управления для ввода данных определенных типов, например календарей для дат.

Сохранение введенных параметров для использования в других запросах.

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

Элементы управления для выполнения других функций, таких как открытие запроса или обновление данных в нем.

В приведенном ниже видео демонстрируется создание простой формы для ввода параметров запроса вместо стандартных диалоговых окон.

Читайте также:  Порт для rdp подключения

Создание формы для ввода параметров для отчета

Реализовать этот сценарий можно несколькими способами, но мы рассмотрим вариант, в котором активно используются макросы. Создать форму для сбора параметров отчета можно с помощью описанной ниже последовательности действий.

Шаг 1. Создайте форму для ввода значений

На вкладке Создание в группе Формы нажмите кнопку Конструктор форм.

В режиме конструктора нажмите F4, чтобы открыть страницу свойств, и задайте свойства формы, как показано в таблице ниже.

Введите имя, которое будет отображаться в строке заголовка формы.

Режим по умолчанию

Режим сводной таблицы

Режим сводной диаграммы

Для каждого параметра, который будет вводиться с помощью формы, на вкладке Конструктор в группе Элементы управления нажмите кнопку Поле.

Задайте для полей свойства, как показано в таблице ниже.

Введите имя, описывающее параметр, например ДатаНачала.

Выберите формат, который соответствует типу данных поля параметра. Например, для поля даты выберите вариант Полный формат даты.

Сохраните форму и задайте для нее название, например frmCriteria.

Шаг 2. Создайте блок кода, проверяющий, загружена ли форма параметров

На вкладке Создание в группе Макросы и код нажмите кнопку Модуль.

В редакторе Visual Basic откроется новый модуль.

Вставьте в редакторе следующий код:

Сохраните модуль под уникальным именем и закройте редактор Visual Basic.

Шаг 3. Создайте макрос, управляющий работой формы и отчета

С помощью функций вложенных макросов в макросах Access можно определить все необходимые действия, которые необходимо выполнить в одном макросе. Мы создадим четыре вложенных макроса: открыть диалоговое окно, закрыть диалоговое окно, ОК и отменить, чтобы управлять различными задачами, необходимыми для этой процедуры. С помощью снимка экрана ниже в качестве руководства создайте новый макрос со следующими вложенными макросами и действиями. Обратите внимание, что в этом примере наша форма параметра называется frmCriteria. Измените макрос таким образом, чтобы он соответствовал имени созданной ранее формы. Кроме того, вы должны убедиться, что на вкладке конструктор выбран пункт Показать все действия , чтобы просмотреть все макрокоманды.

Сохраните и закройте макрос. Задайте для макроса имя, например Макрос диапазона дат.

Шаг 4. Добавьте на форму кнопки "ОК" и "Отмена"

Снова откройте форму параметров, которую создали в режиме конструктора.

На вкладке Конструктор в группе Элементы управления отмените выбор параметра Использовать мастера.

На вкладке Конструктор в группе Элементы управления щелкните Кнопка.

Расположите курсор под полями на форме и мышью создайте кнопку ОК.

Если окно свойств не отображается, откройте его, нажав клавишу F4.

Задайте для кнопки ОК свойства согласно приведенной ниже таблице.

Введите имя макроса, например Макрос диапазона дат.ОК.

Создайте кнопку Отмена и задайте для нее свойства, как показано в таблице ниже.

Введите имя макроса, например Макрос диапазона данных.Отмена.

Сохраните и закройте форму.

Шаг 5. Используйте значения из формы в качестве условий запроса

Откройте запрос, который создали в режиме конструктора.

Введите условия для данных. Воспользуйтесь объектом Forms , именем формы и именем элемент управления.

Например, в базе данных Access (ACCDB или MDB) для формы frmCriteria можно задать следующее выражение, ссылающееся на элементы управления "Дата начала" и "Дата окончания" в запросе:

Between [Формы]![frmCriteria]![Дата начала] And [Формы]![frmCriteria]![Дата окончания]

Шаг 6. Добавьте макрокоманды в события отчета

Откройте нужный отчет в режиме конструктора.

Если окно свойств не отображается, откройте его, нажав клавишу F4.

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

Задайте два дополнительных свойства отчета, как показано в таблице ниже.

Введите имя макроса, например Макрос диапазона дат.Открыть диалоговое окно.

Введите имя макроса, например Макрос диапазона дат.Закрыть диалоговое окно.

При открытии отчета Access будет выполнять команды, содержащиеся во вложенном макросе "Открыть диалоговое окно" объекта "Макрос диапазона дат". И аналогично: при закрытии отчета Access будет выполнять команды, содержащиеся во вложенном макросе "Закрыть диалоговое окно" объекта "Макрос диапазона дат".

Сохраните и закройте отчет.

Шаг 7. Проверьте форму в действии

Теперь, когда все объекты Access созданы, можно проверить, как они работают. Откройте отчет в режиме отчета или представлении для печати и обратите внимание, что перед показом отчета Access отображает форму ввода параметров в диалоговом режиме. Введите необходимые условия в созданные вами текстовые поля и нажмите кнопку ОК на форме. После этого Access скроет форму (вывод на экран — "Нет") и отобразит отчет, содержащий только те данные, которые соответствуют вашим условиям. Это произойдет благодаря тому, что запрос с параметрами, на котором основан отчет, использует значения в элементах управления на скрытой форме. Когда вы закроете отчет, Access также закроет форму параметров.

Примечание: Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Была ли информация полезной? Для удобства также приводим ссылку на оригинал (на английском языке).

Я хотел бы знать, если есть способ, чтобы установить параметры в запросе Access 2007 с помощью VBA. Я новичок в использовании VBA в Access, и я была поставлена ​​задача добавить небольшой кусочек функциональности существующего приложения.

Проблема, которую я имею, что тот же отчет может быть назван в двух разных местах в приложении. Первое существо на командную кнопке на форме ввода данных, а другое с помощью кнопки электрощитовой. Доклад сам по себе основана на запросе параметра, который имеет от пользователя требуется ввести поставщик ID.

Читайте также:  Интернет работает с перебоями как исправить

Пользователь хотел бы, чтобы не вводить Поставщик ID на форме ввода данных (поскольку форма отображает поставщик ID уже), но от распределительного щита, они хотели бы быть предложено ввести поставщик ID.

Где я застрял, как вызвать запрос отчета (в открытом случае отчета) и передать SupplierID из формы в качестве параметра. Я пытался некоторое время, и я не могу получить что-нибудь, чтобы правильно работать. Вот мой код до сих пор, но я явно озадачен.

Private Sub Report_Open (Отмена As Integer)

Я попытался Me.Supplier >

ПАРАМЕТРЫ [Enter Поставщик] Длинные; ВЫБОР Suppliers.Supplier >

Я знаю, что есть способы обойти эту проблему (и, возможно, легкий путь, а), но, как я уже говорил, мой недостаток опыта использования Access и VBA делает вещи трудно. Если любой из вас может помочь, это было бы здорово!

Как я изложил в недавнем посте , я , как правило , никогда не проводной какие — либо параметры или формировать ссылки на элементы управления в recordsources отчетов или форм. Вместо этого, я поставил их во время выполнения. Самый простой способ, передавая свойство WhereCondition в DoCmd.OpenForm / DoCmd.OpenReport:

Это предполагает, что вы используете его из формы, имеющей соответствующую SupplierID уже присутствует в RecordSource (то есть, вы на записи с этим SupplierID).

Более сложным является использование OnOpen события отчета установить RecordSource В отчетах х лет. Это то, что я изложил в цитированном выше пост . Но этот пример жестко привязывает выбор в форму выбора, в то время как вы можете вместо этого предлагают различные наборы вариантов в зависимости от контекста. Есть два способа справиться с этим:

если A2003, а затем, передать OpenArg (последний параметр DoCmd.OpenReport), чтобы сказать OnOpen события, что нужно сделать, чтобы собрать информацию о том, что фильтр.

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

Я подозреваю, что WhereCondition в DoCmd.OpenReport ваше самое простое решение, но если вы хотите подробную информацию о двух других, просто спросить.

Предложение делается здесь на 100% удалить параметр из запроса. Это не только решает проблему, но означает, что вы можете использовать запрос для кода, других форм и не вся ваша конструкция развалится, потому что одна глупая форма не открыта (отсюда VERY причины вашего вопроса).

Таким образом, удалить параметры из запроса. Это также означает, что ваш отчет теперь не нужна форма, которая уже открыта. И опять же, если какая-то глупая форма не открывается, почему отчет не работает?

Таким образом, удалите параметр. Теперь, в вашей форме, которая открывается отчет, он может пройти через фильтр, и больше используется точка, что является называется «где» положение. Это «где» статья предназначена в MS-доступа, чтобы решить проблему того, чтобы знать заранее, какие параметры и фильтры вам нужно. Это происходит во время выполнения, и, таким образом, множество различных форм можно назвать и открыть этот отчет.

В настоящее время в форме, которая вызывает и открывает форму, вы идете:

Так, в приведенном выше, параметр создается на лету. Большим преимуществом является то завтра вы можете иметь другую форму открыть тот же отчет, и, возможно, фильтр по регионам.

В случае, где положение NO передается и пользователь просто открыв форму, то никаких фильтров не будут использоваться, и никаких запросов не будут происходить, и все записи будут отображаться. Это, вероятно, ваш лучший подход.

Однако, если по какой-то странной причине вы все еще считаете, что действительно необходимо иметь некоторый отчет подсказку, когда одна глупая форма как раз случается не может быть открыта, а затем поместите следующий код в формах на-открытого мероприятия.

Тем не менее, я бы действительно приложить усилия, чтобы избежать жесткого кодирования некоторого глупого имени формы в отчетах открытого мероприятия. Мало того, означает ли это ваши жесткие кодирования зависимостей какой-то глупой форме, которая теперь прилагается к отчету, но если вы позже копии, отчет, или даже скопировать оригинальную форму (или даже переименовать любой из этих объектов), то вы должны перейти в приложение и охотиться о и теперь найти места, которые вы, как разработчик представил зависимости. Такой подход может существенно увеличить затраты на обслуживание приложения и, таким образом, должно быть advoied.

Таким образом, предложение здесь, чтобы сбросить запрос параметров. Просто предоставьте форму или некоторую оперативную систему для запуска отчетов. Эти формы должны запрашивать у пользователя информацию, которую вы хотите отфильтровать. Или, как в вашем случае, связанная форма и текущая запись предоставляет эту информацию. Красота этой системы не в настоящее время не существует depdancy из отчета.

Любые формы, или даже какие-либо коды вниз по дороге бесплатно пройти pramaeter, и он не будет ограничены SupplierID, но может быть любым типом фильтра или параметра, который вы хотите.

Имейте в виду, что, возможно, пользователь не может хотеть, что форма будет открыта и, возможно, они не хотят подсказки. С вашим дизайном и вопрос пользователь будет вынужден ввести значение параметра, даже при запуске отчета без каких-либо форм открытого и не желая быть предложено, чтобы они могли просмотреть все reocrds в этом докладе.