&BASE$EXECUTE - как в ней определить из какой функции вы
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пт Май 30, 2014 08:26  &BASE$EXECUTE - как в ней определить из какой функции вы |
|
Полезность: Нет оценки
|
Здравствуйте.
Есть базовая операция с формой - 'A'.
Есть несколько операций 'B', 'C'... в которых прикреплена форма 'A' + Тело и проверка этих операций содержат макросы:
&BASE$EXECUTE, &BASE$VALIDATE
Вопрос: как в теле (и в функции проверки) операции 'A' определить имя вызывающей операции (т.е. 'B', 'C'...) ?
Мысли вслух:
Парсить результат функции DBMS_UTILITY.FORMAT_CALL_STACK не очень-то хочется.
Вот Навигатор - есть у операции в системном меню 'системная информация' и Навигатор честно пишет:
Код: | Работает операция ::[A].[C]
Экранная форма принадлежит операции ::[A].[A] |
Т.е. в случае наследования формы в валидаторе и в теле базовой операции (в моём примере - в валидаторе и в теле ::[A].[A]) хочется иметь возможность получить вот это 'Работает операция ::[A].[C]'.
Как?
Последний раз редактировалось: Damir (Пт Май 30, 2014 13:47), всего редактировалось 1 раз |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Пт Май 30, 2014 08:38   |
|
Полезность: 1
|
Мне только такой способ известен
в А заводишь глобальную переменную V_CALL
В вызывающих операциях передаешь что надо
A.V_CALL = &method$;
A() ; -вызвали
В А смотришь, что пришло в V_CALL.
Т.е. через глобальные переменные пакетов. |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пт Май 30, 2014 09:22   |
|
Полезность: Нет оценки
|
vtar пишет: |
в А заводишь глобальную переменную V_CALL
|
Можно завести специальный параметр P_CALL_MATHOD
P_CALL_MATHOD и через него передавать Ид вызывающей функции.
Код: | P_CALL_MATHOD :=&METHOD$ID;
&BASE$SETVARS
&BASE$EXECUTE(this); |
Просто, я думал это реализовано как-то на уровне ядра.
Посмотрел, во что транслируется макрос &BASE$EXECUTE - ередается THIS, передается класс этого THIS.
&METHOD$ID - не передается.
Обидно, досадно, горько....
Ядершики ЦФТ! Дарю идею - безвозмездно! |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пт Май 30, 2014 09:27   |
|
Полезность: Нет оценки
|
Damir пишет: |
Можно завести специальный параметр P_CALL_MATHOD
|
Поясняю.... P_CALL_MATHOD - парметр операции (null по дефолту).
Этот параметр не нужен с точки зрения бизнес-логики.
Логично было бы его спрятать (подставлять при трансляции). |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пн Июн 02, 2014 07:42  Re: &BASE$EXECUTE - как в ней определить из какой функци |
|
Полезность: 1
|
Damir пишет: | З
Т.е. в случае наследования формы в валидаторе и в теле базовой операции (в моём примере - в валидаторе и в теле ::[A].[A]) хочется иметь возможность получить вот это 'Работает операция ::[A].[C]'.
Как? |
Код: | Select m.ID, m.class_id, m.short_name
from v$session s, methods m
where substr(s.action,instr(s.action,' ')+1)=M.ID
and s.sid = to_number(sys_context('IBS_SYSTEM','SID'))
|
|
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пн Июн 02, 2014 09:19  Re: &BASE$EXECUTE - как в ней определить из какой функци |
|
Полезность: Нет оценки
|
nav.current_form_method_id |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пн Июн 02, 2014 12:04  Re: &BASE$EXECUTE - как в ней определить из какой функци |
|
Полезность: Нет оценки
|
Random пишет: | nav.current_form_method_id |
Как раз через стек работает. Автор почему-то так не хочет. |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Июн 03, 2014 06:37  Re: &BASE$EXECUTE - как в ней определить из какой функци |
|
Полезность: Нет оценки
|
devor пишет: | Код: | Select m.ID, m.class_id, m.short_name
from v$session s, methods m
where substr(s.action,instr(s.action,' ')+1)=M.ID
and s.sid = to_number(sys_context('IBS_SYSTEM','SID'))
|
|
Если операция вызвана из Навигатора пользователем - работать будет.
Если операция вызвана из тела другой операции напрямую - проглючит. |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Июн 03, 2014 06:54  Re: &BASE$EXECUTE - как в ней определить из какой функци |
|
Полезность: Нет оценки
|
devor пишет: | Random пишет: | nav.current_form_method_id |
Как раз через стек работает. Автор почему-то так не хочет. |
Код: | function current_form_method_id return varchar2 is
s varchar2(32767);
n number;
m_id varchar2(100) := null;
begin
s := utils.call_stack;
[b] n := instr(s, 'Z$U$', 1);[/b] |
Как это будет работать в случае вызова операции напрямую из тела другой операции (т.е. форма не поднимается в этом случае).
Т.е.
1) Работает операция [A].[B] со своей формой
2) В теле операции [A].[B] - вызов напрямую из кода операции [A].[C]
3) Дальше - в теле [A].[C] стоит &BASE$EXECUTE(this); - вызов тела [A].[A]
Находясь в теле [A].[A] мне надо знать, что ....
- вызов произошел из операции [A].[C], а не из [A].[А]
информация, что вызов произошел из [A].[B] ничего не дает, т.к. в теле [A].[B] могут последовательно вызываться [A].[A] и [A].[С]
В конкретной задаче(своей) - заткнул передачей в доп. параметре вызывающего метода.
Причем, этот параметр должен заполняться только в случае вызова через макрос &BASE$EXECUTE - в остальных случаях он null.
Логично было бы поручить макросу &BASE$EXECUTE заполнение этого параметра. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Июн 03, 2014 09:36  Re: &BASE$EXECUTE - как в ней определить из какой функци |
|
Полезность: Нет оценки
|
Damir пишет: | devor пишет: | Random пишет: | nav.current_form_method_id |
Как раз через стек работает. Автор почему-то так не хочет. |
|
Зато это ядерное решение и парсится не только стек Oracle, но и Java для 2MCA.
Damir пишет: |
Код: | function current_form_method_id return varchar2 is
s varchar2(32767);
n number;
m_id varchar2(100) := null;
begin
s := utils.call_stack;
[b] n := instr(s, 'Z$U$', 1);[/b] |
Как это будет работать в случае вызова операции напрямую из тела другой операции (т.е. форма не поднимается в этом случае). |
Ну, как. Написано же - current_FORM_method. То есть операция, запущенная из АРМ Навигатор, даже если она запускалась через CALL-метод VBS.
Damir пишет: |
Т.е.
1) Работает операция [A].[B] со своей формой
2) В теле операции [A].[B] - вызов напрямую из кода операции [A].[C]
3) Дальше - в теле [A].[C] стоит &BASE$EXECUTE(this); - вызов тела [A].[A]
Находясь в теле [A].[A] мне надо знать, что ....
- вызов произошел из операции [A].[C], а не из [A].[А]
информация, что вызов произошел из [A].[B] ничего не дает, т.к. в теле [A].[B] могут последовательно вызываться [A].[A] и [A].[С]
В конкретной задаче(своей) - заткнул передачей в доп. параметре вызывающего метода.
Причем, этот параметр должен заполняться только в случае вызова через макрос &BASE$EXECUTE - в остальных случаях он null.
Логично было бы поручить макросу &BASE$EXECUTE заполнение этого параметра. |
Какой хитрый тебе нужен информаций.
Ты уверен, что этот выверт тебе нужен, и его нельзя решить проще?
Ну, если будешь парсить стек вызова, не забудь, пожалуйста, что в Oracle стек один, а в Java (в случае 2MCA) - совсем другой.
Для примера можешь посмотреть, как это сделано в REPS_DATA.LIB_DEBUG |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Июн 03, 2014 10:49  Re: &BASE$EXECUTE - как в ней определить из какой функци |
|
Полезность: Нет оценки
|
Random пишет: | Какой хитрый тебе нужен информаций.
Ты уверен, что этот выверт тебе нужен, и его нельзя решить проще?
|
Я свой очередной костыль вставил:
Код: | P_CALL_MATHOD :=&METHOD$ID;
&BASE$SETVARS
&BASE$EXECUTE(this); |
... и ничего больше не хочу, если честно.
Дело Ваше - использовать это или уже и так хорошо. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|