Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пн Июл 07, 2014 06:15  Представление с фильтром - как получить результат в массив? |
|
Полезность: Нет оценки
|
Добрый день.
У операции есть переменная - массив указателей на [...] + привязано представление + динамический фильтр. Все это на вкладке операции 'Свойства\Переменные'.
На форме операции этому массиву (pl/sql таблица) указателей соответствует кнопка (нихай будет 'Выборка').
Пользователь выставляет на форме параметры, потом жмет кнопку 'Выборка' - глазами контролирует правильность выборки (там динамический фильтр работает).
Потом выделяет все записи - этим самым заполняет массив. После чего по кнопке Ok звпускается списочная операция.
Задача: Исключить работу оператора. Т.е. необходимо заполнять массив ссылок программно. Грубо: сэмулировать нажатие кнопки 'Выборка' + выбор всех записей.Интерисует 'системный подход'. Не хочу писать запрос в теле операции (повторять). Хотелось бы просто заполнить массив какой-нить системной функцией.
Есть готовое системное решение этой задачи?
PS: я представляю, что это работа клиентской программы (Навигатора). Он парсит динамический фильтр, подставляет переменные и параметры, генерит запрос из мета-информации. Мне хочется на сервере иметь этот функционал (для вызова из тела операции) |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Пн Июл 07, 2014 08:18   |
|
Полезность: Нет оценки
|
"Грубо":
Может сделать еще одну переменную (is_сработал_автомат).
Выполнить в клиент-скрипте Код: | call Form1.Scriptpostevent(Выборка, "CLICK") |
Также в клиент-скрипте обработать нажатие Выборка. В котором, если переменная is_сработал_автомат = 1, тогда пробежаться по таблице (гриду?), выделить все данные и нажать ОК (как описано выше).
Если хочешь на сервере выполнять обработку переменных, то используй в клиент-скрипте
Код: | Call Form1.ScriptServerValidate(Nothing, "P_INFO_в_серверном_валидаторе") |
И делай обработку на сервере. А затем жми ОК.
P.S. "Парсера" условий (фильтра) дистрибутивного не видел. |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пн Июл 07, 2014 12:00   |
|
Полезность: Нет оценки
|
Reddom пишет: | "Грубо":
Может сделать еще одну переменную (is_сработал_автомат).
Выполнить в клиент-скрипте Код: | call Form1.Scriptpostevent(Выборка, "CLICK") |
|
т.е. в джоб засунуть на сервере - никак.
Пичалька, однако....
ну и ладно. |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Пн Июл 07, 2014 12:18   |
|
Полезность: Нет оценки
|
Damir пишет: |
т.е. в джоб засунуть на сервере - никак.
Пичалька, однако....
ну и ладно. |
Если вся логика делается в Проверке и Теле операции (без клиент-скрипта), то можно вызвать из групповой операции без параметров и переменных сначала валидацию (->) последовательно по всем необходимым валидациям p_info, затем тело операции (.). А групповую операцию добавить в job.
Вообще, хотелось бы увидеть операцию. Я по описанию слабо представляю проблему. |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пн Июл 07, 2014 13:48   |
|
Полезность: Нет оценки
|
Reddom пишет: | Если вся логика делается в Проверке и Теле операции (без клиент-скрипта), то можно вызвать из групповой операции без параметров и переменных сначала валидацию (->) последовательно по всем необходимым валидациям p_info, затем тело операции (.). А групповую операцию добавить в job.
|
Вся логика (выборка) сейчас делается в Представлении + накладываемый динамический фильтр с параметрами операции.
Инициирует выполнение логики (выполнение выборки + заполнение массива) сейчас пользователь:путем выставления парамтров-галочек на форме + нажатия на кнопку 'выбрать' (навигатор выполняет выборку с диначиским фильтром)+ пользователь выбирает все записи.
PS: Reddom - спасибо за участие. Предлагаю Вам больше не грузиться на эту тему.
А грузиться на эту тему предлагаю архитекторам-ядерщикам-технологам. |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Вт Июл 08, 2014 09:20   |
|
Полезность: Нет оценки
|
Damir пишет: | Вся логика (выборка) сейчас делается в Представлении + накладываемый динамический фильтр с параметрами операции.
Инициирует выполнение логики (выполнение выборки + заполнение массива) сейчас пользователь:путем выставления парамтров-галочек на форме + нажатия на кнопку 'выбрать' (навигатор выполняет выборку с диначиским фильтром)+ пользователь выбирает все записи. |
- Слишком много слов для простого пирата! Так что вам нужно? (с)
Вытащить динамический фильтр из переменной? |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Июл 08, 2014 09:25   |
|
Полезность: Нет оценки
|
Random пишет: | Вытащить динамический фильтр из переменной? |
Привет, Рандом-чик.
В идеале, мне нужно получить выборку - заполненный массив (с учетом динамического фильтра). |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Вт Июл 08, 2014 10:22   |
|
Полезность: Нет оценки
|
А почему нельзя сделать так, зачем повторять запрос если можно сделать селект из вьюхи
- динамический фильтр это будет типа
p1 := '40817%'
select from view%rowtype w where w.col1 like p1
- дальше пихаем полученные ID отселектированных объектов в table и над этой table вызываем списочную операцию
http://www.cftclub.ru/viewtopic.php?t=1414&highlight=%F1%EF%E8%F1%EE%F7%ED |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Вт Июл 08, 2014 10:32   |
|
Полезность: Нет оценки
|
vtar пишет: | А почему нельзя сделать так, зачем повторять запрос если можно сделать селект из вьюхи
|
да!!!!
1) вьюха уже подцеплена - зачем мне в коде жёстко название прописывать? Т.е. если у ТБП несколько вьюх, я сменил привязку вьюхи к переменной (мышкой делается) - то потом еще надо анализировать код!
2) ДИнамический фильтр достаточно сложный. Что-вроде:
Код: | {&BH_REF} = [P_DST_BATCH_HEAD]
and -- портянка
|
и парсить этот код вручную в pl-plus потом (подставляя 'С1'...'C5') ну ваще неохото. |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Вт Июл 08, 2014 13:06   |
|
Полезность: Нет оценки
|
Цитата: | 1) вьюха уже подцеплена - зачем мне в коде жёстко название прописывать? Т.е. если у ТБП несколько вьюх, я сменил привязку вьюхи к переменной (мышкой делается) - то потом еще надо анализировать код! |
Попробуй посмотреть такой запрос
Код: | select mp.method_id, mp.name, mp.crit_id, (select c.short_name from criteria c where c.id = mp.crit_id) from method_parameters mp where mp.method_id = &method$id |
P.S. &method$id это pl/plus. |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Вт Июл 08, 2014 13:07   |
|
Полезность: Нет оценки
|
Ну а дальше динамический запрос, через [RUNTIME]::[PLP] либо sql через execute immediate |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Ср Июл 09, 2014 04:52   |
|
Полезность: Нет оценки
|
Reddom пишет: | Цитата: | 1) вьюха уже подцеплена - зачем мне в коде жёстко название прописывать? Т.е. если у ТБП несколько вьюх, я сменил привязку вьюхи к переменной (мышкой делается) - то потом еще надо анализировать код! |
Попробуй посмотреть такой запрос
Код: | select mp.method_id, mp.name, mp.crit_id, (select c.short_name from criteria c where c.id = mp.crit_id) from method_parameters mp where mp.method_id = &method$id |
P.S. &method$id это pl/plus.
Ну а дальше динамический запрос, через [RUNTIME]::[PLP] либо sql через execute immediate
|
Господа архитекторы-софтостроители!
Наконец-то я могу сформулировать требования к системе ЦФТ.
При компиляции (трансляции) должны генериться функции получения выборок из вьюх ассоциированных с параметрами с учетом наложения динамического фильтра.
Вся исходная информация в метаданных есть: &method$id, method_parameters, criteria + там же где-то динамический фильтр.
Т.е. это удобно сделать МАКРОСОМ на этапе компиляции - динамический фильтр должен быть откомпилирован в pl/plus функцию.
PS: Random-чик! По-твоему, идея реализуема? |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Ср Июл 09, 2014 08:49   |
|
Полезность: Нет оценки
|
Цитата: | динамический фильтр должен быть откомпилирован в pl/plus функцию. |
Дык pl/sql функция же медленней фильтра в разы,
или под динамическим фильтром понимаешь фильтр уже с вызовами функций ? |
|
 |
