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

&BASE$EXECUTE - как в ней определить из какой функции вы

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
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);

... и ничего больше не хочу, если честно.
Дело Ваше - использовать это или уже и так хорошо.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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