:: Visual Foxpro, Foxpro for DOS
вопрос по grid и set filter
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Добырй день, передаю параметры в форму и делаю set filter по этим параметрам и вроде бы все работает, НО после окончания init в set filter ничего нет, в init filter() выдает все что нужно в lfilt , но если нажму на самой форме кнопку c messagebox(filter()), то будет пустое сообщение,и вся проблема в том что если нажать на grid то появл еще записи которых не должно быть

сам код в init
PARAMETERS pFn, pKkd, pKks, pKdom, pKsc, pKus, pKpu
select protocol
lFilt = ' UPPER(ALLTRIM(FN)) == UPPER(ALLTRIM(pFn))'
IF pKkd <> 0
lFilt = lFilt + ' and Kkd=pKkd'
ENDIF
IF pKks <> 0
lFilt = lFilt + ' and Kks = pKkd'
ENDIF
IF pKdom <> 0
lFilt = lFilt + ' and Kdom = pKdom'
endif
IF pKsc <> 0
lFilt = lFilt + ' and Ksc = pKsc'
ENDIF
IF pKus <> 0
lFilt = lFilt + ' and Kus = pKus'
ENDIF
IF pKpu <> 0
lFilt = lFilt + ' and Kpu = pKpu'
endif
SET FILTER TO &lFilt
MESSAGEBOX(FILTER())
*!* UPPER(ALLTRIM(FN)) == UPPER(ALLTRIM(pFn)) AND IIF(pKkd=0, .t., Kkd = pKkd);
*!* AND IIF(pKks=0,.t., pKks = Kks) AND IIF(pKdom=0, .t., pKdom = Kdom);
*!* AND IIF(pKsc=0, .t., pKsc = Ksc) and IIF(pKus=0, .t., pKus = Kus) AND IIF(pKpu=0, .t., pKpu = Kpu)
*!* browse
*!* LOCATE FOR UPPER(ALLTRIM(FN)) == UPPER(ALLTRIM(pFn)) AND IIF(pKkd=0, .t., pKkd = Kkd) AND IIF(pKks=0,.t., pKks=Kks) AND IIF(pKdom=0, .t., pKdom = Kdom) AND IIF(pKsc=0, .t., pKsc = Ksc) and IIF(pKus=0, .t., pKus = Kus) AND IIF(pKpu=0, .t., pKpu = Kpu)
*!* IF FOUND()
*!* Thisform.EditMsg.Value = Protocol.MSG
*!* ELSE
*!* Thisform.EditMsg.Value = '&#205;&#229;&#242; &#228;&#224;&#237;&#237;&#251;&#245; ...'
*!* ENDIF
Thisform.Refresh
Thisform.Grid1.Edit1.SetFocus



Исправлено 3 раз(а). Последнее : axeum, 08.07.21 12:27
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Burn

Сообщений: 5643
Откуда: Днепр
Дата регистрации: 02.01.2002
lFilt ЛОКАЛЬНАЯ переменная, существующая только в INIT формы. Объявляйте ее как PUBLIC и будет вам счастье.
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
на всякий случай так делал в самом начале но не помогло,
вот так делал
PARAMETERS pFn, pKkd, pKks, pKdom, pKsc, pKus, pKpu
PUBLIC lFilt
я ее конечно объявил public в init но может еще где то надо ее вызвать?



Исправлено 1 раз(а). Последнее : axeum, 08.07.21 13:05
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
axeum
в init filter() выдает все что нужно в lfilt , но если нажму на самой форме кнопку c messagebox(filter()), то будет пустое сообщение
Что говорит об очистке фильтра где-то еще. Ищите.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
понятно что искать а где искать если в методах формы(unload и keypress) кроме init и load я уже и так все закоментил а в методах грида код есть только в AfterRowColChange но там я и это тоже закоментил на всякий случай но не помогло

AfterRowColChange
LPARAMETERS nColIndex
thisform.EditMsg.refresh



load
IF !USED('Protocol')
USE .\DATA\Protocol IN 0 shared
ENDIF
SELECT Protocol



Исправлено 2 раз(а). Последнее : axeum, 08.07.21 13:23
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Burn
lFilt ЛОКАЛЬНАЯ переменная, существующая только в INIT формы. Объявляйте ее как PUBLIC и будет вам счастье.

Однако не она влияет, поскольку это макро.
А набор переменных pk*, которые часть макро.
В текст их преобразовать.

++ доб.
pKks анализируется, но в текст макро повторно включается pKkd.



