powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Set Filter
11 сообщений из 11, страница 1 из 1
Set Filter
    #33788463
dj_raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Denj dobrij, jestj takaja problemma. Vipolnjaju sledujuschij kod:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
ind_dep_filter_start_dd=THISFORM.olecontrol1.day
ind_dep_filter_start_mm=THISFORM.olecontrol1.month
ind_dep_filter_start_yy=THISFORM.olecontrol1.year

ind_dep_filter_end_dd=THISFORM.olecontrol2.day
ind_dep_filter_end_mm=THISFORM.olecontrol2.month
ind_dep_filter_end_yy=THISFORM.olecontrol2.year

LOCAL dt, dt2
dt=(ALLTRIM(STR(ind_dep_filter_start_dd))+"/"+ALLTRIM(STR(ind_dep_filter_start_mm))+"/"+ALLTRIM(STR(ind_dep_filter_start_yy)))
dt2=(ALLTRIM(STR(ind_dep_filter_end_dd))+"/"+ALLTRIM(STR(ind_dep_filter_end_mm))+"/"+ALLTRIM(STR(ind_dep_filter_end_yy)))
SET DATE TO DMY
SELECT industrial_department
IF THISFORM.check1.Value= 1 
	SET FILTER TO (industrial_department.rep_date=CTOD(dt)) AND (industrial_department.rep_date<=CTOD(dt2))
	GOTO BOTTOM 
	GOTO TOP  
	calling_form.ind_dep_grid.refresh
ENDIF 
olecontrol'i javljajutsja da-time picker'ami. Ne srabativajet set filter to. V blok if/enif zahodit bez problem, vse komandi prohodjat bez gljukov no zapisi ne filtrujutsja :(
...
Рейтинг: 0 / 0
Set Filter
    #33788477
dj_raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nebolshaja popravka v kode,
Код: plaintext
SET FILTER TO (industrial_department.rep_date>=CTOD(dt)) AND (industrial_department.rep_date<=CTOD(dt2))
...
Рейтинг: 0 / 0
Set Filter
    #33788545
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Боже мой, какой кошмар! Ну почему народ прямо таки обожает работать именно с символьным представлением даты, а не с самой датой? Очень нравиться лепить длиннющие строки, зависящие от настроек и постоянно конвертировать строка <-> дата?

Код: plaintext
1.
dt=(ALLTRIM(STR(ind_dep_filter_start_dd))+"/"+ALLTRIM(STR(ind_dep_filter_start_mm))+"/"+ALLTRIM(STR(ind_dep_filter_start_yy)))
dt2=(ALLTRIM(STR(ind_dep_filter_end_dd))+"/"+ALLTRIM(STR(ind_dep_filter_end_mm))+"/"+ALLTRIM(STR(ind_dep_filter_end_yy)))


Процитированное очень неплохо заменяется на:

Код: plaintext
1.
dt=date(ind_dep_filter_start_yy)), ind_dep_filter_start_mm, ind_dep_filter_start_dd)))
dt2=date(ind_dep_filter_end_yy, ind_dep_filter_end_mm, ind_dep_filter_end_yy)))
При этом становятсяя не нужными манипуляции с SET DATE и ковертация industrial_department.rep_date>=CTOD(dt)
...
Рейтинг: 0 / 0
Set Filter
    #33788569
dj_raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
eto vsje konechno horosho, no problemma ostajetsja. Set Filter ne srabativajet. :(
...
Рейтинг: 0 / 0
Set Filter
    #33788629
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит "не работает"? Что значит "не фильтруются"? А что должно быть? Предложенные переделки опробовал? Результат? Как определил, что "не работает"?
...
Рейтинг: 0 / 0
Set Filter
    #33788638
dj_raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
u menja v baze dannih 4 zapisi. Posle filtracii po date dolzhno bilo ostatsja 2. Sidjat zhe vse 4 kak milenkije :( Tvoj kod vstavil, raznici nikakoj :(
...
Рейтинг: 0 / 0
Set Filter
    #33788648
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то на однин недочет уже указал dj_raven , проверить что сам фильтр не совсем корректен можно тестом

Код: plaintext
1.
2.
3.
4.
5.
CREATE CURSOR test (id i)

INSERT INTO test (id) VALUES ( 1 )
INSERT INTO test (id) VALUES ( 2 )

SET FILTER TO id =  1  AND id <= 2 

как видишь, записи с id = 2 нет в отфильтрованных данных.

Далее, выполни команды
Код: plaintext
1.
2.
?industrial_department.rep_date
* and
?CTOD(dt)) 
перед самым выполнением фильтра и напиши результат сюда.
...
Рейтинг: 0 / 0
Set Filter
    #33788971
grayalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 PaulWist
Приведенный пример несовсем корректен...
Выражение фильтра получается "равно 1 И меньше либо равно 2". А под это подходит только 1.
...
Рейтинг: 0 / 0
Set Filter
    #33789106
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
grayalex 2 PaulWist
Приведенный пример несовсем корректен...
Выражение фильтра получается "равно 1 И меньше либо равно 2". А под это подходит только 1.

Обращаю внимание на код автора

Код: plaintext
SET FILTER TO (industrial_department.rep_date=CTOD(dt)) AND (industrial_department.rep_date<=CTOD(dt2))

Мой код как раз показывает, что автор составил условие фильтра не корректно.
...
Рейтинг: 0 / 0
Set Filter
    #33789906
dj_raven
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ja vtorim svoim postom srazu ispravlenuju versiju napisal. Vot tolko-chto dobilsja chto filtr rabotajet. Pochemu on zarabotal, ja ne ponimaju. Vsje chto ja sdelal, eto vmesto dt i dt2 postavil samo virazhenije date(ind_dep_filter_start_yy)), ind_dep_filter_start_mm, ind_dep_filter_start_dd))) i vtoroje anologichnoje. Posle proverki chto filtr ne rabotajet, vernul vsje kak bilo. Filtr zarabotal :)
P.S. znaju chto idiotskij podhod k poisku reshenija problemmi, no v VFP ja puskaju v hod uzhe vsje. Zdesj ja zachastuju prosto ne vizhu dazhe prichin, iz-za kotorih problemma mozhet vozniknutj :(
...
Рейтинг: 0 / 0
Set Filter
    #33791465
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в области вилимости тех переменных, которые ты используешь в выражении фильтра.

Ты их объявил как

LOCAL dt, dt2

Это значит, что данные переменные будут существовать только в той процедуре, где они и были объявлены.

А выражение фильтра вычисляется каждый раз, при попытке переместить указатель записи. В данном случае, уже ВНЕ той процедуры, где были объявлены эти переменные.

Чтобы этого избежать, в подобных фильтрах используют макроподстановку. Т.е. вместо переменных записывают их значение. В данном случае примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
* Объявляю переменные и определяю их значение
LOCAL dt, dt2
dt=...
dt2=...

* Необходимо окружить значение переменных дополнительными кавычками
* чтобы после макроподстановки это значение осталось символьной строкой
dt = "["+m.dt+"]"
dt2 = "["+m.dt2+"]"

...

* Собственно наложение фильтра с макроподстановкой
SET FILTER TO (industrial_department.rep_date>=CTOD(&dt)) AND (industrial_department.rep_date<=CTOD(&dt2))

В таком синтаксисе уже не имеет значения будут ли существовать переменные dt и dt2 после наложения фильтра, поскольку были использованы не сами переменные, а их значения.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Set Filter
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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