CftClub.ru
Клуб специалистов ЦФТ-Банк

Вызов экранной формы простой операции из списочной
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 раз(а)
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru