powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / CR. Множественный LIKE
23 сообщений из 23, страница 1 из 1
CR. Множественный LIKE
    #37272522
whyt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет! Ребят, подскажите как справиться с такой проблемой: в качестве входного параметра используется текстовое поле, заполненное следующием образом "%11%,%22%,%05%" и так далее. Задача состоит в том, чтобы отфильтровать датасет с этим условием, но поскольку множественного LIKE не бывает, то нужно составить условие "field LIKE '%11%' OR field LIKE '%22%' OR...". Я в редакторе формул пытаюсь составить множественное условие (в цикле разбираю параметр и в итоге вывожу в качестве формулы выбора строку типа "and field LIKE .. OR field LIKE .. "), но CR его игнорирует. Подскажите, есть ли более удачные варианты решения? Да, источником данных является запрос. Спасибо.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37273750
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt,
Скобки нужно ставить:
and ( field LIKE .. OR field LIKE .. " )
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37273880
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MAYAKOV_SV , спасибо за совет, но наверно я не правильно объяснился. Попробую подробнее.
Для того, чтобы задать формулу выбора я использую Мастер выбора, после этого захожу в редактор формул и пишу следующий код
Параметр следующего вида - "%15%,%16%". Я не буду перегружать пример разбором этого параметра.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
if (hasValue({?to_date})) then //условие, относящееся к другому полю
    {fieldname}<{?to_date}
else
    true
and 
if (hasValue({?from_date})) then //условие, относящееся к другому полю
    {fieldname} >{?from_date}
else
    true
and
(
    numberVar i :=  0 ; 
    while i <  2  do 
    ( 
        if (i =  0 ) then 
            {STOP_R.SHPG_LOC_CD} like "*49*";
        if (i =  1 ) then 
            {STOP_R.SHPG_LOC_CD} like "*13*"; 
        i := i +  1 ;
    )
)
Это, конечно, пример без разбора и с "жестко" закодированными значениями, но он сути не меняет.. так вот, как я понимаю последняя секция кода возвращает не условие с like, а true т.к. воспринимает цикл while..do, который успешно завершился.. не знаете, как это обойти? т.е. динамически сформировать условие выборки. Спасибо.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37273936
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут простой программисткий финт:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
if (hasValue({?to_date})) then //условие, относящееся к другому полю
    {fieldname}<{?to_date}
else
    true
and 
if (hasValue({?from_date})) then //условие, относящееся к другому полю
    {fieldname} >{?from_date}
else
    true
and
(
    numberVar i :=  0 ; 
    numberVal result := - 1 ;
    while i <  2  do 
    ( 
        if ((i =  0 ) and ({STOP_R.SHPG_LOC_CD} like "*49*")) then 
        (
            result :=  1 ;
            Exit While;
        );
        if ((i =  1 ) and ({STOP_R.SHPG_LOC_CD} like "*13*")) then 
        (
            result :=  1 ;
            Exit While;
        );
        i := i +  1 ;
    )
    result;
)
Тут так объясню:
1) храню переменную результата сравнения result , и после выполнения кода пишу result; , что означает возрат результата.
2) т.к. условие OR, то пишу выход Exit While если найдено хотя бы одно совпадения.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37273941
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_ а true т.к. воспринимает цикл while..do, который успешно завершился..
У меня false = -1, а true = 1. Не знаю, как это сработает, может false = 0, попробовать.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37273967
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за предложенный вариант, но ,к сожалению, не могу его проверить, т.к. при проверке кода возникает ошибка "Отсутствует правая круглая скобка"..
Немного изменил то, что Вы предложили, но это тоже не работает :(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
and 
(
    numberVar i :=  0 ; 
    booleanVar result := false;
    while i <  2  do 
    (
        if ((i =  0 ) and ({STOP_R.SHPG_LOC_CD} like "*49*")) then 
        (
            result := true;
            Exit While;
        );
        if ((i =  1 ) and ({STOP_R.SHPG_LOC_CD} like "*13*")) then 
        (
            result := true;
            Exit While;
        );
        i := i +  1 ;
    )
    result
)  
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37273984
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_Немного изменил то, что Вы предложили, но это тоже не работает :(

Код: plaintext
1.
2.
3.
4.
while ...
(
);
result;
Там в двух местах точки с запятой нужно поставить:
1) после скобки while ... (...);
2) после result;

Я думал это мелочи...:)
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37273998
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, Вы знаете, самое удивительное в том, что я был уверен, что это проверил.. понедельник - таки дает о себе знать :)
Еще раз спасибо за помощь!
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274107
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то рано я порадовался, не подскажите, почему мой вариант всё же не работает?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
//другие условия
and
(
    if ( length ({?warehouse_id} ) >  0  ) then 
    (
        booleanVar result := false; 
        stringVar str_warehouse := {?warehouse_id}; 
        stringVar str_temp := "";     
        numberVar i :=  1 ; 
        while (i <= length( str_warehouse ) ) do 
        (
            if ( not (str_warehouse[i] = ",") ) then
            ( 
                if ( str_warehouse[i] = "%" ) then 
                    str_temp := str_temp + "*" 
                else 
                    str_temp := str_temp + str_warehouse[i]; 
            );
            if ( (str_warehouse[i] = ",") and ({table.field} like str_temp ) ) then 
            (
                str_temp := ""; 
                result := true; 
                Exit While; 
            ); 
            if ( (i = length( str_warehouse )) and ( length( str_temp ) >  0  ) ) then 
            (
                {table.field} like str_temp; 
                str_temp := ""; 
                result := true; 
                Exit While; 
            );  
            i:= i +  1 ; 
        ); 
        result; 
    ); 
)
Подозреваю, что последняя секция if некорректна.. но и без нее не работает
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274245
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_,

