powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Способы использования свойства InputParameters (в том числе недокументированные)
12 сообщений из 12, страница 1 из 1
Способы использования свойства InputParameters (в том числе недокументированные)
    #32442666
Практические потребности заставили меня провести некоторую работу по исследованию особенностей свойства InputParameters в ADP, так как имеющаяся в MS Access документация к этому свойству по меньшей мере недостаточна, а дополнительная информация, которую можно почерпнуть из доступных источников, на удивление скудна. В частности, даже хорошо известный двухтомник, который часто называют по имени одного из его соавторов, отводит этому свойству не более нескольких абзацев, и то там нет ничего нового по сравнению с тем, что можно найти в MSDN (я пользовался вторым томом издания этой книги на английском языке, относящемся к MS Access 2000; что же касается издания для MS Access 2002, то я располагаю только первым томом - быть может, во втором томе, который я пока ещё не приобрёл, есть что-то новое?)

То, что в результате удалось обнаружить (проверялось на MS Access 2000 9.0.2812, русская версия), я тогда записал в виде статьи "для себя" и сейчас публикую с целью задать вопрос уважаемому сообществу - изменилось ли описываемое поведение в MS Access 2002? Может быть, кто-то это уже знает и тем самым избавит меня от повторения утомительных экспериментов в другой версии программы?

Итак, что выявлено в результате исследования сверх того, что можно прочесть в документации:

1) Синтаксис типа (здесь и далее рассматривается синтаксис одного параметра на вымышленном примере)

Код: plaintext
@Param1 int=[Forms]![Мояформа]![МоеПоле]

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

Код: plaintext
Forms( "Мояформа" ).Controls( "МоеПоле" ) 

а также их всевозможные комбинации, но практической выгоды в этом, похоже, нет.

Также очевидным образом работает в этом случае ссылка на поле в субформе:

Код: plaintext
@Param1 int = [Forms]![Мояформа]![ПолеСубформы].Form![МоеПоле]

равно как и (учитывая, что Form является свойством по умолчанию)

Код: plaintext
@Param1 int = [Forms]![Мояформа]![ПолеСубформы]![МоеПоле] 

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

2) Также без проблем работает задание значения параметра с помощью функции, объявленной в отдельном модуле (не модуле формы!):

Код: plaintext
@Param1 int=МояФункция() 

При этом вызвать таким образом функцию, объявленную в модуле формы, содержащей наше свойство InputParameters, не удаётся.

Применение функции, объявленной в отдельном модуле, в качестве значения параметра, хоть и не описано в документации, но стало широко известным.

3) Применение в строке InputParameters свойства Form (свойства, содержащего ссылку формы на неё саму)

Код: plaintext
@Param1 int=[Form]![МоеПоле] 

приводит к результатам, отличным от ожидаемых. Из некоторых статей в MSDN, касающихся применения свойства InputParameters, в примерах кода в которых без комментариев используется свойство [Form], можно предположить (как это следует из опыта применения этого свойства в других свойствах формы и элементов управления), что и здесь оно должно означать ссылку на саму форму, содержащую свойство InputParameters, с которым мы работаем. Но это не так! В случае простой (не подчинённой) формы, если вы сошлётесь на поле в этой же форме, вот так:

Код: plaintext
@Param1 int=[Form]![МоеПоле] 

то это работать не будет, и вместо того, чтобы взять значение из поля [МоеПоле] из этой же формы, программа будет запрашивать параметр [МоеПоле] у пользователя. На самом деле, как удалось выяснить, свойство [Form] имеет смысл применять в строке InputParameters только в подчинённой форме для ссылки на главную. Другими словами, в свойстве InputParameters (и, похоже, только в нём) конструкция [Form] означает ссылку на родительскую форму.

4) Как это уже указывалось в предыдущем пункте, в случае, когда наша форма является подчинённой, то свойство [Form] внутри InputParameters является применимым, но ссылается не на саму эту форму, а на родительскую по отношению к ней. То есть, если мы в свойстве InputParameters укажем

Код: plaintext
@Param1 int=[Form]![МоеПоле] 

