Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Организация фильтра на DW / 25 сообщений из 56, страница 1 из 3
18.08.2006, 16:07
    #33928833
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Необходимы мудрые мысли со стороны. Ибо... на перепутье. :(

Используется PB9 + Oracle7.3

Есть необходимость реализовать в приложении фильтрацию значений. Соответственно надо накладывать какие-то условия на выборку. dw.sefFilter( {тра-ля-ля} ) не подходит, т.к. он подразумевает предварительное выкачивание всей выборки. Альтернатива - каждый раз получать только то, что нужно, т.е. условия фильтрации в запросе.
Существует три (по крайней мере я больше не вижу) возможных решения:
1. dw.getSqlSelect() => правим раздел Where ручками => dw.setSqlSelect( {новый select} ).
2. dw.retrieve( {дофига параметров} ).
3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).

У всех трех я вижу минусы:
1. Придет DBA и со словами "какого ... у тебя каждый запрос имеет собственный план..." в общем будут проблемы.
2. поскольку пользователь не обязан указывать ВСЕ параметры для фильтра, то в запросе должно быть что-то похожее на "( age = @age or @age is null )". Но при этом насколько я понимаю шерстится вся таблица а индексы как бы не причем... т.е. производительность этого безобразия тоже несколько не высока (т.к. предполагается, что параметров в retrieve будет... много).
3. Предыдущих минусов тут нет, т.к. мы просто убираем из where те условия которые не важны пользователю. Соответственно, план запроса (естественно, что для одинакового набора указанных пользователем полей в фильтре) будет один. Но.... черт побери! Со стороны это смотрится порядочным извращением. Навыки формирования синтаксиса DW ручками у меня есть, но извращения на то и извращения, что бы быть редкими, а не являться естественным способом работы!

Очень интересуют мнения о разрешении ситуации и особенно собственный выбор/опыт (желательно с объяснением "почему так").
...
Рейтинг: 0 / 0
18.08.2006, 16:18
    #33928883
urvas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Можно QueryByExample попробовать
...
Рейтинг: 0 / 0
18.08.2006, 17:08
    #33929111
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
2 urvas
urvasМожно QueryByExample попробовать
В смысле?
...
Рейтинг: 0 / 0
18.08.2006, 17:11
    #33929128
urvas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
dw_control.Object.DataWindow.QueryMode
Whether the DataWindow is in query mode. In query mode, the user can specify the desired data by entering WHERE criteria in one or more columns.
DataWindow presentation styles You cannot use QueryMode with DataWindow objects that use any of the following presentation styles: N-Up, Label, Crosstab, RichText, and Graph.
...
Рейтинг: 0 / 0
18.08.2006, 17:16
    #33929146
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Где-то здесь я уже пытался описать, как это работает у нас, но как всегда, лень все подробно писать. Буду краток:

1. При открытии окна, если надо сделать настройку выборки, вылезает окно настройки, где пользователь может задать параметры выборки, как-то:
Интервал дат (обычно везде это есть).
Задать условия выборки, которые добавляются к тому селекту, на котором построено DW в основном окне.
2. В окно настройки передается object.datawindow.table.select основного DW
3. Пользователь в окне настройки может выбирать разные таблицы и параметры для изменения селекта основного DW
4. Таблицы и наименование их полей показываются пользователю, используя pbcatcol и pbcattbl
5. Интерфейс достаточно прост и даже рядовой ламер легко справляется с написанием условий запросов.
6. Запросы можно сохранять, чтобы в следующий раз их не набирать.
7. После обработки данных, в основное окно возвращается подправленный object.datawindow.table.select
8. Запускаеться ретрив

