|
|
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Помогите пожалста с фильтрацией данных, т.е. как сделать это правильно. В гриде отображаются данные таблицы с данными о пациентах. Нужно произвести фильтр по дате(с “ ” – по “ ” ), потом выбрать один из двух видов лечения и третий фильтр – отделение. Причем нужно, что бы можно было использовать сразу все три фильтра. Перед тем как отфильтровать по отделению, я проверяю, есть ли фильтр на вид лечения то делаю его и тут же проверяю есть ли фильтр по дате. Вот год, что бы было понятнее: && Проверка на вид лечения 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 И аналогично я делаю в трех обработчиках – где меняю дату, где выбираю лечения и там где выбираю отделение. А вот если таких фильтров будет гораздо больше, это ж вообще путаница получится. Я понимаю, что я делаю не правильно, но как сделать это компактно и правильно не знаю. Посоветуйте пожалста. Заранее благодарю! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 17:49 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
вот тебе простой способ 1) делаешь переменную символьную. в нее загоняешь условия вильтров. синтаксис: имя_переменной=имя_переменной+фильтр(имя_поля=значение)+'.and.' и т.д. повторяешь этот синтаксис сколько тебе нужно потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5) 2) прописываешь команду select. Учти вжною вешь! В этом способе в твой грид будет загоняться курсор с теми полями с которыми ты укажешь в select. синтаксис: select имена_полей(т.е. перечисляешь через ',' после последнего имени ',' не ставить) from имя_таблицы where &имя_переменной into cursor имя_курсора(придумаешь) nofilter 3) пишешь thisform.grid1.recordsource = 'имя_курсора' все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2005, 18:20 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
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. делать - скажем по потере фокуса контейнером, в котором расположены контролы задающие условие). При этом вызывай метод GetCurrentFilter - он даст тебе полное условие. И ещё - SET FILTER как таковой - есть большое зло - если примеяется на большой таблице, при этом таблица отображается в гриде. Для подобных случаев гораздо больше подходят представления, или прямые SQL запросы (но через запрос нельзя напрямую редактировать таблицу, если это запрос к фоксовым данным конечно). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2005, 02:22 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
Недоходящийвот тебе простой способ 1) делаешь переменную символьную. в нее загоняешь условия вильтров. синтаксис: имя_переменной=имя_переменной+фильтр(имя_поля=значение)+'.and.' и т.д. повторяешь этот синтаксис сколько тебе нужно потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5) 2) прописываешь команду select. Учти вжною вешь! В этом способе в твой грид будет загоняться курсор с теми полями с которыми ты укажешь в select. синтаксис: select имена_полей(т.е. перечисляешь через ',' после последнего имени ',' не ставить) from имя_таблицы where &имя_переменной into cursor имя_курсора(придумаешь) nofilter 3) пишешь thisform.grid1.recordsource = 'имя_курсора' все А зачем вот это: “потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5)” ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2005, 10:27 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
RomazanА зачем вот это: “потом имя_переменной=substr(имя_переменной,1,len(имя_переменной)-5)” В конце каждого "подусловия" для создания целой строки фильтрации автор предлагает ставить логическое И (.and.) : Недоходящийимя_переменной=имя_переменной+фильтр(имя_поля=значение)+'.and.' Вот это самое последнее в итоговой строке '.and.' он и требует обрезать. В аккурат пять символов. Мусульманский, надо сказать, подход: сначала рожаем как есть, а потом отрезаем лишнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2005, 10:55 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
2 Cамый умный Выложи славянский вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 10:51 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
Недоходящий2 Cамый умный Выложи славянский вариант. Ну, это просто: "Семь раз отмерь, один - отрежь" Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Правда, если в результате в WHERE вообще ничего не оказалось, то все-равно либо придется ставить "заглушку" типа "1=1", либо включать внутрь макроподстановки само слово "WHERE". Но это уже на выходе из функции формирования условия. С "обрезанием", правда, короче получается . Но это уже вопрос личных предпочтений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 12:01 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
2 ВладимирМ это точно. я использую и тот и другой. в зависимости от ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2005, 13:20 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
Hi ВладимирМ! Помоему проще (и код короче) не резать, и не проверять всё, а дописать в самом конце к этой "собранной" строке "1=1" - и никаких проблем ;) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2005, 01:13 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi ВладимирМ! Помоему проще (и код короче) не резать, и не проверять всё, а дописать в самом конце к этой "собранной" строке "1=1" - и никаких проблем ;) Posted via ActualForum NNTP Server 1.3 Честно сказать, ну никак не пойму, что значит "1=1" ? Можно же просто написать lcWhere = " " , или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2005, 14:59 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
понимаешь, это зделано для того чтоб если на конце строки есть '.and.', то при исполнений будет ошибка. и чтоб ее небыло ставишь на конце '1=1' типа пустое условие. или обрезаешь '.and.' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2005, 15:13 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
Hi romzes5! И что тогда получится в результате? Код: plaintext Как видишь это некорректное условие. А если дописать в конце 1=1, то получится вполне корректно - и смысл условия это не изменит. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2005, 03:10 |
|
||
|
Организовать правильно фильтр ...
|
|||
|---|---|---|---|
|
#18+
В этом ответе я поддерживаю Igor Korolyov-а. так как об этом способе сам незнал. попробывал, все класс! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2005, 10:20 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33402992&tid=1592896]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 426ms |

| 0 / 0 |