Reddom Участник со стажем
Вступление в Клуб: 25.01.2013
|
Ср Июл 09, 2014 10:00   |
|
Полезность: Нет оценки
|
Цитата: | Т.е. это удобно сделать МАКРОСОМ на этапе компиляции - динамический фильтр должен быть откомпилирован в pl/plus функцию. |
Так сделай сам компилируемый макрос. Примеры есть в библиотеках ::[RUNTIME]. Один из:
Код: | pragma macro (rb1,'begin [0]:= ''rollback to sp''||[2]||''[1]'' ; end;',process,substitute); |
Т.е. в [0] ты формируешь код, который соберется при компиляции. |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Ср Июл 09, 2014 10:49   |
|
Полезность: Нет оценки
|
Reddom пишет: | Так сделай сам компилируемый макрос. Примеры есть в библиотеках ::[RUNTIME]. Один из: |
Кто-то из нас тормозит. Наверное - я.
Как делать макрос, вызывать pl/sql функцию на этапе компиляции - я знаю.
Итак, дано:
Есть метаинформация о выполняемой функции.
Оттуда можно взять информацию о параметрах, привязанных к этим параметрам вьюшках и динамических фильтрах.
Динамический фильтр находится тут:
Код: | select mp.crit_formula from COMP.method_parameters mp |
Требуется:
каким-то мадагаскаром перевести содержимое mp.crit_formula для конкретного параметра в pl/plus. Как - я не понимаю.
Пример содержимого mp.crit_formula:
Код: |
{&C_FILIAL} = [V#FILIAL]
and
(
(
[P#HOUSE_FIND] ='1'
and
(
([V#HOUSE] is not null and {C_HOUSE} =[V#HOUSE] )
or
( [V#HOUSE] is null and
{&C_STREET} = [V#STREET] and {C_HNAME} =UPPER([V#HOUSE_NAME])
and ( ( {C_PART_1} = [V#HOUSE_PART] ) or ({C_PART_1} is null and [V#HOUSE_PART] is null ) )
)
)
)
or
[P#HOUSE_FIND] !='1'
)
and
( [P#FLAT_FIND]='1' and {C_FLAT_NUM} =[V#FLAT_NUM]
or
[P#FLAT_FIND]!='1'
) |
Я мыслю, что такой компилятор должен быть в составе 'платформы развития'. Написать парсер самостоятельно за конечное время я не смогу. |
|
 |
|