:: Visual Foxpro, Foxpro for DOS
Как организовать фильтрацию или выборку данных
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Здравствуйте.
Есть форма
[attachment 27038 ris1.JPG]

На ней огромное количество условий отбора записей для грида, что наверху, или курсора.
По типу мероприятия (ДВ1, ОПВ и т.д.)+Типу результата (подлежащие, спланированные и ит.д)+По кварталу+по возрасту.
Где-то более 700 сочеаний...
Запарился с CASE - ENDCASE IF - INDIF и запутался уже...
Не подскажете какой-то более короткий метод фильтрации (по кнопке показать) или отбора записей (по кнопке Список)?


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
Taran

Сообщений: 13625
Откуда: Красноярск
Дата регистрации: 16.01.2008
"Огромное" - это сильно сказано.
В чем проблема? Ну есть пяток параметров. Насколько понимаю все они независимые и объединяются в общее условие через AND. А каждое само по себе OR.
...
where (plType=1 or (plType=2 and i_ref=1) or (plType=3 and i_ref=2));
and (plQuarter =1 or Quarter(date)=plQuarter-1);
and (дети );
and (Прочее);
Гораздо более критично как данные выбираются и откуда. Прямой запрос, CA, View или что?
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
PaulWist

Сообщений: 14621
Дата регистрации: 01.04.2004
Посмотри на "идею", на нынешний день в структуре данных и ХП есть изменения - это если заинтересует распишу по подробнее.
forum.foxclub.ru

И в картинках

forum.foxclub.ru

forum.foxclub.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 2 раз(а). Последнее : PaulWist, 16.02.17 11:33
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
PaulWist
Посмотри на "идею", на нынешний день в структуре данных и ХП есть изменения - это если заинтересует распишу по подробнее.
forum.foxclub.ru
Спасибо. Это меня заинтересовало. Как раз данные у меня находятся на сервере SQL
Ели распишете изменения, буду благодарен.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
Baga
Автор

Сообщений: 540
Откуда: г. Махачкала
Дата регистрации: 03.06.2006
Taran
"Огромное" - это сильно сказано.
Гораздо более критично как данные выбираются и откуда. Прямой запрос, CA, View или что?


Это кому как, видимо. Если для Вас 720 возможных сочетаний условий отбора - это не проблема, то для меня 10 - уже проблема...
Прямой запрос.
В гриде на форме уже есть источник. Этот источник и нужно отфильтровать или выбрать из этого источника данные в курсор.
Никаких связей.
Разумеется, код фильтации зависит от выбранных пользователем условий выборки. И вот здесь, возможно потребуется некая связь источника со справочниками. Например справочником возрастных категорий.
Например, если первый параметр ДВ1, второй Подлежащие, третий Все, четвертый - Взросслые, то
select i.* from istocnik i inner join sp_vzr s on 2017-year(i.dr)=s.vzrst where...
И так для каждого условия.
Написать сами коды отбора - не проблема, там нет сложных связей. Проблема вызвать нужный код в нужное время, с нужными входными (для кода) параметрами.


------------------
Багавудин Мирзаев
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Я бы сделал примерно вот так:
Store '' To mJoin1, mJoin2, mJoin3, ...
Store '' To mWhere1, mWhere2, mWhere3, ...
If Expr1
mJoin1 = 'inner join sp_vzr s on 2017-year(i.dr)=s.vzrst'
EndIf
If Expr2
mWhere1 = ' And MyTable1.MyField = myVar1'
EndIf
If Expr3
mJoin2 = 'inner join oher_table x on ...'
mWhere2 = ' And MyTable2.MyField = myVar2'
EndIf
...
Select i.* from istocnik i &mJoin1 &mJoin2 &mJoin3 ...;
Where SomeExpr;
&mWhere1 &mWhere2 &mWhere3 ...