Исправлено 2 раз(а). Последнее : Taran, 08.07.21 13:42
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
в текст преобразовать т.е. сделать str(pKkd)=str(Kkd)?
с kks немного не удачно получилось, но я всеровно делаю
DO FORM c:\jkx_project\forms\viewprt.scx WITH 'DomKva', 632, 0, 0, 0, 0, 0



Исправлено 2 раз(а). Последнее : axeum, 08.07.21 13:50
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
axeum
понятно что искать а где искать
В отладчике.

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Burn

Сообщений: 5643
Откуда: Днепр
Дата регистрации: 02.01.2002
Taran
Однако не она влияет, поскольку это макро.
У меня работает
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
axeum
SET FILTER TO &lFilt

А там случайно нет другой открытой таблицы?
А то может алиасы путаются.
Для этого стоит на всякий случай указывать в каком алиасе что-то делается:
SET FILTER TO &lFilt IN table1

Кроме того:
axeum
на всякий случай так делал в самом начале но не помогло,
вот так делал
PARAMETERS pFn, pKkd, pKks, pKdom, pKsc, pKus, pKpu
PUBLIC lFilt
я ее конечно объявил public в init но может еще где то надо ее вызвать?

Объявление имеет смысл делать не в init, а в load.
Да и лучше таки же не объявлять public, а просто создать свойство формы, которое и использовать.
Скажем просто в дизайнере заранее создать свойство формы lFilt (странно кстати, что ты назвал его так, а не как-то типа cFilt - для текстовой строки как-то более логичнее вроде).
И потом просто присваивать этому свойству нужную строку при загрузке и подгружать фильтр, используя это свойство формы. Оно всегда будет видно, пока форма не закрыта.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 3 раз(а). Последнее : Crispy, 08.07.21 15:26
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
axeum
Автор

Сообщений: 107
Дата регистрации: 07.07.2020
Нашел в чем была ошибка, исправил ее и все заработало так как надо.
Собсно в чем проблема то было, а она была в setfocus я его начал изменять для таблицы но в итоге забыл про него(раньше он ссылался на поле edit)
было
Thisform.Edit1.SetFocus
стало
Thisform.Grid1.column2.Edit1.SetFocus

и отдельное спасибо тебе , без отладчика никогда не нашел бы эту ошибку, теперь с отладчиком я прямо преисполнился в знаниях
ssa
axeum
понятно что искать а где искать
В отладчике.
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Неожиданная развязка.
Вдруг когда случится такое, а я ничего не понял, в чем ошибка была.
Ну это риторически.
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
axeum
в чем проблема то было, а она была в setfocus я его начал изменять для таблицы но в итоге забыл про него

Taran
Вдруг когда случится такое, а я ничего не понял, в чем ошибка была.

Что ж тут непонятного?

Если у тебя вдруг случится "обнуление" фильтра, то это потому, что ты начал, но не закончил изменять setfocus для таблицы - любую работу следует доводить до конца!
А отладчик - как навигатор для водителя - запустил, а он и говорит человеческим голосом - "Закончи изменять Setfocus и будет тебе... фильтр!"
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
akvvohinc
axeum
в чем проблема то было, а она была в setfocus я его начал изменять для таблицы но в итоге забыл про него

Taran
Вдруг когда случится такое, а я ничего не понял, в чем ошибка была.

Что ж тут непонятного?

Если у тебя вдруг случится "обнуление" фильтра, то это потому, что ты начал, но не закончил изменять setfocus для таблицы - любую работу следует доводить до конца!
А отладчик - как навигатор для водителя - запустил, а он и говорит человеческим голосом - "Закончи изменять Setfocus и будет тебе... фильтр!"

Красивые слова. Новое узнал: setfocus для таблицы. Надо поизучать.
И "отладчик" тоже красиво звучит. Он действительно может сам что-то отладить?
Впрочем понятно что я далёк от фильтров, да и вообще от ...
Механику бы понять. Где теряется установка фильтра? И, неплохо бы, почему?
Но! Такими делами, размером в простынь, здесь занимались единицы.
Максимов, Королёв. Честь им и хвала. И многие другие. Полторы руки хватит чтоб пересчитать.

Куда и когда делся фильтр?
И как это можно отследить именно в дебаггере?
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Taran
Красивые слова. Новое узнал: setfocus для таблицы. Надо поизучать.