Примерно так...
...
Рейтинг: 0 / 0
18.08.2006, 17:36
    #33929220
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
2 urvas
Я к концу недели видимо совсем не соображаю уже. :(
1. Меня сбило с толку Query ByExample .
2. Я не улавливаю как мне это может помочь. :(

2 Black Savage
Насколько я понимаю это "расширенный" вариант 3 в моем списке. Только у меня идет речь исключительно о фильтре, а здесь, по большому счету, пользователю позволятся полностью конструировать результирующий список (в том числе и по составу полей). Я правильно понимаю?
...
Рейтинг: 0 / 0
18.08.2006, 19:22
    #33929540
urvas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Способ, конечно, примитивный и применим, на мой взгляд, больше к DW-grid.
А смысл в следующем - надо открыть датавиндов в режиме запроса, ввести нужные для отбора данные и выполнить запрос.
Это - вкратце.
...
Рейтинг: 0 / 0
18.08.2006, 21:04
    #33929691
ytrewq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
ДремучийСуществует три (по крайней мере я больше не вижу) возможных решения:
1. dw.getSqlSelect() => правим раздел Where ручками => dw.setSqlSelect( {новый select} ).
2. dw.retrieve( {дофига параметров} ).
3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).

У всех трех я вижу минусы:
1. Придет DBA и со словами "какого ... у тебя каждый запрос имеет собственный план..." в общем будут проблемы.
2. поскольку пользователь не обязан указывать ВСЕ параметры для фильтра, то в запросе должно быть что-то похожее на "( age = @age or @age is null )". Но при этом насколько я понимаю шерстится вся таблица а индексы как бы не причем... т.е. производительность этого безобразия тоже несколько не высока (т.к. предполагается, что параметров в retrieve будет... много).
3. Предыдущих минусов тут нет, т.к. мы просто убираем из where те условия которые не важны пользователю. Соответственно, план запроса (естественно, что для одинакового набора указанных пользователем полей в фильтре) будет один.
Решения 1 и 3 друг от друга, на мой взгляд, ничем не отличаются.
Все зависит от конкретного случая. Если запрос (отчет) запускается достаточно часто или с малым числом параметров и выполняется быстро, то надо использовать способ 2.
В случае же, когда возможных параметров, как Вы говорили "до фига", или время выполнения запроса существенно зависит от фразы where, можно перерисовать where в DataWindow (способ 1)
Злоупотреблять способом 1 не надо.

Регламентированные отчеты, как правило, выполняются способом 2.
А вот всякие реестры (документов, операций, инвентарных номеров, ...), где трудно определить, по каким показателям пользователь будет их искать, и объем выборки может достигать тысяч - сотен тысяч записей, можно выполнять способом 1. В своей практике использую вызов окна, в котором прописаны возможные параметры, при задании которых они подставляются во фразу where. Оперировать пользователю с наименованиями полей или таблиц не даю. Хотя, возможно, где-то это и надо (см. чуть выше Black Savage).

Главное, не впадать в моразм. Мне известен случай, когда положив в основу тезис "какого ... у тебя каждый запрос имеет собственный план...", ребятки использовали способ "дофига параметров" + универсальная функция поиска на PL-SQL. На реальных объемах базы (связка 5-7 таблиц, в некоторых по паре миллионов записей) такие запросы отрабатывали 5-15-30 минут (это те, которые хватило терпения дождаться). Мне это объяснили тем, что при этом запрос повторно не парсится на ORACLE. Пришлось переписывать всю эту мутотень.
...
Рейтинг: 0 / 0
20.08.2006, 15:56
    #33930813
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Не знаю как в Oracle, но в ASE запрос можно пустить по интексу или написать план на него, так вот на DW вешаем процедуру с количеством параметров и пишем процедуру так, чтобы все работало по индексам при любых значениях параметров (анализ в процедуре можно сделать как угодно), причем передача значения как null дает то что этот параметр не усаствет в поиске (это тоже обрабатывается там же в процедуре)
...
Рейтинг: 0 / 0
21.08.2006, 07:35
    #33931260
Геннадич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
СотниковНе знаю как в Oracle, но в ASE запрос можно пустить по интексу или написать план на него, так вот на DW вешаем процедуру с количеством параметров и пишем процедуру так, чтобы все работало по индексам при любых значениях параметров (анализ в процедуре можно сделать как угодно), причем передача значения как null дает то что этот параметр не усаствет в поиске (это тоже обрабатывается там же в процедуре)
Товарищ намекает на ороклячьи хинты, только я не знаю работают они в семёрке или нет, но в любом случае злоупотреблять хинтами не рекомендую. А вот по поводу процедурки - это правильно. Передать в процедурку кучу аргументов, она посмотрит какие Null или не Null и через динамический SQL вернёт в REF курсор то что надо.
...
Рейтинг: 0 / 0
21.08.2006, 18:34
    #33933096
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
2 urvas
urvasСпособ, конечно, примитивный и применим, на мой взгляд, больше к DW-grid.
А смысл в следующем - надо открыть датавиндов в режиме запроса, ввести нужные для отбора данные и выполнить запрос.
Это - вкратце.
Да я, в общем то понял... проблема в том, что такой способ в принципе не вписывается (интерфейсно-идеологически) в проект. Да и (честно говоря) мне он совсем не нравится.

2 ytrewq
ytrewqРешения 1 и 3 друг от друга, на мой взгляд, ничем не отличаются...
И да и нет. В третьем варианте присутствуют параметры в dw.retrieve(...), что лучше воспринимается сервером. Хотя надо признать, что в аспекте правки раздела where это действительно близнецы братья (вся разница, что в одном случае подставляется "age = 32", а в другом "age = :age").

ytrewqГлавное, не впадать в моразм. Мне известен случай, когда положив в основу тезис "какого ... у тебя каждый запрос имеет собственный план...", ребятки использовали способ "дофига параметров" + универсальная функция поиска на PL-SQL. На реальных объемах базы (связка 5-7 таблиц, в некоторых по паре миллионов записей) такие запросы отрабатывали 5-15-30 минут (это те, которые хватило терпения дождаться). Мне это объяснили тем, что при этом запрос повторно не парсится на ORACLE. Пришлось переписывать всю эту мутотень.
Вот именно это меня и смущает в варианте 2... там индексы игнорируются (по крайней мере на Оракле 7.3), что при больших объемах таблиц может удручающе влиять на скорость.

В общем... честно говоря я не получил того, что ожидал. Я почему-то думал, что мое сообщение спровоцирует спор между сторонниками разных вариантов. А в результате я внимательно послушав смогу оценить минусы разных вариантов. Ведь кто лучше оппонента укажет на все недостатки? А может и еще какие интересные (для меня) мысли мелькнут. ;) Но увы... :(

В целом я склоняюсь к третьему варианту. Т.е. в retrieve() перечисляется тьма параметров, а потом по необходимости ручками правится раздел where, что бы избежать условий типа "( age = :age or :age is null )" (точнее использование конструкций: "... or :age is null").
...
Рейтинг: 0 / 0
21.08.2006, 18:37
    #33933102
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
2 Геннадич
ГеннадичТоварищ намекает на ороклячьи хинты, только я не знаю работают они в семёрке или нет, но в любом случае злоупотреблять хинтами не рекомендую. А вот по поводу процедурки - это правильно. Передать в процедурку кучу аргументов, она посмотрит какие Null или не Null и через динамический SQL вернёт в REF курсор то что надо.
К сожалению не пойдет. Я бы сам может так и сделал, но у нас четкое разделение на тех, кто пишет на клиенте и на тех, кто пишет на сервере... с понятными последствиями. :(
...
Рейтинг: 0 / 0
21.08.2006, 19:44
    #33933213
ytrewq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
ДремучийВот именно это меня и смущает в варианте 2... там индексы игнорируются (по крайней мере на Оракле 7.3), что при больших объемах таблиц может удручающе влиять на скорость.
Oracle может игнорировать индексы, но может и не игнорировать - тут "неправда Ваша".

ДремучийВ общем... честно говоря я не получил того, что ожидал. Я почему-то думал, что мое сообщение спровоцирует спор между сторонниками разных вариантов. А в результате я внимательно послушав смогу оценить минусы разных вариантов. Ведь кто лучше оппонента укажет на все недостатки? А может и еще какие интересные (для меня) мысли мелькнут. ;) Но увы... :(
Единого рецепта здесь, к сожалению, нет, посему, наверное, и нет предмета спора. Практически во всех разработках (по крайней мере, у меня) присутствуют все варианты.

ДремучийВ целом я склоняюсь к третьему варианту. Т.е. в retrieve() перечисляется тьма параметров, а потом по необходимости ручками правится раздел where, что бы избежать условий типа "( age = :age or :age is null )" (точнее использование конструкций: "... or :age is null").
Категоричные высказывания грозят в дальнейшем всеми теми неприятностями, про которые Вы и так знаете. Да, вдогонку, изменение фразы where в третьем варианте автоматически ведет к повторному разбору на сервере всего запроса.

Вам бы лучше перенестись с этим топиком в форум по Oracle, там получите гораздо больше информации по этому вопросу ...
...
Рейтинг: 0 / 0
22.08.2006, 09:33
    #33933656
gal20
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
В свое время был использован механизм получения выборок при разных входных ограничениях - сначала во временную таблицу на основе входных параметров складывались значения PK, а потом они использовались в запросе единственного DW для отображения пользователю.
Для формирования выборок был создан объект, в котором на этапе открытия окна определялись наиболее вероятные варианты выборок. Количество выборок - сколько угодно, количество полей для ввода было разным для разных выборок, и ,если поле оставалось пустым, то оно не участвовало в запросе.
Объект в интерфейсе пользователя занимал очень мало места, что всех устраивало.
Выглядело это примерно так (приведены 2 выборки)
...
Рейтинг: 0 / 0
22.08.2006, 10:19
    #33933748
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
2 ytrewq
ytrewq ДремучийВот именно это меня и смущает в варианте 2... там индексы игнорируются (по крайней мере на Оракле 7.3), что при больших объемах таблиц может удручающе влиять на скорость.
Oracle может игнорировать индексы, но может и не игнорировать - тут "неправда Ваша".
Мне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем.

ytrewq ДремучийВ общем... честно говоря я не получил того, что ожидал. Я почему-то думал, что мое сообщение спровоцирует спор между сторонниками разных вариантов. А в результате я внимательно послушав смогу оценить минусы разных вариантов. Ведь кто лучше оппонента укажет на все недостатки? А может и еще какие интересные (для меня) мысли мелькнут. ;) Но увы... :(
Единого рецепта здесь, к сожалению, нет, посему, наверное, и нет предмета спора. Практически во всех разработках (по крайней мере, у меня) присутствуют все варианты.
Я как раз и рассчитывал, что единого варианта нет, а значит апологеты разных вариантов могут и схлестнуться чей канон веры каноничнее. ;) Я ошибся. ;)

