|
|
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
Практические потребности заставили меня провести некоторую работу по исследованию особенностей свойства InputParameters в ADP, так как имеющаяся в MS Access документация к этому свойству по меньшей мере недостаточна, а дополнительная информация, которую можно почерпнуть из доступных источников, на удивление скудна. В частности, даже хорошо известный двухтомник, который часто называют по имени одного из его соавторов, отводит этому свойству не более нескольких абзацев, и то там нет ничего нового по сравнению с тем, что можно найти в MSDN (я пользовался вторым томом издания этой книги на английском языке, относящемся к MS Access 2000; что же касается издания для MS Access 2002, то я располагаю только первым томом - быть может, во втором томе, который я пока ещё не приобрёл, есть что-то новое?) То, что в результате удалось обнаружить (проверялось на MS Access 2000 9.0.2812, русская версия), я тогда записал в виде статьи "для себя" и сейчас публикую с целью задать вопрос уважаемому сообществу - изменилось ли описываемое поведение в MS Access 2002? Может быть, кто-то это уже знает и тем самым избавит меня от повторения утомительных экспериментов в другой версии программы? Итак, что выявлено в результате исследования сверх того, что можно прочесть в документации: 1) Синтаксис типа (здесь и далее рассматривается синтаксис одного параметра на вымышленном примере) Код: plaintext работает вполне предсказуемо, так, как об этом можно прочитать в документации, при этом квадратные скобки в большинстве случаев можно не ставить. В ссылке на поле вместо восклицательных знаков допускается также синтаксис со скобками Код: plaintext а также их всевозможные комбинации, но практической выгоды в этом, похоже, нет. Также очевидным образом работает в этом случае ссылка на поле в субформе: Код: plaintext равно как и (учитывая, что Form является свойством по умолчанию) Код: plaintext а также масса вариантов с квадратными скобками и без, а также со строковыми значениями в скобках вместо восклицательного знака в различных местах. 2) Также без проблем работает задание значения параметра с помощью функции, объявленной в отдельном модуле (не модуле формы!): Код: plaintext При этом вызвать таким образом функцию, объявленную в модуле формы, содержащей наше свойство InputParameters, не удаётся. Применение функции, объявленной в отдельном модуле, в качестве значения параметра, хоть и не описано в документации, но стало широко известным. 3) Применение в строке InputParameters свойства Form (свойства, содержащего ссылку формы на неё саму) Код: plaintext приводит к результатам, отличным от ожидаемых. Из некоторых статей в MSDN, касающихся применения свойства InputParameters, в примерах кода в которых без комментариев используется свойство [Form], можно предположить (как это следует из опыта применения этого свойства в других свойствах формы и элементов управления), что и здесь оно должно означать ссылку на саму форму, содержащую свойство InputParameters, с которым мы работаем. Но это не так! В случае простой (не подчинённой) формы, если вы сошлётесь на поле в этой же форме, вот так: Код: plaintext то это работать не будет, и вместо того, чтобы взять значение из поля [МоеПоле] из этой же формы, программа будет запрашивать параметр [МоеПоле] у пользователя. На самом деле, как удалось выяснить, свойство [Form] имеет смысл применять в строке InputParameters только в подчинённой форме для ссылки на главную. Другими словами, в свойстве InputParameters (и, похоже, только в нём) конструкция [Form] означает ссылку на родительскую форму. 4) Как это уже указывалось в предыдущем пункте, в случае, когда наша форма является подчинённой, то свойство [Form] внутри InputParameters является применимым, но ссылается не на саму эту форму, а на родительскую по отношению к ней. То есть, если мы в свойстве InputParameters укажем Код: plaintext и если при этом в главной по отношению к этой форме есть поле [МоеПоле], то параметр будет автоматически получен из него. Если же поле с таким именем отсутствует в главной форме, то параметр с именем [МоеПоле] будет запрошен у пользователя. В этом случае допускается также синтаксис ссылки на поле "через точку" ([Form].[МоеПоле]), причём квадратные скобки здесь также в большинстве случаев могут быть опущены. Случай с двойной вложенностью субформ друг в друга не проверялся. 5) Следующим шагом в экспериментах было удаление ссылки [Form] из синтаксиса InputParameters, вот так: Код: plaintext или Код: plaintext Оказывается, это тоже будет работать, как в случае со ссылкой типа [Form]![МоеПоле], однако здесь была обнаружена одна важная особенность. В случае простой ссылки на имя поля без префиксов программа так же извлекает значение параметра из поля с этим именем, находящимся в главной (родительской по отношению к текущей) форме, но в дополнение к этому любое изменение значения поля [МоеПоле] пользователем (путём ввода значения и выхода из поля или путём выбора из списка) приводит к автоматическому обновлению (Requery) набора записей формы, содержащей наше свойство InputParameters! То есть в случае задания пользователем нового критерия отбора не нужно в событии AfterUpdate этого поля вызывать метод Requery субформы! В случае же, когда используется синтаксис [Form].[МоеПоле], такого не происходит. 6)Краткий синтаксис указания ссылки на значение параметра (без [Form]) имеет ещё одну интересную особенность. Если мы вместо поля с именем [МоеПоле] главной формы создадим в модуле главной (родительской) формы свойство с таким же именем: Код: plaintext 1. 2. то это также сработает! При этом в качестве значения параметра автоматически будет подставляться значение, возвращаемое функцией Property Get. Однако, такой подход работает лишь в случае указания имени процедуры без префикса [Form] и без пары скобок после имени процедуры, вот так: Код: plaintext 1. Код: plaintext 1. Следует отметить, что в этом случае Property Get можно заменить на обычную Public Function (метод формы, они синтаксически эквивалентны), и для получения значения параметра будет автоматические будет вызываться эта функция. Создание свойства в форме простейшим способом, путём объявления публичной переменной на уровне секции объявлений модуля формы (Public МоеПоле As Variant) нужного эффекта не даёт - переменная формы в качестве значения параметра не распознаётся, и параметр запрашивается у пользователя. Таким образом, вопреки распространённому утверждению, в качестве значения параметра в InputParameters можно использовать функцию в модуле формы (только не этой формы, а главной, родительской по отношению к ней). Однако в последнем случае, если мы поддадимся соблазну изменить синтаксис Код: plaintext на, как казалось бы, более логичный синтаксис Код: plaintext то это работать не будет! Параметр с именем "МоеПоле()" будет запрашиваться у пользователя. 7) И, наконец, очень интересная особенность. Если мы создадим в родительской (главной) форме поле, содержащее значение параметра с именем, в точности соответствующим имени параметра (как он объявлен в хранимой процедуре, например, без символа @), то в свойстве InputParameters описание этого параметра можно просто опустить - программа сама автоматически найдёт это поле и будет, ничего больше не спрашивая, брать значение параметра оттуда! Всё вышесказанное наводит на мысль, что все эти возможности проектировались для того,чтобы обеспечить несложное (без программирования) осуществление связи между главной формой и подчинённой (для того же самого, для чего служат свойства формы LinkChildForm и LinkParentForm), но по какой-то не вполне ясной причине это так и осталось недокументированным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 00:32 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
Небольшое уточнение: Код: plaintext Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 05:39 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
дабы разьяснить некоторые сомнения автора отностительно квадратных скобок: скобки не нужны если в случаях если объекты или свойства к которым идет обращение в своих названиях не содержат недопустимых символов (например пробелов) и не являются зарезирвированными словами (названия функций , операторы ) например: нельзя обратиться к полю [SUM] в sql скрипте без скобок так как есть такая функция нельзя обратиться к полю [суммарное количество] без скобок иначе поле будет идентифицировано как два. в случаях использования [forms] скобки бессмыслены. в случае работы с SQLSERVER может быть определен вид передачи идентификаторов либо скобки либо кавычки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 08:56 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
Да нет, в каких случаях необходимы квадратные скобки, я, конечно, знаю, но цель моя тогда состояла в том, чтобы выявить все способы задания параметров в InputParameters, даже заведомо бессмысленные (как знать, что может потом пригодиться...), но всё же работающие! В общем, я так тщательно изучал это дело по сути, лишь с сугубо формальной стороны, так как у меня было подозрение, что с синтаксисом выражений в InputParameters не всё ладно... Что, в общем, и подтвердилось. А вот насчёт этого: в случае работы с SQLSERVER может быть определен вид передачи идентификаторов либо скобки либо кавычки поподробней, пожалуйста. Имелось в виду SET QUOTED_IDENTIFIER ON|OFF ? Если да, то как это можно использовать применительно к синтаксису свойства InputParameters? И вообще, какие возможности я тут упустил (кроме очевидного способа задания параметров в виде констант, "зашитых" в строку InputParameters)? Жаль, конечно, что по существу заданного мной вопроса никто не ответил... Хотелось бы знать, имеет ли смысл полагаться на такое несколько необычное поведение MS Access, используя это в своих программах? И более частный вопрос: изменилось ли что-нибудь здесь уже в MS Access 2002? Pavel: Действительно, так мы "обманем" Access, "переадресовав" свойство другой форме... А можете указать случай практически полезного применения этого приёма? Ведь в случае hard-coded имён форм от этого мало проку, ибо проще с самого начала задать ссылку в формате Forms!ИмяФормы!ИмяПоля, указав конкретное имя нужной формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2004, 21:47 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
Да нет, в каких случаях необходимы квадратные скобки, я, конечно, знаю, меня побудило добавить некоторое пояснение к твоему топику именно некоторое "блуждание" относительно магии квадратных скобок. дабы сам не заблуждался и внимание других попусту не отвлекал а именно: 1 авторработает вполне предсказуемо, так, как об этом можно прочитать в документации, при этом квадратные скобки в большинстве случаев можно не ставить. В ссылке на поле вместо восклицательных знаков допускается также синтаксис со скобками 2 автора также масса вариантов с квадратными скобками и без, а также со строковыми значениями в скобках вместо восклицательного знака в различных местах по поводу QUOTED_IDENTIFIER это я уже ушел в свои мысли дальше и здесь это действительно лишняя информация, хотя к стандартизации передачи идентификаторов отношение имеет. итд Если считаешь мой пост из лишним - можешь попросить модератора удалить его - я не возражаю а чтобы предоставить более полную информацию можешь еще раскрыть следующие , не менее интересные темы: - назначение рекодсета формы Dim rs As New ADODB.Recordset rs.Open "exec dbo.sp_test @id = 3 " ... Set Me.Recordset = rs - особенности передачи даты в числовом формате через входные параметры формы и вышеописаным способом - чем ОТЛИЧАЕТСЯ реквери и обновление вызванное изменением входных параметров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:17 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
2 Тимур Рахимов Другими словами, в свойстве InputParameters (и, похоже, только в нём) конструкция [Form] означает ссылку на родительскую форму. Было бы странно, если бы форма для получения параметров (для своего открытия) обращалась бы к своим собственным контролам. Как ты это себе видишь? Чтобы заполнить контролы надо выполнить хп, чтобы выполнить хп надо задать параметры, а чтобы задать параметры - надо обратиться к контролам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:25 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
если вопрос был этот (а похож он больше на утверждение) авторВсё вышесказанное наводит на мысль, что все эти возможности проектировались для того,чтобы обеспечить несложное (без программирования) осуществление связи между главной формой и подчинённой (для того же самого, для чего служат свойства формы LinkChildForm и LinkParentForm), но по какой-то не вполне ясной причине это так и осталось недокументированным вполне возможно, но особо не разрекламировано потому что толком не доделано. а именно: если используешь хранимку в качестве источника данных формы то нельзя использовать серверные фильтры а клиентские работают некорректно (проблемы с агрегатами), проблемы с конструированием серверной сортировки, сложности в создании строки синхронизации Мое мнение что для хорошо сделанной сложной формы болше подходит локальная временная таблица ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 10:31 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
Тимур Рахимов А можете указать случай практически полезного применения этого приёма? Ведь в случае hard-coded имён форм от этого мало проку, ибо проще с самого начала задать ссылку в формате Forms!ИмяФормы!ИмяПоля, указав конкретное имя нужной формы. Property Get может отдать не только значение поля (я привел это только в качестве примера), а в том числе и какое-либо значение, для которого на форме (и в ее источнике) вообще не существует поля (скажем како-то сложный расчет). Хотя не спорю, выкрутится можно и без этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 11:10 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
АлексейК: Не будем ничего удалять :). Благодаря вам я увидел, что в моём тексте есть опечатки, и, думаю, из-за них создалось впечатление "блуждания". Например, вместо авторВ ссылке на поле вместо восклицательных знаков допускается также синтаксис со скобками следует читать авторВ ссылке на поле вместо восклицательных знаков допускается также синтаксис с точками Кроме того, я заметил очевидный "ляп": авторВсё вышесказанное наводит на мысль, что все эти возможности проектировались для того,чтобы обеспечить несложное (без программирования) осуществление связи между главной формой и подчинённой (для того же самого, для чего служат свойства формы LinkChildForm и LinkParentForm), но по какой-то не вполне ясной причине это так и осталось недокументированным. Разумеется, имелись в виду LinkChildFields и LinkParentFields. Видно, я слишком тяжко тогда размышлял над формами :). А за предложенные темы для размышления спасибо. Здесь я тоже кое-что знаю, но, конечно, для полной ясности нужно провести дополнительные эксперименты. Лох Позорный: Почему же? Прекрасно представляю :). Я имел в виду несвязанные контролы (критерии отбора, задаваемые пользователем), например, расположенные в заголовке ленточной формы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 11:44 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
попробуй: - особенности передачи даты в числовом формате через входные параметры формы и вышеописаным способом (в процедуре задай тип параметра датавремя, сделай select @paramdatetimetype as myparam в результирующий набор и посмотри результат) сравни Код: plaintext и Код: plaintext у меня получается разница в 2 дня а так соответствует действительности Код: plaintext 1. 2. ------------------------------------------------------------------------------- - чем ОТЛИЧАЕТСЯ реквери и обновление вызванное изменением входных параметров. если форма стоит на записи отличной от первой а в выборке , которая получается после смены параметра записей больше или равно текущей то при обновлении параметра в отличие от реквери не происходит перескакивание указателя записи на первую может еще найдешь чего интересного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 12:11 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
эту бы статью где-нить в году 2000. тады ей цены б не было а сейчас - неактуально. кстати, в inputparameters можно писать корче [Forms]![Мояформа]![МоеПоле], [Forms]![Мояформа]![МоеПоле1], [Forms]![Мояформа]![МоеПоле2] эта короткая форма не всегда работает в отчетах. в зависимости от сложности отчета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 13:28 |
|
||
|
Способы использования свойства InputParameters (в том числе недокументированные)
|
|||
|---|---|---|---|
|
#18+
Да не претендовал я на новизну... Статья-то тоже не вчера написана! Но позже 2000-го года:). В общем-то, я так и полагал, что это многие знают. Но не публикуют же, гады! :). Кстати, по поводу "неактуально" - это означает "и так все знают" или "получше способы есть"? А за дополнительный способ - спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2004, 13:40 |
|
||
|
|

start [/forum/topic.php?fid=45&msg=32445372&tid=1676027]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
405ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 717ms |

| 0 / 0 |