Ну поизучай.
Тока не для таблицы, а для грида как бы ж.
Вообще похоже у автора просто где-то не совсем верный подход. У меня к примеру никогда никакие фокусы ни на что в этом плане не влияли. Т.е. проблем такого рода с фильтрами не возникало от слова "вообще". [sm128]

Не скажу наверняка, но скорее всего тут дело таки вовсе не в "фокусе" как таковом - а именно в другом алиасе, к которому возможно привязан Thisform.Edit1, о чем я и упоминал выше. При активности которого никакого фильтра естественно и нет.
Т.е. вещь банальная, без всяких там чудес и волхвований.
Иначе все это выглядит, как шаманизм какой-то.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
тут дело таки вовсе не в "фокусе" как таковом - а именно в другом алиасе, к которому возможно привязан Thisform.Edit1

Какова, на твой взгляд, вероятность того, что такой "нехилый" фильтр, как показано в задании, безошибочно подойдёт для другой таблицы?

Да и в коде игры с Setfocus начинаются позже установки фильтра:
SELECT protocol
SET FILTER ...
Thisform.Grid1.Edit1.SetFocus

Кстати, последняя строчка выглядит реально круто.
Неужели работала?

Вот выше был совет про PUBLIC-переменную iFilt.
А какое отношение эта переменная может иметь к фильтру после его установки?

Вот сообщение от ТС, объясняющее нам действительную причину всех его проблем:
axeum
я ее конечно объявил public в init но может еще где то надо ее вызвать?
И она явно глубже внезапного "обнуления" фильтра - нет базовых знаний.
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
axeum
на всякий случай так делал в самом начале но не помогло,
вот так делал
PARAMETERS pFn, pKkd, pKks, pKdom, pKsc, pKus, pKpu
PUBLIC lFilt
я ее конечно объявил public в init но может еще где то надо ее вызвать?

lFilt используется только в этом методе, её не нужно делать глобальной. А вот переменные pK* должны быть видимы и после завершения работы метода, т.к. фильтр проверяется постоянно, не в момент установки SET FILTER, а во время перехода между записями таблицы, или вывода этих записей в grid/browse и т.п.
Но это плохой подход, если уж оставлять фильтр, то стоит сформировать его там, чтобы он не зависел от внешних переменных. Т.к. все эти pK* судя по всему содержат числа и лишь pFn содержит символы, то формировать строку фильтра нужно примерно так:
lFilt = 'UPPER(ALLTRIM(FN)) == "' + UPPER(ALLTRIM(pFn)) + '"'
&& в переменной pFn не должно быть двойной кавычки, иначе её нужно будет экранировать
IF pKkd <> 0
lFilt = lFilt + ' and Kkd=' + STR(pKkd)
ENDIF
...
В итоге строка фильтра (в отладчике можно посмотреть) будет выглядеть примерно так:
UPPER(ALLTRIM(FN)) == "что-то-тут" and Kkd=123 and ...
И не будет требовать для работы постоянно видимых переменных.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: вопрос по grid и set filter
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
Но это плохой подход, если уж оставлять фильтр, то стоит сформировать его так, чтобы он не зависел от внешних переменных.

А вот нам выше сообщили, что проблема решилась простым переносом фокуса.



Исправлено 1 раз(а). Последнее : akvvohinc, 11.07.21 01:54
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Igor Korolyov
в переменной pFn не должно быть двойной кавычки, иначе её нужно будет экранировать
По этой причине, а также из-за того, что в общем случае в символьном или memo-поле могут быть допустимыми и какие-то "неподходящие" символы (например, с кодом 13), из-за которых "так просто" выражение фильтра не построишь, можно "не думая" приводить такие значения к типу Blob (ну, или экранировать всё значение через CHR() - несимпатично):
UPPER(ALLTRIM(FN)) == "что-то-тут"
UPPER(ALLTRIM(FN)) == 0hf7f2ee2df2ee2df2f3f2
Ratings: 0 negative/0 positive
Re: вопрос по grid и set filter
akvvohinc

Сообщений: 4219
Откуда: Москва
Дата регистрации: 11.11.2008
Taran
Куда и когда делся фильтр?

Как вариант:
Если переменные, используемые в выражении фильтра "исчезли", а ошибки автор "глушит", то результат будет именно таким - фильтр сбросится "по-тихому".

А то, что он, возможно, "глушит" ошибки следует из такой команды в коде:
Thisform.Grid1.Edit1.SetFocus
Если бы ошибки выдавались, то эта команда была бы исправлена.
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 kornienko_ru  (Гостей: 21)

© 2000-2024 Fox Club 
Яндекс.Метрика