ytrewq ДремучийВ целом я склоняюсь к третьему варианту. Т.е. в retrieve() перечисляется тьма параметров, а потом по необходимости ручками правится раздел where, что бы избежать условий типа "( age = :age or :age is null )" (точнее использование конструкций: "... or :age is null").
Категоричные высказывания грозят в дальнейшем всеми теми неприятностями, про которые Вы и так знаете. Да, вдогонку, изменение фразы where в третьем варианте автоматически ведет к повторному разбору на сервере всего запроса.
А где Вы здесь увидели "категоричность"? ;)

А по поводу "изменение фразы where". Угу. Но (насколько я понимаю) при повторном использовании фразы одного типа повторного разбора не будет. Т.е., если в реальной работе в 90-95% случаев используется 2-3 варианта задания условий для фильтра (например, "фамилия", "фамилия и год рождения" и "фамилия и имя" ), то в большинстве случаев новых планов создаваться не будет. А вот если указывать "в лоб" (по типу "family = 'Иванов'"), то практически каждое обращение к БД будет инициировать составление нового плана.

ytrewqВам бы лучше перенестись с этим топиком в форум по Oracle, там получите гораздо больше информации по этому вопросу ...
Мне кажется нет. Это скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика.

2 gal20
gal20В свое время был использован механизм получения выборок при разных входных ограничениях - сначала во временную таблицу на основе входных параметров складывались значения PK, а потом они использовались в запросе единственного DW для отображения пользователю.
Это немного другой случай. У нас тонкое место не в изначальном построении выборки, а в постоянном изменении условий одной выборки (результат постоянного использования пользователем фильтра).
...
Рейтинг: 0 / 0
22.08.2006, 11:41
    #33934061
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
ДремучийМне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем.