и если при этом в главной по отношению к этой форме есть поле [МоеПоле], то параметр будет автоматически получен из него. Если же поле с таким именем отсутствует в главной форме, то параметр с именем [МоеПоле] будет запрошен у пользователя.

В этом случае допускается также синтаксис ссылки на поле "через точку" ([Form].[МоеПоле]), причём квадратные скобки здесь также в большинстве случаев могут быть опущены.

Случай с двойной вложенностью субформ друг в друга не проверялся.

5) Следующим шагом в экспериментах было удаление ссылки [Form] из синтаксиса InputParameters, вот так:

Код: plaintext
@Param1 int=[МоеПоле] 

или

Код: plaintext
@Param1 int=МоеПоле

Оказывается, это тоже будет работать, как в случае со ссылкой типа [Form]![МоеПоле], однако здесь была обнаружена одна важная особенность. В случае простой ссылки на имя поля без префиксов программа так же извлекает значение параметра из поля с этим именем, находящимся в главной (родительской по отношению к текущей) форме, но в дополнение к этому любое изменение значения поля [МоеПоле] пользователем (путём ввода значения и выхода из поля или путём выбора из списка) приводит к автоматическому обновлению (Requery) набора записей формы, содержащей наше свойство InputParameters! То есть в случае задания пользователем нового критерия отбора не нужно в событии AfterUpdate этого поля вызывать метод Requery субформы! В случае же, когда используется синтаксис [Form].[МоеПоле], такого не происходит.

6)Краткий синтаксис указания ссылки на значение параметра (без [Form]) имеет ещё одну интересную особенность. Если мы вместо поля с именем [МоеПоле] главной формы создадим в модуле главной (родительской) формы свойство с таким же именем:

Код: plaintext
1.
2.
Public Property Get МоеПоле()
	МоеПоле =  "НужноеЗначение"  'может быть и числовым'
End Function

то это также сработает! При этом в качестве значения параметра автоматически будет подставляться значение, возвращаемое функцией Property Get.
Однако, такой подход работает лишь в случае указания имени процедуры без префикса [Form] и без пары скобок после имени процедуры, вот так:

Код: plaintext
1.
@Param1 int=[МоеПоле]  или @Param1 int=МоеПоле 
(работает!)

Код: plaintext
1.
@Param1 int=[Form].[МоеПоле] 
(Не работает! Ни с квадратными скобками, ни без них, ни с точкой, ни с восклицательным знаком.)


Следует отметить, что в этом случае Property Get можно заменить на обычную Public Function (метод формы, они синтаксически эквивалентны), и для получения значения параметра будет автоматические будет вызываться эта функция.

Создание свойства в форме простейшим способом, путём объявления публичной переменной на уровне секции объявлений модуля формы (Public МоеПоле As Variant) нужного эффекта не даёт - переменная формы в качестве значения параметра не распознаётся, и параметр запрашивается у пользователя.

Таким образом, вопреки распространённому утверждению, в качестве значения параметра в InputParameters можно использовать функцию в модуле формы (только не этой формы, а главной, родительской по отношению к ней). Однако в последнем случае, если мы поддадимся соблазну изменить синтаксис

Код: plaintext
@Param1 int=[МоеПоле] 

на, как казалось бы, более логичный синтаксис

Код: plaintext
@Param1 int=МоеПоле() 

то это работать не будет! Параметр с именем "МоеПоле()" будет запрашиваться у пользователя.

7) И, наконец, очень интересная особенность. Если мы создадим в родительской (главной) форме поле, содержащее значение параметра с именем, в точности соответствующим имени параметра (как он объявлен в хранимой процедуре, например, без символа @), то в свойстве InputParameters описание этого параметра можно просто опустить - программа сама автоматически найдёт это поле и будет, ничего больше не спрашивая, брать значение параметра оттуда!

