powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Фильтрация
19 сообщений из 19, страница 1 из 1
Фильтрация
    #37952934
Андрей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

в таблице много записей и поэтому в грид данные выводятся долго и прокрутка происходит медленно. Как сделать чтобы работало быстрее? Есть альтернативный способ? Мне подсказали сделать так: 1. подготавливать курсоры с выборкой которые в Гриде и отображать
2. использовать SET KEY TO RANGE по индексу. но я не очень понимаю как это сделать. помогите реализовать приведите примерный код хотя бы
...
Рейтинг: 0 / 0
Фильтрация
    #37953159
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей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. подготавливать курсоры с выборкой которые в Гриде и отображатьДумаю, вполне достаточно будет. Попробуй.
...
Рейтинг: 0 / 0
Фильтрация
    #37953407
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему надо использовать именно массив? Почему не временную таблицу/курсор?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE tmp (ser C(10), pol C(20))
INDEX ON ser+pol TAG serpol
SET ORDER TO TAG serpol
***
SELECT tmp
DELETE ALL
APPEND FROM ARRAY arrSerPol
SELECT MyWorkTable
SET RELATION TO ser+pol INTO tmp
SET FILTER TO !EOF('tmp')
SET FILTER TO !EOF('tmp') AND EMPTY(ALLTRIM(smocod))
...
Рейтинг: 0 / 0
Фильтрация
    #37953691
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM, А не могли бы вы объяснить как работает ваш код подробнее. Я не очень понял как работает он.
...
Рейтинг: 0 / 0
Фильтрация
    #37953730
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот код полностью при открытии формы(в 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"
...
Рейтинг: 0 / 0
Фильтрация
    #37953743
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989,

Требуется только отобразить данные или нужно что-то редактировать?
...
Рейтинг: 0 / 0
Фильтрация
    #37953750
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот проект сам.. в форме1 на кнопке обновить или на форме1 в Init нужно вместо Set filter to сделать иначе чтобы быстрее сортировала. но я не понимаю как
...
Рейтинг: 0 / 0
Фильтрация
    #37953792
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надо сделать так: вместо SET FILTER TO сразу SQL-SELECT-ом выбрать нужные отфильтрованные записи в курсор (выборка в паямти - ОЗУ, не физическая таблица), показать их регистратору в гриде, и если он правит поле Код СМО - отлавливать это событие и по его выполнении делать UPDATE в реальной физической таблице. Единственный конфликт - если рег-р изменяет поле Код СМО, а в физической таблицеце на сервере оно уже не пустое (с момента выполнения SELECT-а и до того как этот рег-р нашел и инициировал изменение этого поля другой регистратор уже изменил на сервер его). Этот конфликт разруливается так: если регистратор апдейит поле Код СМО, а оно пустое - UPDATE выполняется "молча". Если он апдейтит поле Код СМО, а в нем тоже самое значение - UPDATE не нужно выполнять. Если он апдейтит поле Код СМО, а там другое непустое значние - надо выдать вопрос "В поле Код СМО данного пациента уже введено значение .... другим регистратором, вы уверены, что нужно изменить это значение?" и если он подтверждает -только тогда выполнить UPDATE.. Я выше оставил проект.. помогите разобраться
...
Рейтинг: 0 / 0
Фильтрация
    #37954124
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей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.
SELECT pacient
IF thisform.check1.Value=0
  SET FILTER TO !ISBLANK(pacient.ser) AND !ISBLANK(pacient.polis)
ELSE
  SET FILTER TO !ISBLANK(pacient.ser) AND !ISBLANK(pacient.polis) AND ISBLANK(pacient.smocod)
ENDIF
GO TOP 

А вообще там у тебя конкретно наворочено, половину можно выкинуть без вреда для здоровья
...
Рейтинг: 0 / 0
Фильтрация
    #37954199
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1
Где таблицы? Без них сложно что-то понять, уже в ините какие-то странные вещи...
...
Рейтинг: 0 / 0
Фильтрация
    #37954304
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, вот таблицы я по одной записи оставил а то много весили
...
Рейтинг: 0 / 0
Фильтрация
    #37954306
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, нужно чтобы на форме 1 в грид верхнем прокрутка нормально происходила.. вместо set filter другой способ выбрать, а то при большом числе записей тормозит жутко
...
Рейтинг: 0 / 0
Фильтрация
    #37954320
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей8989, задача такова, есть другая форма в котором регистратор-врач вводит свой пароль, и переходит на форму1.. в форме 1 в верхнем грид нужно отобразить данные из таблицы pacient которых обслуживал этот врач, а в нижнем грид данные из таблицы obsled
...
Рейтинг: 0 / 0
Фильтрация
    #37954337
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989Андрей8989, задача такова, есть другая форма в котором регистратор-врач вводит свой пароль, и переходит на форму1.. в форме 1 в верхнем грид нужно отобразить данные из таблицы pacient которых обслуживал этот врач, а в нижнем грид данные из таблицы obsled

Ну и какие проблемы?
SELECT pacient
SET FILTER TO врач = этот врач
GO TOP

А таблицу obsled связать с pacient SET RELATION
...
Рейтинг: 0 / 0
Фильтрация
    #37954352
Jonny540
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989нужно чтобы на форме 1 в грид верхнем прокрутка нормально происходила.. вместо set filter другой способ выбрать, а то при большом числе записей тормозит жуткоЕсли фильтр нормальный, то не тормозит, во всяком случае, жутко...
У тебя там ASCAN на большом количестве элементов, чему удивляться. :) Не надо здесь массивы использовать.
Вообще-то, это еще не проект, а так, наброски, не обижайся.
Целиком проект за тебя здесь вряд ли кто-то будет делать, могут только подсказать путь "в светлое будущее".
А селекты, имхо, ты и сам можешь сделать, вот только с "отловом" надо подумать, вариантов несколько.
...
Рейтинг: 0 / 0
Фильтрация
    #37954362
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, программу не я писал.. бывший работник намудрил и мне нужно оптимизировать ее. Поэтому прошу написать код где выполняется фильтрация по другому. Я просто не знаю как сделать по другому
...
Рейтинг: 0 / 0
Фильтрация
    #37954521
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Jonny540, напиши пожалуйста код чтобы вместо фильтрации программа на form1 в верхнем грид выводила только те записи,которых зарегистрировал данный врач который вводил пароль. примерно хотя бы образец (((
...
Рейтинг: 0 / 0
Фильтрация
    #37954607
Андрей8989
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей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
...
Рейтинг: 0 / 0
Фильтрация
    #37954772
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей8989,

Писал же
SELECT pacient
SET FILTER TO врач = этот врач
GO TOP
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Фильтрация
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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