Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Организовать правильно фильтр ... / 14 сообщений из 14, страница 1 из 1
25.11.2005, 17:49:37
    #33400875
Romazan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
Здравствуйте! Помогите пожалста с фильтрацией данных, т.е. как сделать это правильно. В гриде отображаются данные таблицы с данными о пациентах. Нужно произвести фильтр по дате(с “ ” – по “ ” ), потом выбрать один из двух видов лечения и третий фильтр – отделение. Причем нужно, что бы можно было использовать сразу все три фильтра. Перед тем как отфильтровать по отделению, я проверяю, есть ли фильтр на вид лечения то делаю его и тут же проверяю есть ли фильтр по дате. Вот год, что бы было понятнее:

&& Проверка на вид лечения
IF ThisForm.Optiongroup2.Value != 3

SET FILTER TO IIF (ThisForm.Optiongroup2.Value = 1,;
TPatient.llechenie = .t., TPatient.llechenie = .f.) AND ;
BETWEEN(DDatedog,CTOD(ThisForm.text1.Value),CTOD(ThisForm.text2.Value)) AND ;
&& Это фильтр на отделение
ALLTRIM(UPPER(TPatient.CNarkoz)) = ALLTRIM(UPPER(ThisForm.combo1.Value))
ELSE
&& Если не выбран вид лечения
SET FILTER TO ;
BETWEEN(DDatedog,CTOD(ThisForm.text1.Value),CTOD(ThisForm.text2.Value)) AND ;
&& Это фильтр на отделение
ALLTRIM(UPPER(TPatient.CNarkoz)) = ALLTRIM(UPPER(ThisForm.combo1.Value)) ENDIF

И аналогично я делаю в трех обработчиках – где меняю дату, где выбираю лечения и там где выбираю отделение. А вот если таких фильтров будет гораздо больше, это ж вообще путаница получится. Я понимаю, что я делаю не правильно, но как сделать это компактно и правильно не знаю. Посоветуйте пожалста. Заранее благодарю!
...
Рейтинг: 0 / 0
25.11.2005, 18:20:35
    #33400927
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
вот тебе простой способ
1) делаешь переменную символьную. в нее загоняешь условия вильтров. синтаксис: имя_переменной=имя_переменной+фильтр(имя_поля=значение)+'.and.'
и т.д. повторяешь этот синтаксис сколько тебе нужно
потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5)

2) прописываешь команду select. Учти вжною вешь! В этом способе в твой грид будет загоняться курсор с теми полями с которыми ты укажешь в select.
синтаксис: select имена_полей(т.е. перечисляешь через ',' после последнего имени ',' не ставить) from имя_таблицы where &имя_переменной into cursor имя_курсора(придумаешь) nofilter

3) пишешь thisform.grid1.recordsource = 'имя_курсора'

все
...
Рейтинг: 0 / 0
26.11.2005, 02:22:21
    #33401344
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
Hi Romazan!

КАЖДОЕ условие храни отдельно - например заведи свойства в форме:
dStartDate, dEndDate, nType, cDepartment и т.д.
Эти свойства и заполняй из своих "фильтрующих контролов". Предусмотри также
возможность "снятия" условия - например если свойство содержит .NULL. -
значит данное условие не задействовано. По умолчанию именно NULL-ами и
заполни все свойства (если нет "сохранённого" условия, или не надо сразу
выставить какое-то "условие по умолчанию").
Сделай на форме метод - скажем GetCurrentFilter() - он и будет анализировать
эти свойства, и последовательно формировать строку с условием. Т.е. примерно
так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
LOCAL lcWhere
lcWhere = "1=1"
IF !ISNULL(This.dStartDate) AND !EMPTY(This.dStartDate)
    lcWhere = m.lcWhere + " AND DTOS(dDate) >= [" + DTOS(This.dStartDate) + 
"]"
ENDIF
IF !ISNULL(This.dEndDate) AND !EMPTY(This.dEndDate)
    lcWhere = m.lcWhere + " AND DTOS(dDate) <= [" + DTOS(This.dEndDate) + 
"]"
ENDIF
IF !ISNULL(This.nType)
    lcWhere = m.lcWhere + " AND nType = " + LTRIM(STR(This.nType))
ENDIF
IF !ISNULL(This.cDepartment) AND !EMPTY(This.cDepartment)
    lcWhere = m.lcWhere + " AND cDepartment LIKE [" + This.cDepartment + 
"%]"
ENDIF
RETURN m.lcWhere
Также сделай кнопку "Применить фильтр" (можно конечно и автоматически это
делать - скажем по потере фокуса контейнером, в котором расположены контролы
задающие условие). При этом вызывай метод GetCurrentFilter - он даст тебе
полное условие.

И ещё - SET FILTER как таковой - есть большое зло - если примеяется на
большой таблице, при этом таблица отображается в гриде. Для подобных случаев
гораздо больше подходят представления, или прямые SQL запросы (но через
запрос нельзя напрямую редактировать таблицу, если это запрос к фоксовым
данным конечно).

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
27.11.2005, 10:27:30
    #33401939