Вообще в зависимости от режима оптимизации и наличия статистики такой запрос может быть преобразован оптимизатором в конкатенацию запросов:
Код: plaintext
select  1  from t where a = :a or a =  0 
=>
Код: plaintext
1.
2.
select  1  from t where a = :a 
union all  
select  1  from t where a =  0 

При этом скорее всего будет использован индекс по a.

Для принудительного включения такой трансляции можно использовать хинты use_concat, first_rows

В 7.3 эти хинты есть.
...
Рейтинг: 0 / 0
22.08.2006, 12:13
    #33934208
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
2 Anatoly Moskovsky
Anatoly Moskovsky ДремучийМне на примерах (по принципу "age = :age or :age = 0") было продемонстрировано, что игнорирует... Может быть в других версиях (у нас 7.3) по другому, но мы имеем то что имеем.


Вообще в зависимости от режима оптимизации и наличия статистики такой запрос может быть преобразован оптимизатором в конкатенацию запросов:
Код: plaintext
select  1  from t where a = :a or a =  0 
=>
Код: plaintext
1.
2.
select  1  from t where a = :a 
union all  
select  1  from t where a =  0 

При этом скорее всего будет использован индекс по a.

Для принудительного включения такой трансляции можно использовать хинты use_concat, first_rows

В 7.3 эти хинты есть.
Хм... а во что это превратиться, если параметров у retrieve будет полтора-два десятка (это абсолютно реальный вариант)?
Т.е. до оптимизации будет:
Код: plaintext
1.
2.
3.
4.
5.
select  1  
from t 
where ( f = :f or f = '' )
      and ( i = :i or i = '' )
      and ( o = :o or o = '' )
