|
Фильтрация
|
|||
---|---|---|---|
#18+
есть таблица из которой выбираются данные фильтрацией по двум параметрам вот код авторIF thisform.check1.Value=0 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 ELSE IF thisform.check1.Value=1 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 AND EMPTY(ALLTRIM(smocod)) ENDIF ENDIF в таблице много записей и поэтому в грид данные выводятся долго и прокрутка происходит медленно. Как сделать чтобы работало быстрее? Есть альтернативный способ? Мне подсказали сделать так: 1. подготавливать курсоры с выборкой которые в Гриде и отображать 2. использовать SET KEY TO RANGE по индексу. но я не очень понимаю как это сделать. помогите реализовать приведите примерный код хотя бы ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2012, 16:24 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Андрей8989есть таблица из которой выбираются данные фильтрацией по двум параметрам вот код IF thisform.check1.Value=0 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 ELSE IF thisform.check1.Value=1 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 AND EMPTY(ALLTRIM(smocod)) ENDIF ENDIF Да уж... "Я могла бы придумать и более запутанный способ, как это сделать,- с гордостью сказала Белая Королева"(с) Андрей89891. подготавливать курсоры с выборкой которые в Гриде и отображатьДумаю, вполне достаточно будет. Попробуй. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2012, 17:49 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
А почему надо использовать именно массив? Почему не временную таблицу/курсор? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2012, 20:51 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
AndreTM, А не могли бы вы объяснить как работает ваш код подробнее. Я не очень понял как работает он. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 07:15 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Вот код полностью при открытии формы(в Init). Он делает фильтрацию из таблицы пациентов по полям Ser и polis, таблица tmpobsled курсор. Помогите найти альтернативное решение фильтрации а то ужасно тормозит фильтрация. Нужно другим способом делать фильтрацию по этим полям авторthisform.MousePointer = 11 SELECT ALLTRIM(ser)+ALLTRIM(polis) DISTINCT FROM tmpObsled INTO ARRAY arrSerPol SELECT pacient IF thisform.check1.Value=0 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 ELSE IF thisform.check1.Value=1 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 AND EMPTY(ALLTRIM(smocod)) ENDIF ENDIF SET ORDER TO FAM && ALLTRIM(FAM)+ALLTRIM(IM)+ALLTRIM(OT) GO TOP *thisform.grid1.RecordSource='Pacient' thisform.grid1.Refresh thisform.grid2.RecordSource='tmpObsled' thisform.grid2.Column1.ControlSource='tmpObsled.n_tal' thisform.grid2.Column2.ControlSource='tmpObsled.dat_obs' thisform.grid2.Column3.ControlSource='tmpObsled.nam' thisform.grid2.Column4.ControlSource='tmpObsled.n_cab' thisform.grid2.Column5.ControlSource='tmpObsled.n_ch' thisform.grid2.Column6.ControlSource='tmpObsled.n_min' thisform.grid2.Column7.ControlSource='tmpObsled.pri_zak' thisform.Label1.Caption=vnamreg thisform.grid1.SetFocus() thisform.grid1.SetAll("DynamicBackColor","IIF(LEN(ALLTRIM(pacient.smocod))>0,RGB(255,255,255),RGB(255,0,0))","Column") SELECT tmpObsled SET FILTER TO ser=Pacient.ser AND polis=Pacient.polis AND BETWEEN(dat_obs,startDate,endDate) AND nom_reg=vnom_reg AND INLIST(pri_zak,0,2) thisform.MousePointer = 0 подсказали через курсор и привели примерный код, но он не работает как надо автор*a = "" * IF thisform.check1.Value=1 * a = " AND EMPTY(ALLTRIM(smocod))" * ENDIF * select * from pacient where ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 &a into cursor Curs1 * ThisForm.Grid1.RecordSource = "Curs1" ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 08:35 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Андрей8989, Требуется только отобразить данные или нужно что-то редактировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 08:50 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Вот проект сам.. в форме1 на кнопке обновить или на форме1 в Init нужно вместо Set filter to сделать иначе чтобы быстрее сортировала. но я не понимаю как ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 08:56 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Надо сделать так: вместо SET FILTER TO сразу SQL-SELECT-ом выбрать нужные отфильтрованные записи в курсор (выборка в паямти - ОЗУ, не физическая таблица), показать их регистратору в гриде, и если он правит поле Код СМО - отлавливать это событие и по его выполнении делать UPDATE в реальной физической таблице. Единственный конфликт - если рег-р изменяет поле Код СМО, а в физической таблицеце на сервере оно уже не пустое (с момента выполнения SELECT-а и до того как этот рег-р нашел и инициировал изменение этого поля другой регистратор уже изменил на сервер его). Этот конфликт разруливается так: если регистратор апдейит поле Код СМО, а оно пустое - UPDATE выполняется "молча". Если он апдейтит поле Код СМО, а в нем тоже самое значение - UPDATE не нужно выполнять. Если он апдейтит поле Код СМО, а там другое непустое значние - надо выдать вопрос "В поле Код СМО данного пациента уже введено значение .... другим регистратором, вы уверены, что нужно изменить это значение?" и если он подтверждает -только тогда выполнить UPDATE.. Я выше оставил проект.. помогите разобраться ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 09:35 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Андрей8989SELECT ALLTRIM(ser)+ALLTRIM(polis) DISTINCT FROM tmpObsled INTO ARRAY arrSerPol SELECT pacient IF thisform.check1.Value=0 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 ELSE IF thisform.check1.Value=1 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 AND EMPTY(ALLTRIM(smocod)) ENDIF ENDIF Так не проще? Код: plsql 1. 2. 3. 4. 5. 6. 7.
А вообще там у тебя конкретно наворочено, половину можно выкинуть без вреда для здоровья ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 12:12 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
+1 Где таблицы? Без них сложно что-то понять, уже в ините какие-то странные вещи... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 12:46 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Jonny540, вот таблицы я по одной записи оставил а то много весили ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 13:24 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Jonny540, нужно чтобы на форме 1 в грид верхнем прокрутка нормально происходила.. вместо set filter другой способ выбрать, а то при большом числе записей тормозит жутко ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 13:26 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Андрей8989, задача такова, есть другая форма в котором регистратор-врач вводит свой пароль, и переходит на форму1.. в форме 1 в верхнем грид нужно отобразить данные из таблицы pacient которых обслуживал этот врач, а в нижнем грид данные из таблицы obsled ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 13:33 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Андрей8989Андрей8989, задача такова, есть другая форма в котором регистратор-врач вводит свой пароль, и переходит на форму1.. в форме 1 в верхнем грид нужно отобразить данные из таблицы pacient которых обслуживал этот врач, а в нижнем грид данные из таблицы obsled Ну и какие проблемы? SELECT pacient SET FILTER TO врач = этот врач GO TOP А таблицу obsled связать с pacient SET RELATION ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 13:41 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Андрей8989нужно чтобы на форме 1 в грид верхнем прокрутка нормально происходила.. вместо set filter другой способ выбрать, а то при большом числе записей тормозит жуткоЕсли фильтр нормальный, то не тормозит, во всяком случае, жутко... У тебя там ASCAN на большом количестве элементов, чему удивляться. :) Не надо здесь массивы использовать. Вообще-то, это еще не проект, а так, наброски, не обижайся. Целиком проект за тебя здесь вряд ли кто-то будет делать, могут только подсказать путь "в светлое будущее". А селекты, имхо, ты и сам можешь сделать, вот только с "отловом" надо подумать, вариантов несколько. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 13:48 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Jonny540, программу не я писал.. бывший работник намудрил и мне нужно оптимизировать ее. Поэтому прошу написать код где выполняется фильтрация по другому. Я просто не знаю как сделать по другому ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 13:53 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Jonny540, напиши пожалуйста код чтобы вместо фильтрации программа на form1 в верхнем грид выводила только те записи,которых зарегистрировал данный врач который вводил пароль. примерно хотя бы образец ((( ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 15:16 |
|
Фильтрация
|
|||
---|---|---|---|
#18+
Андрей8989, а как отфильтровать записи по полям Ser и Polis занести эти поля в курсор и отобразить в грид в этом коде авторSELECT ALLTRIM(ser)+ALLTRIM(polis) DISTINCT FROM tmpObsled INTO ARRAY arrSerPol SELECT pacient IF thisform.check1.Value=0 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 ELSE IF thisform.check1.Value=1 SET FILTER TO ASCAN(arrSerPol,ALLTRIM(ser)+ALLTRIM(polis))>0 AND EMPTY(ALLTRIM(smocod)) ENDIF ENDIF ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2012, 16:01 |
|
|
start [/forum/topic.php?fid=41&msg=37954607&tid=1583459]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 150ms |
0 / 0 |