Страница 1 из 1

INSTRING() глючит?

Добавлено: 31 Октябрь 2020, 20:59
morkovin
C11, ABC
Фильтр:

Код: Выделить всё

 
    Loc:Dom=', 60,'
    Loc:Filter='INSTRING(CLIP(UPPER(Loc:Search)),CLIP(UPPER(Uch:Streets)),1,1)<>0 AND '|
        &'INSTRING(CLIP(UPPER(Loc:Dom)),UPPER(Uch:Streets),1,1)<>0'
Если Loc:Dom=', 60,' , то отфильтровываются ДВЕ записи со значениями ', 60,' и ', 160,' :shock:
Если Loc:Dom=', 160,' , то отфильтровывается ОДНА запись со значением ', 160,' - как и должно быть!
Что за ерунда?!

INSTRING() глючит?

Добавлено: 31 Октябрь 2020, 22:13
Игорь Столяров
Пардон конечно, а нельзя ли убрать для теста навороты (оставив один InString) и показать строку поиска (Uch:Streets) ?
А то вопрос в стиле: почему 2 * X = 5 ? ;)

INSTRING() глючит?

Добавлено: 01 Ноябрь 2020, 4:32
morkovin
Игорь Столяров писал(а): 31 Октябрь 2020, 22:13 Пардон конечно, а нельзя ли убрать для теста навороты (оставив один InString) и показать строку поиска (Uch:Streets) ?
А то вопрос в стиле: почему 2 * X = 5 ? ;)
Вот первая строка:
ул, 40 лет победы, 15, 23, 25, 27, 31, 9, 7, 13, 19, 15, 17, 29, 33,
ул. Оломоуцкая, 8, 10, 12, 14, 16,
ул. Карбышева, 146, 138, 148, 154, 156, 158, 160, 140, 142, 150, 152,
ул. Ленина, 375, 377, 381, 379, 373, 375а, 371, 371а, 383, 367а, 365, 369,

Вот вторая строка:
ул.Заводская, 1, 3, 5, 7, 9, 11,
ул Карбышева, 60,
ул Советская, 41, 41а, 41б, 43, 45, 65, 69, 69а, 71, 73,
ул Карбышева, 41, 43, 45, 46, 48, 50, 50а, 54, 54а, 56, 56а, 62,
ул Энгельса, 16, 18, 20, 22, 24,

Вот фильтр в SetQueueRecord:

Код: Выделить всё

        loc:Str= CLIP(st.GetLine(i#))
        IF INSTRING(CLIP(UPPER(Loc:Search)),UPPER(Loc:Str),1,1)<>0 |
            AND INSTRING(CLIP(UPPER(Loc:Dom)),UPPER(Loc:Str),1,1)<>0 THEN
            RtfText=CLIP(RtfText) & Loc:Str &'<13>'   
        END

Здесь накапливаю результат поиска в переменную RtfText. И здесь получаю правильный результат - только ОДНУ строку:
ул Карбышева, 60,

Т.е. здесь INSTRING() отрабатывает верно, а в фильтре для Browse происходит какая-то ерунда

INSTRING() глючит?

Добавлено: 01 Ноябрь 2020, 4:47
morkovin
Игорь Столяров писал(а): 31 Октябрь 2020, 22:13 Пардон конечно, а нельзя ли убрать для теста навороты (оставив один InString) и показать строку поиска (Uch:Streets) ?
А то вопрос в стиле: почему 2 * X = 5 ? ;)
Чтобы совсем понятно было:
Вот НЕправильный результат для поиска 'Волжский Карбышева 60'
01.11_4.png
Вот правильный результат для поиска 'Волжский Карбышева 160'
01.11_3.png

INSTRING() глючит?

Добавлено: 01 Ноябрь 2020, 5:41
morkovin
Разобрался! Всё дело в адресных данных. Фильтр работает правильно
Вот, например, "проблемная"запись:
ул, Оломоуцкая, 18, 22, 28, 24,
ул. 40 лет победы, 35, 39,
ул. Карбышева, 117, 125, 125а, 121, 123, 115, 103, 103а, 113, 111, 105, 109, 107,
ул. Дружбы, 50, 52, 54, 58, 60, 66, 68, 70, 72, 96,
Фильтр срабатывает на "Карбышева" и на "60", но в подстроке "ул. Дружбы, 50, 52, 54, 58, 60, 66, 68, 70, 72, 96," ! Т.к. для фильтра это одна строка, а не набор подстрок, разделённых символом '<13>'

но легче не стало. Теперь надо фильтровать записи Browse на этапе SetQueueRecord, т.к. здесь я проверяю именно подстроки. Но как не добавлять в Queue ненужную запись?
Или сделать эту проверку где-то в ValidateRecord (для Browse)? Как?

INSTRING() глючит?

Добавлено: 01 Ноябрь 2020, 7:02
Игорь Столяров
morkovin писал(а): 01 Ноябрь 2020, 5:41Разобрался!
Это абсолютно нормально. Я тоже несколько раз находил "ошибки" в Instring(). :)
Потом перевёл фильтры на Match() и вот там действительно уже нужно думать перед тем как делать ... ;)
morkovin писал(а): 01 Ноябрь 2020, 5:41 Или сделать эту проверку где-то в ValidateRecord (для Browse)? Как?
Простой вопрос, без обсуждения смысла действия.
Вы не хотите забиндить функцию и её добавить в штатный фильтр BROWSE ?
А уже внутри функции, спокойно, разобрать Ваши строки / подстроки и т.д. и получить условие отбора записи.

INSTRING() глючит?

Добавлено: 01 Ноябрь 2020, 8:04
morkovin
Игорь Столяров писал(а): 01 Ноябрь 2020, 7:02 Простой вопрос, без обсуждения смысла действия.
Вы не хотите забиндить функцию и её добавить в штатный фильтр BROWSE ?
А уже внутри функции, спокойно, разобрать Ваши строки / подстроки и т.д. и получить условие отбора записи.
Как забиндить переменную я знаю. А как забиндить свою функцию? Не знаю, не пробовал. Как?

INSTRING() глючит?

Добавлено: 01 Ноябрь 2020, 8:11
Игорь Столяров
morkovin писал(а): 01 Ноябрь 2020, 8:04 Как забиндить переменную я знаю. А как забиндить свою функцию?
Точно также, только в Embed.

Код: Выделить всё

  ! BIND variables
  BIND('Loc:Status',Loc:Status)  ! Added by: BrowseBox(ABC)
  Bind('MyFilter',MyFilter)         ! Добавляем вручную                   

INSTRING() глючит?

Добавлено: 01 Ноябрь 2020, 10:01
morkovin
Спасибо! Переделал фильтр - всё отлично работает. :)
Игорь Столяров писал(а): 01 Ноябрь 2020, 8:11
morkovin писал(а): 01 Ноябрь 2020, 8:04 Как забиндить переменную я знаю. А как забиндить свою функцию?
Точно также, только в Embed.

Код: Выделить всё

  ! BIND variables
  BIND('Loc:Status',Loc:Status)  ! Added by: BrowseBox(ABC)
  Bind('MyFilter',MyFilter)         ! Добавляем вручную