INSTRING() глючит?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
morkovin
Ветеран
Сообщения: 871
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

INSTRING() глючит?

Сообщение 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,' - как и должно быть!
Что за ерунда?!
WBR, morkovin
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5246
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

INSTRING() глючит?

Сообщение Игорь Столяров »

Пардон конечно, а нельзя ли убрать для теста навороты (оставив один InString) и показать строку поиска (Uch:Streets) ?
А то вопрос в стиле: почему 2 * X = 5 ? ;)
«V» значит Вендетта !
Аватара пользователя
morkovin
Ветеран
Сообщения: 871
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

INSTRING() глючит?

Сообщение 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 происходит какая-то ерунда
WBR, morkovin
Аватара пользователя
morkovin
Ветеран
Сообщения: 871
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

INSTRING() глючит?

Сообщение morkovin »

Игорь Столяров писал(а): 31 Октябрь 2020, 22:13 Пардон конечно, а нельзя ли убрать для теста навороты (оставив один InString) и показать строку поиска (Uch:Streets) ?
А то вопрос в стиле: почему 2 * X = 5 ? ;)
Чтобы совсем понятно было:
Вот НЕправильный результат для поиска 'Волжский Карбышева 60'
01.11_4.png
Вот правильный результат для поиска 'Волжский Карбышева 160'
01.11_3.png
WBR, morkovin
Аватара пользователя
morkovin
Ветеран
Сообщения: 871
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

INSTRING() глючит?

Сообщение 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)? Как?
WBR, morkovin
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5246
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

INSTRING() глючит?

Сообщение Игорь Столяров »

morkovin писал(а): 01 Ноябрь 2020, 5:41Разобрался!
Это абсолютно нормально. Я тоже несколько раз находил "ошибки" в Instring(). :)
Потом перевёл фильтры на Match() и вот там действительно уже нужно думать перед тем как делать ... ;)
morkovin писал(а): 01 Ноябрь 2020, 5:41 Или сделать эту проверку где-то в ValidateRecord (для Browse)? Как?
Простой вопрос, без обсуждения смысла действия.
Вы не хотите забиндить функцию и её добавить в штатный фильтр BROWSE ?
А уже внутри функции, спокойно, разобрать Ваши строки / подстроки и т.д. и получить условие отбора записи.
«V» значит Вендетта !
Аватара пользователя
morkovin
Ветеран
Сообщения: 871
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

INSTRING() глючит?

Сообщение morkovin »

Игорь Столяров писал(а): 01 Ноябрь 2020, 7:02 Простой вопрос, без обсуждения смысла действия.
Вы не хотите забиндить функцию и её добавить в штатный фильтр BROWSE ?
А уже внутри функции, спокойно, разобрать Ваши строки / подстроки и т.д. и получить условие отбора записи.
Как забиндить переменную я знаю. А как забиндить свою функцию? Не знаю, не пробовал. Как?
WBR, morkovin
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5246
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

INSTRING() глючит?

Сообщение Игорь Столяров »

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

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

  ! BIND variables
  BIND('Loc:Status',Loc:Status)  ! Added by: BrowseBox(ABC)
  Bind('MyFilter',MyFilter)         ! Добавляем вручную                   
«V» значит Вендетта !
Аватара пользователя
morkovin
Ветеран
Сообщения: 871
Зарегистрирован: 20 Июль 2005, 13:53
Откуда: Volgograd, Russia
Контактная информация:

INSTRING() глючит?

Сообщение 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)         ! Добавляем вручную                   
WBR, morkovin
Ответить