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

Вызов экранной формы простой операции из списочной
На страницу Пред.  1, 2
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
Random
Эксперт
Резидент CftClub


Вступление в Клуб: 27.06.2011
СообщениеЧт Авг 14, 2014 08:50    Ответить с цитатой
Полезность: Нет оценки
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 - напрягает.

У вызываемой операции можно просто поставить крыжик "Допускает вызов при пустом списке экземпляров"
Random
Эксперт
Резидент CftClub


Вступление в Клуб: 27.06.2011
СообщениеЧт Авг 14, 2014 08:57    Ответить с цитатой
Полезность: Нет оценки
Damir пишет:

удовлетворяющего решения не найдено.
Первое место получает креатив от Random
Код:
<% PLPCALL cast_to([CLASS_ID],%VAR%.V_THIS).[ИМЯ операции](...

Как думаете когда-нить такое будеть реализовано?


Ну, я могу ещё предложить креатифф.
V_THIS - обобщённая ссылка типа REFERENCE "Ссылка на "OBJECT class""
в неё записывать ссылку в обобщённом виде "CLASS:ID" и вызывать стандартно
stdio.put_line_buf('<% PLPCALL %VAR%.V_THIS.[SHOW]( ) %>')

Только вот это тоже не работает.

Нда. недореализовано...
vtar
Эксперт
Неподтвержденный


Вступление в Клуб: 20.03.2009
СообщениеЧт Авг 14, 2014 10:04    Ответить с цитатой
Полезность: 1
Random пишет:

У вызываемой операции можно просто поставить крыжик "Допускает вызов при пустом списке экземпляров"

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

::[PR_CRED].[EDIT_LAST_EXT].G_THIS := 7104872245;

а в расширении вызываемой - устанавливать в THIS

Код:

begin
   &BASE$SETVARS;
   
   if p_message = 'DEFAULT' then
      if  G_THIS is not null then
         this := G_THIS;
      end if;
   end if;
   
   &BASE$VALIDATE;
   
   &BASE$GETVARS;
end;


Я проверил - так работает, и при PLPCALL вызываемая операция подхватывает переданный this и выполняется над ним.
vtar
Эксперт
Неподтвержденный


Вступление в Клуб: 20.03.2009
СообщениеЧт Авг 14, 2014 10:08    Ответить с цитатой
Полезность: Нет оценки
Random пишет:
Только вот это тоже не работает.

Нда. недореализовано...

Да, я тоже так хотел попробовать - не дает IBSO заполнить class ..

Т.е. похоже только так - конкретные %VAR%.V_THIS1 , ... , %VAR%.V_THIS5 каждые своего класса .
Damir
Участник - экстремал
Неподтвержденный


Вступление в Клуб: 29.03.2013
СообщениеЧт Авг 14, 2014 10:27    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
Т.е. похоже только так - конкретные %VAR%.V_THIS1 , ... , %VAR%.V_THIS5 каждые своего класса .


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

Код:

  declare
  lr_Method    ref [METHOD] := &METHOD$ID;
  ls_Class_id   varchar2(16) :=  rtl.object_class(V_THIS);
  begin
    -- begin pl/sql
    select max(mv.short_name)
      into ls_var_name
    from method_variables   mv
      , classes       c
         where mv.method_id = lr_Method
          and upper(mv.short_name) like 'V_THIS_%'
          and c.id          = mv.class_id
          and c.target_class_id = ls_Class_id
        ;   
    -- end pl/sql
    if ls_var_name is null then
      pragma error('Опреация не знает про тип: '||ls_Class_id);
    end if;
  end;
       
       
ls_tmp := replace(replace(
    '<% PLPCALL %VAR%.<<VAR_NAME>>.[<<OPER_SHORT_NAME>>]( '||
      '%VAR%.... => ''TRUE'' ,'||
      '%PARAM%.....   => 12 '||
    ')%>'
    , '<<VAR_NAME>>'      , ls_var_name            )
    , '<<OPER_SHORT_NAME>>'   , this.[METH_SHORT_NAME]   )      
;


PS: динамическое, блин, приведение типов
vtar
Эксперт
Неподтвержденный


Вступление в Клуб: 20.03.2009
СообщениеЧт Авг 14, 2014 16:11    Ответить с цитатой
Полезность: Нет оценки
Damir пишет:
угу, только так.

На всякий случай - нашел, как с одним VAR сделать (как затолкать реквизит class в REFERENCE).

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

Код:

V_OPER varchar(250);

function get_ref(v_id number, v_class varchar(100) ) returning [REFERENCE] is
   ret [REFERENCE];
begin

   if  v_class in  ('PR_CRED', 'KRED_PERS' ) then
      select x(x) in ::[PR_CRED] all    where   v_class in  ('PR_CRED', 'KRED_PERS' )     and      x = v_id into ret;    
   end if;
   
   if  v_class in  ('MAIN_DOCUM' ) then
      select x(x) in ::[MAIN_DOCUM] all    where   v_class in  ('MAIN_DOCUM' )     and      x = v_id into ret;    
   end if;
   
   
   return ret;
end;




begin
   null;
   
   if V_1 then         -- 7104872245 PR_CRED
      V_THIS := get_ref(7104872245, 'PR_CRED');
      ::[PR_CRED].[EDIT_LAST_EXT].G_THIS := 7104872245;
      V_OPER := '[EDIT_LAST]()';   
   elsif V_2 then      -- 15787742092 MAIN_DOCUM
      V_THIS :=  get_ref(15787742092, 'MAIN_DOCUM');
      ::[MAIN_DOCUM].[LOOK_EXT].G_THIS := 15787742092;
      V_OPER := '[LOOK]()'   ;
   end if;
   
   
   
   stdio.put_line_buf('<% PLPCALL %VAR%.V_THIS.'|| v_oper || ' ' || '%>');
   
end;

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

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