Вызов экранной формы простой операции из списочной
На страницу Пред. 1, 2
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Random Эксперт
Вступление в Клуб: 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 Эксперт
Вступление в Клуб: 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;
|
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|