Исправлено 2 раз(а). Последнее : Sawradym, 17.02.17 12:19
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Зависит от степени навороченности условий и разнообразия их комбинации.
Простой уточняющий поиск - где для каждого поля есть свой фильтр, внешний вид которого зависит от типа поля и его назначения, а результирующее условие формируется простым объединением фильтров с помощью AND. То, что я вижу на картинке, так бы и сделал. Код формирования запроса выглядел бы как-то так:
lcWhere = ''
if not emtpy( Контрол1.value )
lcWhere = lcWhere + Condition_str( Контрол1.value ) + ' AND '
endif
if not emtpy( Контрол2.value )
lcWhere = lcWhere + Condition_date( Контрол2.value ) + ' AND '
endif

где функции control_xxx скрывают в себе подробности построения условия по полю для текстового поля, даты, периода, выбора из списка и т.д.
Если нужны условия на справочники, то при относительно небольших объемах сразу бы включил в выборку все связанные таблицы. Если нужно экономить - параллельно с формированием условия строил бы выражение для JOIN. Обычно этого достаточно. И не так уж сложно, даже если число сочетаний велико, т.к. разница только в количестве операндов в длинной строке AND...AND...

Мои попытки сделать что-то более универсальное привели к созданию построителя запросов на основе табличек с мета-данными. Получился весьма сложный модуль, который, который для пользователей оказался проще, чем sql-язык, но все равно далеко не все могут им пользоваться. И, как правило, это я с помощью построителя строю запрос с параметрами, сохраняю его, а они выбирают из списка подходящий запрос и вводят параметры. Потому, что реальная работа ограничивает многообразие выражений. Ну и полной универсальности добиться, естественно, не удалось. Поэтому, некоторые запросы построить нельзя сделать в принципе. И тогда для них делается отдельная форма/отчет/запрос.
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
matod
как правило, это я с помощью построителя строю запрос с параметрами, сохраняю его, а они выбирают из списка подходящий запрос и вводят параметры. Потому, что реальная работа ограничивает многообразие выражений.
Именно так! Это программист, по простоте душевной, считает что пользователю обязательно потребуется весь возможный диапазон условий - и начинает сооружать "построители запросов", или хитрые QBE/QBF формы (в принципе и то и другое сделать сравнительно несложно - вот пользоваться потом юзеру этим будет не очень удобно). А пользователь в 90% случаев нуждается в десятке (а то и меньше) совершенно конкретных запросов по 2, 3, максимум 4 критерия из возможной полусотни... Ну не нужно ему комбинировать одновременно пол, возраст, имя, место работы, семейный статус, отношение к религии, воинское звание и доход за прошлый год
А тому 1% юзеров которым нужны МЕГА-сложные запросы... Ну для них полноценный "построитель" не сделать - придётся вручную писать запросы, или обучать пользователя SQL-ю.
Вот как "построить визуально" запрос выбирающий "клиентов с доходом выше чем у 80% всех клиентов, но совершивших за текущий месяц покупок на сумму меньшую чем средняя ежемесячная сумма покупок одного клиента за прошедшие 3 месяца"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как организовать фильтрацию или выборку данных
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Igor Korolyov
Именно так!

Помниться, сколько-то времени назад мы про это с тобой уже спорили. Тогда идея универсального построителя мне казалась хорошей идеей
Сейчас я скорее соглашусь с тобой. Хотя есть пользователи, которые освоили и пользуются. Другим больше нравится выгрузить в эксель и там колдовать. Третьи формулируют словами запросы, я им делаю, они только переменную часть вводят. А многие просто грустно вздыхают - "что-то мы так и не смогли разобраться" что тоже имеет свои преимущества - вроде как средство есть, они и не пристают ко мне, пока в выборке не появится действительно реальная необходимость, без которой никак.
Ну и для быстрого внедрения тоже удобно - можно довольно много сформулировать. Но не всё.

Igor Korolyov
"клиентов с доходом выше чем у 80% ..."

вот, кстати, с агрегированными показателями у меня вообще никак.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика