Представление с фильтром - как получить результат в массив?
На страницу Пред. 1, 2
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Июл 09, 2014 13:24   |
|
Полезность: Нет оценки
|
Damir пишет: | Я мыслю, что такой компилятор должен быть в составе 'платформы развития'. Написать парсер самостоятельно за конечное время я не смогу. |
Сделать можно всё.
Вопрос только во времени.
С одной стороны, сделать парсер для конкретной задачи с небольшим количеством вариантов и потом по мере увеличения вариантов его допиливать - невелика работа. Но она тем не менее есть, и это даже не пара часов.
С другой стороны, вызов операций с эмуляцией действий пользователя (то есть через АРМ Навигатор) имеет свои ограничения (нет job'ов и скорость не ахти).
Я могу только подать идею парсера.
Damir, обрати внимание, что у вьюшки есть список колонок с именами criteria_columns.
Можно выполнить replace в фильтре.
у операции фильтра есть список параметров method_parameters.
у операции фильтра есть список переменных method_variables.
Ими тоже можно заменить в фильтре ключевые строки.
id фильтра = id вьюшки.
ну и, напоследок, если написать в фильтре что-то типа and 1 in (select 1 from dual) - для пользователя IBS это будет работать, что наводит нас на мысль, что фильтр - уже написан в pl/sql |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Чт Июл 10, 2014 06:00   |
|
Полезность: Нет оценки
|
Random пишет: | Damir пишет: | Я мыслю, что такой компилятор должен быть в составе 'платформы развития'. Написать парсер самостоятельно за конечное время я не смогу. |
Сделать можно всё.
Вопрос только во времени.
|
В идеале, в теле операции нужно иметь возможность получать выборку из привязанной вьюшки с учетом динамического фильтра.
что-то вроде:
Код: | array_of_refs := [param_name_2].Get_refs_for_fill(); |
Вариантов реализации куча. Можно в интерфейсном пакете операции такие функции генерить, например. А Get_refs_for_fill() сделать поддерживаемой ядром функцией каждого параметра.
'платформу развития' еще бы подразвили чуток.
Random-чик.... как бы такой функционал в ядро засунуть?
Чтоб я его мог пользовать безвозмездно, т.е. даром - а? |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пт Июл 11, 2014 08:17   |
|
Полезность: Нет оценки
|
Damir пишет: | Random-чик.... как бы такой функционал в ядро засунуть?
Чтоб я его мог пользовать безвозмездно, т.е. даром - а? |
ИМХО, тебе это не поможет, потому что для впиливания нужна заявка от банка; выйдет явно не сейчас, а когда - хз; и, наконец, если впилится, то в новую версию ТЯ, а у вас, насколько я понял, 7.1.1.2, и меняться не собирается? |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пт Июл 11, 2014 09:06   |
|
Полезность: Нет оценки
|
И вообще...
Код: | declare
n number;
p varchar2(32767);
begin
for i in (
select short_name
, crit_id
, crit_formula
, method_id
from method_parameters where /*method_id = '6098889' and*/ crit_formula like '%[%]%' and crit_formula like '%{%}%' and crit_formula like '%#%'
) loop
-- dbms_output.put_line(i.crit_formula);
dbms_output.put_line('-----------');
dbms_output.put_line(i.method_id||'->'||i.crit_id);
dbms_output.put_line(i.crit_formula);
select package_name into p from methods where id = i.method_id;
for k in (select * from method_parameters where method_id = i.method_id ) loop
i.crit_formula := replace(i.crit_formula, '['||k.short_name||']', ''''||'а здесь как-то надо получить значение параметра'||'''');
i.crit_formula := replace(i.crit_formula, '%PARAM%.'||k.short_name, ''''||'не самая лучшая замена'||'''');
-- dbms_output.put_line(i.crit_formula);
end loop;
for k in (select * from method_variables where method_id = i.method_id ) loop
i.crit_formula := replace(i.crit_formula, '['||k.short_name||']', p||'.'||k.short_name);
i.crit_formula := replace(i.crit_formula, '%PARAM%.'||k.short_name, p||'.'||k.short_name); --не самая лучшая замена
-- dbms_output.put_line(i.crit_formula);
end loop;
n := 0;
for k in (select x.* from criteria_columns x where criteria_id = i.crit_id and unvisible = '0' order by position) loop
n := n + 1;
i.crit_formula := replace(i.crit_formula, '{'||k.alias||'}', 'C_'||n);
i.crit_formula := replace(i.crit_formula, '{&'||k.alias||'}', 'REF'||n);
-- dbms_output.put_line(i.crit_formula);
end loop;
n := 0;
for k in (select x.* from criteria_columns x where criteria_id = i.crit_id and unvisible = '2' order by position) loop
n := n + 1;
i.crit_formula := replace(i.crit_formula, '{&'||k.alias||'}', 'U_'||n);
i.crit_formula := replace(i.crit_formula, '{'||k.alias||'}', 'U_'||n); -- совершенно на всякий случай
-- dbms_output.put_line(i.crit_formula);
end loop;
dbms_output.put_line(i.crit_formula);
for k in (select short_name from criteria where id = i.crit_id) loop
dbms_output.put_line('select * from '||k.short_name||' where '||i.crit_formula);
end loop;
end loop;
end; |
Извини, но дальше копать у меня совершенно нет времени
Могу подсказать только, что для вытаскивания значений параметров операции можно использовать макрос, исполняющийся во время компиляции, вызывающий функцию, которая посмотрит в method_parameters и вернёт строчку типа
Код: | array('P_Параметр_1'):=P_Параметр_1;
array('P_Параметр_2'):=P_Параметр_2;
--и т.д. | ,
которая будет размещена в PL/PLUS-коде операции (не видна, но будет участвовать в компиляции. Потом можно посмотреть в pl/sql-пакете) |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Пт Июл 11, 2014 12:42   |
|
Полезность: Нет оценки
|
Random пишет: | И вообще...
...
Потом можно посмотреть в pl/sql-пакете) |
Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой). |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пн Июл 14, 2014 07:42   |
|
Полезность: Нет оценки
|
Reddom пишет: |
Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой). |
Очевидно, что создание представлений происходит непосредственно в АРМе Администратора словаря. |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Пн Июл 14, 2014 08:07   |
|
Полезность: Нет оценки
|
devor пишет: | Reddom пишет: |
Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой). |
Очевидно, что создание представлений происходит непосредственно в АРМе Администратора словаря. |
Я имел ввиду вью, которая формируется согласно условию (фильтру) в параметре операции и представлению. Должен быть пакет которые ее собирает. И создание представлений точно не в АРМе. Так как компилировать представления и операции можно, например:
Код: | data_views.create_vw_crit(this%id, null); |
или
Код: | method.recompile (this%id); |
|
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пн Июл 14, 2014 09:30   |
|
Полезность: Нет оценки
|
Reddom пишет: |
Я имел ввиду вью, которая формируется согласно условию (фильтру) в параметре операции и представлению. |
В параметре ничего не формируется - там указано существующее представление, к которому просто добавляется дополнительное условие. Точно так же, как на представления накладываются ограничение на выборку строк в запросе.
Reddom пишет: |
И создание представлений точно не в АРМе. Так как компилировать представления и операции можно, например:
Код: | data_views.create_vw_crit(this%id, null); |
или
Код: | method.recompile (this%id); |
|
Какая связь между компиляцией и созданием? Понятно ли, что если в АРМе ты накидал на форму колонок, то нигде кроме самого АРМа этой информации еще нет? Вплоть до сохранения в словаре? |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Пн Июл 14, 2014 12:07   |
|
Полезность: Нет оценки
|
devor пишет: |
Какая связь между компиляцией и созданием? Понятно ли, что если в АРМе ты накидал на форму колонок, то нигде кроме самого АРМа этой информации еще нет? Вплоть до сохранения в словаре? |
Ну, во-первых, компиляция очень условное понятие в ЦФТ, так как по сути происходит просто трансляция с pl-plus в pl/sql (sql) (оба языка высокого уровня). Создание имеется ввиду именно oracle views и packages, именно это и происходит при так называемой "компиляции". Исходный код (pl-plus), как раз таки храниться в БД в таблице sources. И вообще все храниться по табличкам в БД oracle (criteria_columns, method_parameters, classes и т.п.). А армы просто визуализируют данные и посылают команды. |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Пн Июл 14, 2014 13:12   |
|
Полезность: Нет оценки
|
Reddom пишет: | devor пишет: |
Какая связь между компиляцией и созданием? Понятно ли, что если в АРМе ты накидал на форму колонок, то нигде кроме самого АРМа этой информации еще нет? Вплоть до сохранения в словаре? |
Ну, во-первых, компиляция очень условное понятие в ЦФТ, так как по сути происходит просто трансляция с pl-plus в pl/sql (sql) (оба языка высокого уровня). Создание имеется ввиду именно oracle views и packages, именно это и происходит при так называемой "компиляции". Исходный код (pl-plus), как раз таки храниться в БД в таблице sources. И вообще все храниться по табличкам в БД oracle (criteria_columns, method_parameters, classes и т.п.). А армы просто визуализируют данные и посылают команды. |
Давай ты не будешь пытаться объяснить то, в чем сам не до конца разбираешься, ок?  |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Пн Июл 14, 2014 14:11   |
|
Полезность: Нет оценки
|
devor пишет: |
Давай ты не будешь пытаться объяснить то, в чем сам не до конца разбираешься, ок?
|
Тогда расскажи ты как на самом деле.
Я буду рад ознакомиться и проверить твою версию.
Форум для того и создан, чтобы делиться знаниями  |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Вт Июл 15, 2014 10:42   |
|
Полезность: Нет оценки
|
Reddom пишет: | devor пишет: |
Давай ты не будешь пытаться объяснить то, в чем сам не до конца разбираешься, ок?
|
Тогда расскажи ты как на самом деле.
Я буду рад ознакомиться и проверить твою версию.
Форум для того и создан, чтобы делиться знаниями  |
Уже рассказал и поделился.
И вместо мощных выводов в стиле "И создание представлений точно не в АРМе" возьми да и включи трейс и профайлер для сессии АРМа, создай представление в нем, а потом смотри запросы и вызываемые пакеты. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Июл 15, 2014 13:23   |
|
Полезность: Нет оценки
|
Reddom пишет: | Random пишет: | И вообще...
...
Потом можно посмотреть в pl/sql-пакете) |
Random, интересно, есть возможность у ядерщиков узнать в каком пакете производиться расшифровка формулы представления, и даже какой функцией (процедурой). |
Если у вас есть эта возможность, опубликуйте.
А если это был вопрос, то расставляйте вопросительные знаки, пожалуйста.
PS: Вы оба правы. |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Вт Июл 15, 2014 14:48   |
|
Полезность: Нет оценки
|
Random пишет: |
А если это был вопрос, то расставляйте вопросительные знаки, пожалуйста.
|
Это был вопрос.
devor пишет: |
включи трейс
|
Вот что примечательного в трейсе:
Код: | BEGIN :RESULT :=IBS.Data_Views.Create_Criterion3(:ID,:NAME,:SN,:CLASS,:COND,:FLAGS,:ORIGHTS,:HATTR,:TMPDEF,:PROP,:CELL,:ORDER,:AG,:CARD); END;
BINDS #4574675488:
Bind#2
value="***. 123"
Bind#3
value="VW_CRIT_***_T_1"
Bind#4
value="***_RPT_CTRL"
Bind#5
value="type main is
select d(1 : d) in dual%rowtype;
"
Bind#10
value="|NoSystem|NoID|PlPlus|AllMethods Y" |
Т.е. текст pl-plus был выбран с окна, но функция, которая формировала находится в БД: Create_Criterion3. Также нашел в трейсе таблицы соответствия наименований колонок (альясы колонок) и параметров операций их реальных объектов БД (глобальные переменные пакетов). Дальше шли функции преобразования pl-plus текста в pl/sql.
Спасибо за идею. Только утвердился в своих некоторых догадках фактами. |
|
 |