...
а после???
...
Рейтинг: 0 / 0
22.08.2006, 13:40
    #33934658
ytrewq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Глянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен. Кроме вот этой фразы
ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика.

Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же.
...
Рейтинг: 0 / 0
22.08.2006, 14:41
    #33934898
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
ДремучийХм... а во что это превратиться, если параметров у retrieve будет полтора-два десятка (это абсолютно реальный вариант)?
Т.е. до оптимизации будет:
Код: plaintext
1.
2.
3.
4.
5.
select  1  
from t 
where ( f = :f or f = '' )
      and ( i = :i or i = '' )
      and ( o = :o or o = '' )
...
а после???

1) Эта форма не разлагается на части, соединенные ИЛИ.

2) Естественно что злоупотреблять хинтом use_concat не стоит, так как при громоздких условиях слишком большое время затрачивается на компиляцию запроса с большим кол. подзапросов в union all (бывало вообще сервер зависал :))
...
Рейтинг: 0 / 0
22.08.2006, 14:45
    #33934923
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
ytrewqЭто чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же.

Ну не совсем.
В PB есть места, где обрезаются комменты в запросах, и все хинты идут лесом :)

К счастью в DW этого нет.
...
Рейтинг: 0 / 0
22.08.2006, 14:52
    #33934946
Estets
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
ytrewqГлянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен. Кроме вот этой фразы
ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика.

Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же.
Из вашей постановки следует что на MS SQL или Sybase данной проблемы не возникнет? К сожалению возникнет. И вопросы будут одни и те же.

Из своего опыта могу сказать что используются процедуры с "дофига параметров", но это связано с проверкой безопасности и допусков которые реализовать в View невозможно