1)Если последнее условие обрабатывает конец списка, то
выкиньте последнюю инструкцию if и сделайте так:
stringVar str_warehouse := {?warehouse_id} + ",";
2) str_temp у вас не в том месте обнуляется.
Примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
//другие условия
and
(
    if ( length ({?warehouse_id} ) >  0  ) then 
    (
        booleanVar result := false; 
        stringVar str_warehouse := {?warehouse_id} + ";"; 
        stringVar str_temp := "";     
        numberVar i :=  1 ; 
        while (i <= length( str_warehouse ) ) do 
        (
            if ( not (str_warehouse[i] = ",") ) then
            ( 
                if ( str_warehouse[i] = "%" ) then 
                    str_temp := str_temp + "*" 
                else 
                    str_temp := str_temp + str_warehouse[i]; 
            ) else
            (
                    str_temp := "";
            );
            if ( (str_warehouse[i] = ",") and ({table.field} like str_temp ) ) then 
            (
                result := true; 
                Exit While; 
            ); 
            i:= i +  1 ; 
        ); 
        result; 
    ); 
)
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274252
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_,
Ой, ошибся в коде:
stringVar str_warehouse;
if (len(str_warehouse) > 0) then str_warehouse := {?warehouse_id} + ",";
Смысл такого приема в том, что не надо анализировать последнюю строку особым образом.
Достаточно добавить в конец запятую к существующей строке и все.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274258
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот опять :(

if ( length (str_warehouse) > 0) then str_warehouse := {?warehouse_id} + ",";

Я надеюсь, разберетесь со всем этим.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274312
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
str_temp у вас не в том месте обнуляется.

Почему?
Допустим, если warehouse_id = "%15%,%16%", то я должен посимвольно проанализировать и записать в str_temp.
Т.е. сначала str_temp должна стать = "*15*" и быть использовано в условии like, после этого обнуляю str_temp и снова заполняю, чтобы получть str_temp = "*16*" и снова применить like..
Вроде так..
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274335
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_str_temp у вас не в том месте обнуляется.

Почему?
Допустим, если warehouse_id = "%15%,%16%", то я должен посимвольно проанализировать и записать в str_temp.
Т.е. сначала str_temp должна стать = "*15*" и быть использовано в условии like, после этого обнуляю str_temp и снова заполняю, чтобы получть str_temp = "*16*" и снова применить like..
Вроде так..
Логика верная, только реализация хромает.
str_temp у вас обнуляется при выходе из цикла, а это роли не играет.
А вот во время цикла при "встрече" с запятой, там, как раз где надо, не обнуляется.
Вот я и поставил это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 if (not (str_warehouse[i] = ","))
 ( 
   ...
 ) else
 (  
    str_temp := "";
 )
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274339
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но ведь тогда она будет пустой уже для условия like?
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274404
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Но ведь тогда она будет пустой уже для условия like?

Да, точно. Возможно правильно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
//другие условия
and
(
    if ( length ({?warehouse_id} ) >  0  ) then 
    (
        booleanVar result := false; 
        stringVar str_warehouse := {?warehouse_id};
        if (length(str_warehouse) >  0 ) then str_warehouse := {?warehouse_id} + ",";
        stringVar str_temp := "";     
        numberVar i :=  1 ; 
        while (i <= length( str_warehouse ) ) do 
        (
            if ( not (str_warehouse[i] = ",") ) then
            ( 
                if ( str_warehouse[i] = "%" ) then 
                    str_temp := str_temp + "*" 
                else 
                    str_temp := str_temp + str_warehouse[i]; 
            ) else
            (
             if ({table.field} like str_temp ) ) then 
             (
                result := true; 
                Exit While; 
             ); 
             str_temp := "";
            );
            i:= i +  1 ; 
        ); 
        result; 
    ); 
)
Понедельник, все-таки. :)
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274547
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, и снова ничего не выбирает.. :(
Можно как - то проверить то конечное условие, которое использует Crystal Reports после всех манипуляций?
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274555
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понял, в чем ошибка.. поскольку в самом начале используется and, то происходит выбор записей типа "условия and field like XXX and field like YYY" - а это некорректно для одного и того же поля..
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274698
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_Хм, и снова ничего не выбирает.. :(
Можно как - то проверить то конечное условие, которое использует Crystal Reports после всех манипуляций?
Вот код сравнения поправил:
Код: plaintext
1.
2.
3.
4.
5.
if (uppercase({table.field}) like uppercase(trim(str_temp)) ) then 
(
    result := true; 
    Exit While; 
); 
Нужно было ужать пробелы trim , а также привести все буквы к верхнему регистру uppercase , как обычно делают в like сравнениях.
У меня теперь все работает.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274731
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_Понял, в чем ошибка.. поскольку в самом начале используется and, то происходит выбор записей типа "условия and field like XXX and field like YYY" - а это некорректно для одного и того же поля..
Вообще очень странно так писать:
and (
..операторы, что-то делают..
)

Может вычислить result сначала а в конце написать?:
if (.....) and result = true then true; else false;
Так?
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274814
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как так сделать если неизвестно количество условий изначально?
Ведь параметр может быть как %11%,%12%, так и %11%,%12%,%13%,%14%,...
Вот в этом вся и загвоздка..
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274884
MAYAKOV_SV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
whyt_А как так сделать если неизвестно количество условий изначально?
Ведь параметр может быть как %11%,%12%, так и %11%,%12%,%13%,%14%,...
Вот в этом вся и загвоздка..
Так у вас же цикл while идет. Я так понял, что вы его и сделали с той целью, чтобы обрабатывать любое количество условий like.
...
Рейтинг: 0 / 0
CR. Множественный LIKE
    #37274932
whyt_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь..сам путаюсь и Вас запутал..
В общем, решил чуть по-другому.
Создал формулу @Search
Вот ее код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
booleanVar result := false; 
stringVar str_warehouse := {?warehouse_id};
if (length(str_warehouse) >  0 ) then str_warehouse := {?warehouse_id} + ",";
stringVar str_temp := "";     
numberVar i :=  1 ; 
while (i <= length( str_warehouse ) ) do 
  (
     if ( not (str_warehouse[i] = ",") ) then
       ( 
          if ( str_warehouse[i] = "%" ) then 
              str_temp := str_temp + "*" 
          else 
             str_temp := str_temp + str_warehouse[i]; 
       ) 
    else
      (  if ( {STOP_R.SHPG_LOC_CD} like str_temp ) then 
           ( 
             result := true; 
             Exit While; 
           ); 
         str_temp := "";
      );
      i:= i +  1 ; 
 );  
 result;

А потом добавил в мастере разделов для секции Details такое условие для Supress:
Код: plaintext
1.
not {@Search}

Таким образом получаю подавление всех строк с полем, неудовлетворяющим этому условию
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / CR. Множественный LIKE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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