Romazan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
Недоходящийвот тебе простой способ
1) делаешь переменную символьную. в нее загоняешь условия вильтров. синтаксис: имя_переменной=имя_переменной+фильтр(имя_поля=значение)+'.and.'
и т.д. повторяешь этот синтаксис сколько тебе нужно
потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5)

2) прописываешь команду select. Учти вжною вешь! В этом способе в твой грид будет загоняться курсор с теми полями с которыми ты укажешь в select.
синтаксис: select имена_полей(т.е. перечисляешь через ',' после последнего имени ',' не ставить) from имя_таблицы where &имя_переменной into cursor имя_курсора(придумаешь) nofilter

3) пишешь thisform.grid1.recordsource = 'имя_курсора'

все

А зачем вот это:
“потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5)”
...
Рейтинг: 0 / 0
27.11.2005, 10:55:20
    #33401944
Организовать правильно фильтр ...
RomazanА зачем вот это:
“потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5)”
В конце каждого "подусловия" для создания целой строки фильтрации автор предлагает ставить логическое И (.and.) :
Недоходящийимя_переменной=имя_переменной+фильтр(имя_поля=значение)+'.and.'
Вот это самое последнее в итоговой строке '.and.' он и требует обрезать. В аккурат пять символов.
Мусульманский, надо сказать, подход: сначала рожаем как есть, а потом отрезаем лишнее.
...
Рейтинг: 0 / 0
28.11.2005, 10:51:21
    #33402731
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
2 Cамый умный

Выложи славянский вариант.
...
Рейтинг: 0 / 0
28.11.2005, 12:01:57
    #33402992
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
Недоходящий2 Cамый умный

Выложи славянский вариант.
Ну, это просто: "Семь раз отмерь, один - отрежь"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
LOCAL lcWhere
lcWhere = ""

IF (условие  1 )
	IF EMPTY(m.lcWhere) = .F.
		m.lcWhere = m.lcWhere + " AND "
	ENDIF
	m.lcWhere = m.lcWhere + (Выражение  1 )
ENDIF

IF (условие  2 )
	IF EMPTY(m.lcWhere) = .F.
		m.lcWhere = m.lcWhere + " AND "
	ENDIF
	m.lcWhere = m.lcWhere + (Выражение  2 )
ENDIF
Можно все то же самое через IIF() сделать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
LOCAL lcWhere
lcWhere = ""

IF (условие  1 )
	m.lcWhere = m.lcWhere + ;
		IIF(EMPTY(m.lcWhere),""," AND ") + ;
		(Выражение  1 )
ENDIF

IF (условие  2 )
	m.lcWhere = m.lcWhere + ;
		IIF(EMPTY(m.lcWhere),""," AND ") + ;
		(Выражение  2 )
ENDIF

Правда, если в результате в WHERE вообще ничего не оказалось, то все-равно либо придется ставить "заглушку" типа "1=1", либо включать внутрь макроподстановки само слово "WHERE". Но это уже на выходе из функции формирования условия.

С "обрезанием", правда, короче получается . Но это уже вопрос личных предпочтений.
...
Рейтинг: 0 / 0
28.11.2005, 13:20:55
    #33403250
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
2 ВладимирМ
это точно. я использую и тот и другой. в зависимости от ситуации.
...
Рейтинг: 0 / 0
29.11.2005, 01:13:25
    #33404677
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
Hi ВладимирМ!

Помоему проще (и код короче) не резать, и не проверять всё, а дописать в
самом конце к этой "собранной" строке "1=1" - и никаких проблем ;)

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
29.11.2005, 14:59:36
    #33406087
romzes5
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
Igor Korolyov
Hi ВладимирМ!

Помоему проще (и код короче) не резать, и не проверять всё, а дописать в
самом конце к этой "собранной" строке "1=1" - и никаких проблем ;)

Posted via ActualForum NNTP Server 1.3

Честно сказать, ну никак не пойму, что значит "1=1" ?
Можно же просто написать lcWhere = " " , или нет?
...
Рейтинг: 0 / 0
29.11.2005, 15:13:21
    #33406144
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
понимаешь, это зделано для того чтоб если на конце строки есть '.and.', то при исполнений будет ошибка. и чтоб ее небыло ставишь на конце '1=1' типа пустое условие. или обрезаешь '.and.'
...
Рейтинг: 0 / 0
30.11.2005, 03:10:26
    #33407264
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
Hi romzes5!

И что тогда получится в результате?

Код: plaintext
cName = "Иванов" AND nAge =  30  AND 

Как видишь это некорректное условие. А если дописать в конце 1=1, то
получится вполне корректно - и смысл условия это не изменит.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
30.11.2005, 10:20:05
    #33407639
Недоходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
В этом ответе я поддерживаю Igor Korolyov-а. так как об этом способе сам незнал. попробывал, все класс!
...
Рейтинг: 0 / 0
30.11.2005, 15:08:51
    #33408739
Romazan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организовать правильно фильтр ...
НедоходящийВ этом ответе я поддерживаю Igor Korolyov-а. так как об этом способе сам незнал. попробывал, все класс!

Спасибо Вам Всем! Кой чему я научился :)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Организовать правильно фильтр ... / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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