Вот типичный пример фильтрации списка документов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
...
  and td_depo_docs.in_date between @in_date_bb and @in_date_ee
  and isnull(rtrim(ltrim(upper(td_depo_docs.out_no))),'') LIKE isnull('%'+rtrim(ltrim(upper(@out_no_nn)))+'%','%')
  and isnull(rtrim(ltrim(upper(td_depo_docs.in_no))),'') LIKE isnull('%'+rtrim(ltrim(upper(@in_no_nn)))+'%','%')
  and (td_depo_docs.correspondent_id between @correspondent_id_bb and @correspondent_id_ee
       or @correspondent_id_nn is null
      )
  and (td_depo_docs.payer_id between @payer_id_bb and @payer_id_ee
       or @payer_id_nn is null
      )
  and (td_depo_docs.pay_sum between @pay_sum_bb and @pay_sum_ee
       or @pay_sum_nn is null
      )
  and (td_depo_docs.initiator_id between @initiator_id_bb and @initiator_id_ee
       or @initiator_id_nn is null
      )
  and (td_depo_docs.document_form_id between @document_form_id_bb and @document_form_id_ee
       or @document_form_id_nn is null
      )
  and (td_depo_docs.changed_item_id between @changed_item_id_bb and @changed_item_id_ee
       or @changed_item_id_nn is null
      )
  and (td_depo_docs.depo_doc_type between @depo_doc_type_bb and @depo_doc_type_ee
       or @depo_doc_type_nn is null
      )
  and (td_depo_docs.class_id between @class_id_bb and @class_id_ee
       or @class_id_nn is null
      )
  and (td_depo_docs.folder_id between @folder_id_bb and @folder_id_ee
       or @folder_id_nn is null
      )
  and (td_depo_docs.sum_cur_id between @sum_cur_id_bb and @sum_cur_id_ee
       or @sum_cur_id_nn is null
      )
  and isnull(rtrim(ltrim(upper(td_depo_docs.foundation_remark))),'') LIKE isnull('%'+rtrim(ltrim(upper(@foundation_remark_nn)))+'%','%')
  and (td_depo_docs.arch_date between @arch_date_bb and @arch_date_ee
       or @arch_date_nn is null
      )
  and isnull(rtrim(ltrim(upper(td_depo_docs.arch_no))),'') LIKE isnull('%'+rtrim(ltrim(upper(@arch_no_nn)))+'%','%')

Правда вся эта лабудень генерится автоматом да и работает на объеме примерно 1-2 млн записей.
...
Рейтинг: 0 / 0
22.08.2006, 16:20
    #33935344
Дремучий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
2 ytrewq
ytrewqГлянул на продолжение дискуссии. Чуть более понял постановку вопроса. Почти во всем с Вами согласен.
Это плохо. Я бы предпочел, что бы это я с вами согласился.

ytrewq Кроме вот этой фразы
ДремучийЭто скорее Билдеровский вопрос, но с учетом особенностей Оракла... впрочем, это уже лирика.

Это чисто Oracle-вский вопрос. Пишите клиента на чем угодно. Все равно вопросы будут одни и те же.
Не согласен. И дело не только в том, то в MS SQL тоже "что то есть". Дело в том, что механизм передачи условия задается/обрабатывается/формируется на клиенте! Соответственно и те проблемы которые при этом возникают можно оценить только на клиенте. Соотвественно надо знать в первую очередь Билдер (в разных СР разные тараканы), а потом СУБД. Это "имхо", конечно.

2 Anatoly Moskovsky
Anatoly Moskovsky2) Естественно что злоупотреблять хинтом use_concat не стоит, так как при громоздких условиях слишком большое время затрачивается на компиляцию запроса с большим кол. подзапросов в union all (бывало вообще сервер зависал :))
Угу. :(. Испольование конструкции "( age = :age or :age is null )" намекает, что конструкций такого типа будет очень много с весьма вероятными последствиями для быстродействия. :(
...
Рейтинг: 0 / 0
22.08.2006, 16:55
    #33935467
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Используйте способ 3 из Вашего начального сообщения.
Не вижу в нем никаких сложностей или извращений.
...
Рейтинг: 0 / 0
22.08.2006, 17:08
    #33935520
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
Anatoly MoskovskyИспользуйте способ 3 из Вашего начального сообщения.
Не вижу в нем никаких сложностей или извращений. Дремучий3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).IMHO, черезчур сложно, проще править Table.Select
Код: plaintext
myDW.modify("DataWindow.Table.Select='" + <новый запрос, который отличается от старого только условием WHERE> + "'")
у нас только так и делают :-))
...
Рейтинг: 0 / 0
22.08.2006, 17:13
    #33935538
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация фильтра на DW
PL99 Дремучий3. dw.object.dataWindow.syntax => злостно правим раздел where => dw.create( {новый синтаксис DW} ).IMHO, черезчур сложно, проще править Table.Select
Код: plaintext
myDW.modify("DataWindow.Table.Select=...
у нас только так и делают :-))

Ему требуется менять и перечень аргументов DW (из-за требования DBA не зашивать значения фильтра в код запроса, а использовать bind-переменные), а это можно только так сделать:
Код: plaintext
dw.create( {новый синтаксис DW} )
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Организация фильтра на DW / 25 сообщений из 56, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]