Всё вышесказанное наводит на мысль, что все эти возможности проектировались для того,чтобы обеспечить несложное (без программирования) осуществление связи между главной формой и подчинённой (для того же самого, для чего служат свойства формы LinkChildForm и LinkParentForm), но по какой-то не вполне ясной причине это так и осталось недокументированным.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32442684
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшое уточнение:
Код: plaintext
@Product_id Int=Forms( "Products2Move" ).ProductID
где ProductID
Код: plaintext
1.
2.
Public Property Get ProductID() As Long
    ProductID = Me( "RemainsContents" )( "Product_id" )
End Property
Позволяет явно указать в InputParameters форму? из которой нужно получить ProductID.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32442806
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дабы разьяснить некоторые сомнения автора

отностительно квадратных скобок:

скобки не нужны если в случаях если объекты или свойства к которым идет обращение в своих названиях не содержат недопустимых символов (например пробелов) и не являются зарезирвированными словами (названия функций , операторы )

например:
нельзя обратиться к полю [SUM] в sql скрипте без скобок так как есть такая функция

нельзя обратиться к полю [суммарное количество] без скобок иначе поле будет идентифицировано как два.

в случаях использования [forms] скобки бессмыслены.

в случае работы с SQLSERVER может быть определен вид передачи
идентификаторов либо скобки либо кавычки
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32444494
Да нет, в каких случаях необходимы квадратные скобки, я, конечно, знаю, но цель моя тогда состояла в том, чтобы выявить все способы задания параметров в InputParameters, даже заведомо бессмысленные (как знать, что может потом пригодиться...), но всё же работающие! В общем, я так тщательно изучал это дело по сути, лишь с сугубо формальной стороны, так как у меня было подозрение, что с синтаксисом выражений в InputParameters не всё ладно... Что, в общем, и подтвердилось.

А вот насчёт этого:

в случае работы с SQLSERVER может быть определен вид передачи
идентификаторов либо скобки либо кавычки


поподробней, пожалуйста. Имелось в виду SET QUOTED_IDENTIFIER ON|OFF ?

Если да, то как это можно использовать применительно к синтаксису свойства InputParameters? И вообще, какие возможности я тут упустил (кроме очевидного способа задания параметров в виде констант, "зашитых" в строку InputParameters)?

Жаль, конечно, что по существу заданного мной вопроса никто не ответил... Хотелось бы знать, имеет ли смысл полагаться на такое несколько необычное поведение MS Access, используя это в своих программах? И более частный вопрос: изменилось ли что-нибудь здесь уже в MS Access 2002?


Pavel:
Действительно, так мы "обманем" Access, "переадресовав" свойство другой форме... А можете указать случай практически полезного применения этого приёма? Ведь в случае hard-coded имён форм от этого мало проку, ибо проще с самого начала задать ссылку в формате Forms!ИмяФормы!ИмяПоля, указав конкретное имя нужной формы.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32444821
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет, в каких случаях необходимы квадратные скобки, я, конечно, знаю,

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


а именно:
1 авторработает вполне предсказуемо, так, как об этом можно прочитать в документации, при этом квадратные скобки в большинстве случаев можно не ставить. В ссылке на поле вместо восклицательных знаков допускается также синтаксис со скобками

2 автора также масса вариантов с квадратными скобками и без, а также со строковыми значениями в скобках вместо восклицательного знака в различных местах

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

итд

Если считаешь мой пост из лишним - можешь попросить модератора удалить его - я не возражаю

а чтобы предоставить более полную информацию можешь еще раскрыть следующие , не менее интересные темы:

- назначение рекодсета формы
Dim rs As New ADODB.Recordset
rs.Open "exec dbo.sp_test @id = 3 " ...
Set Me.Recordset = rs

- особенности передачи даты в числовом формате через входные параметры
формы и вышеописаным способом

- чем ОТЛИЧАЕТСЯ реквери и обновление вызванное изменением входных параметров.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32444841
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Тимур Рахимов
Другими словами, в свойстве InputParameters (и, похоже, только в нём) конструкция [Form] означает ссылку на родительскую форму.
Было бы странно, если бы форма для получения параметров (для своего открытия) обращалась бы к своим собственным контролам. Как ты это себе видишь? Чтобы заполнить контролы надо выполнить хп, чтобы выполнить хп надо задать параметры, а чтобы задать параметры - надо обратиться к контролам
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32444862
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если вопрос был этот (а похож он больше на утверждение)
авторВсё вышесказанное наводит на мысль, что все эти возможности проектировались для того,чтобы обеспечить несложное (без программирования) осуществление связи между главной формой и подчинённой (для того же самого, для чего служат свойства формы LinkChildForm и LinkParentForm), но по какой-то не вполне ясной причине это так и осталось недокументированным

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

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

Мое мнение что для хорошо сделанной сложной формы болше подходит локальная временная таблица
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32444985
Фотография Pavel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимур Рахимов
А можете указать случай практически полезного применения этого приёма? Ведь в случае hard-coded имён форм от этого мало проку, ибо проще с самого начала задать ссылку в формате Forms!ИмяФормы!ИмяПоля, указав конкретное имя нужной формы.

Property Get может отдать не только значение поля (я привел это только в качестве примера), а в том числе и какое-либо значение, для которого на форме (и в ее источнике) вообще не существует поля (скажем како-то сложный расчет). Хотя не спорю, выкрутится можно и без этого.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32445076
АлексейК:
Не будем ничего удалять :). Благодаря вам я увидел, что в моём тексте есть опечатки, и, думаю, из-за них создалось впечатление "блуждания".

Например, вместо
авторВ ссылке на поле вместо восклицательных знаков допускается также синтаксис со скобками

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

Кроме того, я заметил очевидный "ляп":
авторВсё вышесказанное наводит на мысль, что все эти возможности проектировались для того,чтобы обеспечить несложное (без программирования) осуществление связи между главной формой и подчинённой (для того же самого, для чего служат свойства формы LinkChildForm и LinkParentForm), но по какой-то не вполне ясной причине это так и осталось недокументированным.

Разумеется, имелись в виду LinkChildFields и LinkParentFields. Видно, я слишком тяжко тогда размышлял над формами :).

А за предложенные темы для размышления спасибо. Здесь я тоже кое-что знаю, но, конечно, для полной ясности нужно провести дополнительные эксперименты.

Лох Позорный:
Почему же? Прекрасно представляю :). Я имел в виду несвязанные контролы (критерии отбора, задаваемые пользователем), например, расположенные в заголовке ленточной формы.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32445147
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй:

- особенности передачи даты в числовом формате через входные параметры
формы и вышеописаным способом


(в процедуре задай тип параметра датавремя, сделай select @paramdatetimetype as myparam в результирующий набор и посмотри результат)

сравни
Код: plaintext
rs.Open  "exec dbo.sp_test @paramdatetimetype = "  & clng(now())

и
Код: plaintext
me.inputparameters =  "@paramdatetimetype = "  & clng(now())


у меня получается разница в 2 дня

а так соответствует действительности

Код: plaintext
1.
2.
rs.Open  "exec dbo.sp_test @paramdatetimetype = "  & clng(now()) -  2 
и
me.inputparameters =  "@paramdatetimetype = "  & clng(now())

-------------------------------------------------------------------------------
- чем ОТЛИЧАЕТСЯ реквери и обновление вызванное изменением входных параметров.

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

может еще найдешь чего интересного.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32445346
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эту бы статью
где-нить в году 2000.
тады ей цены б не было
а сейчас - неактуально.
кстати, в inputparameters
можно писать корче
[Forms]![Мояформа]![МоеПоле], [Forms]![Мояформа]![МоеПоле1],
[Forms]![Мояформа]![МоеПоле2]
эта короткая форма
не всегда работает
в отчетах. в зависимости
от сложности отчета.
...
Рейтинг: 0 / 0
Способы использования свойства InputParameters (в том числе недокументированные)
    #32445372
Да не претендовал я на новизну... Статья-то тоже не вчера написана! Но позже 2000-го года:). В общем-то, я так и полагал, что это многие знают. Но не публикуют же, гады! :).

Кстати, по поводу "неактуально" - это означает "и так все знают" или "получше способы есть"?

А за дополнительный способ - спасибо.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Способы использования свойства InputParameters (в том числе недокументированные)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]