devor Профи
Вступление в Клуб: 13.02.2012
|
Вт Июл 15, 2014 14:56   |
|
Полезность: Нет оценки
|
Reddom пишет: |
Вот что примечательного в трейсе:
Код: | BEGIN :RESULT :=IBS.Data_Views.Create_Criterion3(:ID,:NAME,:SN,:CLASS,:COND,:FLAGS,:ORIGHTS,:HATTR,:TMPDEF,:PROP,:CELL,:ORDER,:AG,:CARD); END;
BINDS #4574675488:
Bind#2
value="***. 123"
Bind#3
value="VW_CRIT_***_T_1"
Bind#4
value="***_RPT_CTRL"
Bind#5
value="type main is
select d(1 : d) in dual%rowtype;
"
Bind#10
value="|NoSystem|NoID|PlPlus|AllMethods Y" |
Т.е. текст pl-plus был выбран с окна, но функция, которая формировала находится в БД: Create_Criterion3. Также нашел в трейсе таблицы соответствия наименований колонок (альясы колонок) и параметров операций их реальных объектов БД (глобальные переменные пакетов). Дальше шли функции преобразования pl-plus текста в pl/sql.
Спасибо за идею. Только утвердился в своих некоторых догадках фактами. |
pl/plus в АРМе, далее функция plp2sql.criteria2plsql и триггеры формируют pl/sql. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|