Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
spbetta Участник со стажем
Вступление в Клуб: 19.11.2012
|
Пн Июн 24, 2013 13:52  Вызов экранной формы простой операции из списочной |
|
Полезность: Нет оценки
|
Подскажите, пожалуйста, как вызвать простую операцию после выполнения списочной с помощью plpcall.
Операции принадлежат одному классу.
Как правильно определить переменные, которые надо передавать? |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Вт Июн 25, 2013 03:24   |
|
Полезность: Нет оценки
|
А в чём сложность ? Вроде всё в документации есть.
Заводите на закладке переменные, переменную нужного типа например V_THIS
и вызываете
stdio.put_line_buf('<% PLPCALL %VAR%.V_THIS.[ИМЯ операции](%PARAM%.P_CLIENT => '''||P_CLIENT||''', %VAR%.V_DOG =>'''||V_DOG ||''' %>');
+ поставить галку на Дополнительно- Выводить команды в буфер сессии |
|
 |
spbetta Участник со стажем
Вступление в Клуб: 19.11.2012
|
Чт Июн 27, 2013 08:59  Спасибо |
|
Полезность: Нет оценки
|
Разобралась |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Авг 12, 2014 13:26   |
|
Полезность: Нет оценки
|
Alkov пишет: | А в чём сложность ? Вроде всё в документации есть.
Заводите на закладке переменные, переменную нужного типа например V_THIS
и вызываете
stdio.put_line_buf('<% PLPCALL %VAR%.V_THIS.[ИМЯ операции](%PARAM%.P_CLIENT => '''||P_CLIENT||''', %VAR%.V_DOG =>'''||V_DOG ||''' %>');
+ поставить галку на Дополнительно- Выводить команды в буфер сессии |
Похожая ситуация, поэтому спрошу тут.
Несколько разных ТБП имеют одинаковые имена простых операций (пусть будет Fly() - специально так сделано).
Возможно ли вызвать простую операцию через PLPCALL + передать ИД экземплера (вычисленного) не зашивая название этого ТБП в коде?
При использовании синтаксиса:
Код: | '<% PLPCALL [CLASS_ID].[ИМЯ операции]() %>' |
Я смогу в момент вызова определить 'CLASS_ID' объекта, но не могу передать ИД этого объекта (а операция простая и ИД нужен обязательно, т.е. не может быть пустым).
Проблема в том, что со временем могут появиться новые ТБП с простой операцией Fly() и нужно будет их вызывать.
Не заводить же кучу переменных под каждый ТБП (V_THIS001, .... V_THIS102) |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Авг 12, 2014 14:13   |
|
Полезность: Нет оценки
|
Damir пишет: | Alkov пишет: | А в чём сложность ? Вроде всё в документации есть.
Заводите на закладке переменные, переменную нужного типа например V_THIS
и вызываете
stdio.put_line_buf('<% PLPCALL %VAR%.V_THIS.[ИМЯ операции](%PARAM%.P_CLIENT => '''||P_CLIENT||''', %VAR%.V_DOG =>'''||V_DOG ||''' %>');
+ поставить галку на Дополнительно- Выводить команды в буфер сессии |
Похожая ситуация, поэтому спрошу тут.
Несколько разных ТБП имеют одинаковые имена простых операций (пусть будет Fly() - специально так сделано).
Возможно ли вызвать простую операцию через PLPCALL + передать ИД экземплера (вычисленного) не зашивая название этого ТБП в коде?
При использовании синтаксиса:
Код: | '<% PLPCALL [CLASS_ID].[ИМЯ операции]() %>' |
Я смогу в момент вызова определить 'CLASS_ID' объекта, но не могу передать ИД этого объекта (а операция простая и ИД нужен обязательно, т.е. не может быть пустым).
Проблема в том, что со временем могут появиться новые ТБП с простой операцией Fly() и нужно будет их вызывать.
Не заводить же кучу переменных под каждый ТБП (V_THIS001, .... V_THIS102) |
Насколько я знаю, никто не мешает вызвать
Код: | <% PLPCALL cast_to([CLASS_ID],%VAR%.V_THIS).[ИМЯ операции](... |
|
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Вт Авг 12, 2014 17:18   |
|
Полезность: 1
|
PLPCALL синтаксис, вроде не предусматривает передачи ссылки на экземпляр через инициализацию значения this вызываемой операции ( в отличие от CALL ) , можно только параметры/переменные
См. пример
IP_CARDS::CLIENT_MANAGER
Код: |
function to_plpcall(p_ref_obj reference, p_method ref [IDCARD_DOST_METD]
...
if p_ref_obj is null then
result:='<% PLPCALL ['||p_method.[METHOD_REF].[CLASS_ID]||'].['||p_method.[METHOD_REF].[SHORT_NAME]||']() %>';
else
result:='<% CALL '||p_method.[METHOD_REF].[CLASS_ID]||' '||p_method.[METHOD_REF].[SHORT_NAME]||' '||p_ref_obj||' %>';
end if;
|
Но соотв.., надо не забыть отличия выполнения секции проверки вызываемой операции в PLPCALL и CALL синтаксисе, если критично выполнение секции проверки . |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Ср Авг 13, 2014 11:14   |
|
Полезность: Нет оценки
|
Random пишет: | Насколько я знаю, никто не мешает вызвать
Код: | <% PLPCALL cast_to([CLASS_ID],%VAR%.V_THIS).[ИМЯ операции](... |
|
Вот так работает
Код: | <% PLPCALL %VAR%.V_THIS.[OPEN_MONTH]( ) %> |
А вот так - не работает
Код: | Не удалось разобрать команду, начиная с указанной '-->' позиции:
<% PLPCALL cast_to( [BRANCH], %VAR%.V_THIS) --> .[OPEN_MONTH]( ) %>.
|
|
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Ср Авг 13, 2014 11:17   |
|
Полезность: Нет оценки
|
vtar пишет: |
Но соотв.., надо не забыть отличия выполнения секции проверки вызываемой операции в PLPCALL и CALL синтаксисе, если критично выполнение секции проверки . |
Выполнение секции проверки критично (т.е. необходимо). |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Ср Авг 13, 2014 12:10   |
|
Полезность: Нет оценки
|
На счот проверки, похоже я лажанулся (сказанное имет смысл при простом вызове в коде, а не командами CALL и PLPCALL). Так что можно попробовать CALL. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Авг 13, 2014 12:29   |
|
Полезность: Нет оценки
|
Damir пишет: |
А вот так - не работает
|
Да, признаю себя ослом.
Почитал документацию.
Для того, чтобы передать значение, в строке вызова PLPCALL можно использовать:
%PARAM%
%VAR%
%COLLECTION%
%THIS% - доступна, но только для вызывающей операции.
Так что то, что ты хочешь, сделать можно, но только если вызываемая операция не будет обращаться к this.
Например, так:
stdio.put_line_buf('<% PLPCALL [ITEST].[SHOW]( %PARAM%.P_THIS => '||v_this||' ) %>');
то есть в операции SHOW есть параметр P_THIS, который эта операция будет использовать так, как другие операции используют this. |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Ср Авг 13, 2014 12:43   |
|
Полезность: Нет оценки
|
Вот так работает с любыми операциями любых классов
Код: |
V_OPER varchar(250);
V_THIS varchar(250);
begin
null;
if V_1 then -- 7104872245 PR_CRED
V_THIS := '7104872245';
V_OPER := 'PR_CRED EDIT_LAST';
elsif V_2 then -- 15787742092 MAIN_DOCUM
V_THIS := '15787742092';
V_OPER := 'MAIN_DOCUM LOOK' ;
end if;
stdio.put_line_buf('<% CALL ' || v_oper || ' ' || V_THIS || '%>');
end;
|
V_1, V_2 - логика на форме
Пример сваял на основе дистрибутива CALL_PRINT_EXP (с) ЦФТ |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Чт Авг 14, 2014 05:49   |
|
Полезность: Нет оценки
|
vtar пишет: | На счот проверки, похоже я лажанулся (сказанное имет смысл при простом вызове в коде, а не командами CALL и PLPCALL). Так что можно попробовать CALL. |
CALL - получилось вызвать простую операцию с передачей THIS.
там другая проблема - нет возможности передать параметры. |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Чт Авг 14, 2014 06:03   |
|
Полезность: Нет оценки
|
Random пишет: |
Например, так:
stdio.put_line_buf('<% PLPCALL [ITEST].[SHOW]( %PARAM%.P_THIS => '||v_this||' ) %>');
то есть в операции SHOW есть параметр P_THIS, который эта операция будет использовать так, как другие операции используют this. |
Это не совсем правильный подход.
При таком вызове в this передается null.
А в EXECUTE() накладывается блокировка на this (при this = null в каких-то случаях блокируется таблица класса целиком ).
Т.е. при таком подходе надо самостоятельно отрабатывать блокировку this - напрягает.
Более правильный подход - обертка каждой простой операции в групповую (с параметром p_this) + из тела групповой делать вызов p_this.[простая операция].
Но как-то это коряво всё.
Был оператор CALL - не позволял передать параметры.
Попытались дать возможность передать параметры - сделали PLPCALL - потеряли возможность передать ИД объекта.
PS: картина маслом: 'Опять двойка!' |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Чт Авг 14, 2014 06:33   |
|
Полезность: Нет оценки
|
Damir пишет: | Random пишет: |
Например, так:
stdio.put_line_buf('<% PLPCALL [ITEST].[SHOW]( %PARAM%.P_THIS => '||v_this||' ) %>');
то есть в операции SHOW есть параметр P_THIS, который эта операция будет использовать так, как другие операции используют this. |
Это не совсем правильный подход.
При таком вызове в this передается null.
А в EXECUTE() накладывается блокировка на this (при this = null в каких-то случаях блокируется таблица класса целиком ).
Т.е. при таком подходе надо самостоятельно отрабатывать блокировку this - напрягает.
Более правильный подход - обертка каждой простой операции в групповую (с параметром p_this) + из тела групповой делать вызов p_this.[простая операция].
|
Обертка - тоже не правильно.
Есть ведь еще секция валдации (проверки), и клиент-скрипт - надо чтобы они тоже отрабатывали.
удовлетворяющего решения не найдено.
Первое место получает креатив от Random
Код: | <% PLPCALL cast_to([CLASS_ID],%VAR%.V_THIS).[ИМЯ операции](... |
Как думаете когда-нить такое будеть реализовано? |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Чт Авг 14, 2014 08:48   |
|
Полезность: Нет оценки
|
Damir пишет: | vtar пишет: | На счот проверки, похоже я лажанулся (сказанное имет смысл при простом вызове в коде, а не командами CALL и PLPCALL). Так что можно попробовать CALL. |
CALL - получилось вызвать простую операцию с передачей THIS.
там другая проблема - нет возможности передать параметры. |
Параметры - низя, а переменные и глобальные переменные из глобальных описаний - можно.
Для этого нужно предварительно их присвоить:
::[CLASS].[OPER].V_VARIABLE := 'sample';
stdio.put_line_buf(<%CALL %>);
Последний раз редактировалось: Random (Чт Авг 14, 2014 08:59), всего редактировалось 2 раз(а) |
|
 |
|