Предикат like

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Senkrid
Постоянный гость
Сообщения: 74
Зарегистрирован: 10 ноя 2009, 07:08
Откуда: Ангарск
Контактная информация:

Предикат like

Сообщение Senkrid »

Обьясните- что делаю не так?
Задача: найти вхождение в строку IncludeCode. Для примера шаблон = '%60%'

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

const
...
 IncludeCode = '07,08,10,15,20,21,23,24,25,26,29,41,60,62,76,79,84,91,94,97,98,99';
...
cmInit:
{
 Message(IncludeCode like '%60%')
}
...
Выдает False постоянно, кроме случая, когда шаблон = '07%' или использовании '_'(при этом явно же указываю номер позиции количеством самих _)

v.5.4.30
KATZ
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49

Сообщение KATZ »

Всё правильно делаете, просто LIKE своеобразно работает. Шестерка первый раз встречается в числе 26, предикат на нем и спотыкается. Уберёте первую шестерку - получите TRUE. Надежнее пользоваться функцией POS.
Senkrid
Постоянный гость
Сообщения: 74
Зарегистрирован: 10 ноя 2009, 07:08
Откуда: Ангарск
Контактная информация:

Сообщение Senkrid »

Всё правильно делаете, просто LIKE своеобразно работает. Шестерка первый раз встречается в числе 26, предикат на нем и спотыкается. Уберёте первую шестерку - получите TRUE. Надежнее пользоваться функцией POS.
Как раз сейчас нашел Pos и InStr (одинаковые функции но с разными именами :???: Кто знает - зачем?)

Спасибо,KATZ :cool: Буду знать про такую особенность
LaaLaa

Сообщение LaaLaa »

Рекомендую использовать функцию MatchesMask

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

function MatchesMask(Filename: string, Mask: string): Boolean; external 'G_TXO.DLL';

const
...
 IncludeCode = '07,08,10,15,20,21,23,24,25,26,29,41,60,62,76,79,84,91,94,97,98,99';
...
cmInit:
{
 Message(MatchesMask(IncludeCode, '*60*');
} 
LaaLaa

Сообщение LaaLaa »

Из документации по ТХО API

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

3.4.5.	Прочие полезные функции

3.4.5.1.	Проверить, удовлетворяет ли строка (Str) маске (Mask)

function MatchesMask(Str, Mask : string): Boolean;

Маски могут включать обычные символы (буквы и цифры), а также специальные выражения:

* или #	любое количество символов;
?	один любой символ;
[cx~z]	один любой символ из перечисленных в квадратных скобках;
[!cx~z]	один любой символ кроме тех, что указаны в квадратных скобках.

Допускаются и отдельные символы, и их диапазоны. Диапазоны обозначаются символом '~'.
Например, коды объектов 1010, 101000, 101001, 1010A, 1010B могут быть выбраны с помощью маски 1010#.
Маска #1010# выберет и 1010, и A1010A, и B1010B.
Маска [ABX~Z]#1010 может выбрать и Alpha1010, и Beta1010, и Xsystem1010, и Ysystem1010, и Zsystem1010.
В фильтрах можно задать несколько масок, разделенных точкой с запятой. Например, чтобы выбрать все объекты серии 1010, 1020 и 1030, вы можете ввести маску #1010#;#1020#;#1030#.
В фильтрах также можно указать маски исключения. Маска исключения — это одна или несколько масок,  которым не должны соответствовать коды требуемых объектов, она отделяется от основной маски символом | (вертикальная черта).

Примеры использования масок исключения:
1.	1010#
Все объекты с кодами, начинающимися на 1010.
2.	#|1010#;1020#
Все объекты, кроме тех, у которых коды начинаются на 1010 и 1020.
3.	#|
Все объекты, кроме тех, у которых код пустой.
4.	#|1010#|1020#
Ошибка — спецсимвол | не может встречаться более одного раза.
5.	|1010#
Обрабатывается как #|1010#
Через точку с запятой перечисляются маски, а при помощи символа '|' маски-включения отделяются от масок-исключения.
Более подробное описание синтаксиса маски смотрите в документации по модулю ХозОперации.

Senkrid
Постоянный гость
Сообщения: 74
Зарегистрирован: 10 ноя 2009, 07:08
Откуда: Ангарск
Контактная информация:

Re:

Сообщение Senkrid »

LaaLaa, спасибо! Учту и это
Ответить