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

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


Я мыслю, что такой компилятор должен быть в составе 'платформы развития'. Написать парсер самостоятельно за конечное время я не смогу.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

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