Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / CR. Множественный LIKE / 23 сообщений из 23, страница 1 из 1
21.05.2011, 11:10
    #37272522
whyt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Всем привет! Ребят, подскажите как справиться с такой проблемой: в качестве входного параметра используется текстовое поле, заполненное следующием образом "%11%,%22%,%05%" и так далее. Задача состоит в том, чтобы отфильтровать датасет с этим условием, но поскольку множественного LIKE не бывает, то нужно составить условие "field LIKE '%11%' OR field LIKE '%22%' OR...". Я в редакторе формул пытаюсь составить множественное условие (в цикле разбираю параметр и в итоге вывожу в качестве формулы выбора строку типа "and field LIKE .. OR field LIKE .. "), но CR его игнорирует. Подскажите, есть ли более удачные варианты решения? Да, источником данных является запрос. Спасибо.
...
Рейтинг: 0 / 0
23.05.2011, 07:33
    #37273750
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
whyt,
Скобки нужно ставить:
and ( field LIKE .. OR field LIKE .. " )
...
Рейтинг: 0 / 0
23.05.2011, 10:04
    #37273880
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
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
23.05.2011, 10:29
    #37273936
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный 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.
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
23.05.2011, 10:31
    #37273941
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
whyt_ а true т.к. воспринимает цикл while..do, который успешно завершился..
У меня false = -1, а true = 1. Не знаю, как это сработает, может false = 0, попробовать.
...
Рейтинг: 0 / 0
23.05.2011, 10:43
    #37273967
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Спасибо за предложенный вариант, но ,к сожалению, не могу его проверить, т.к. при проверке кода возникает ошибка "Отсутствует правая круглая скобка"..
Немного изменил то, что Вы предложили, но это тоже не работает :(
Код: 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
23.05.2011, 10:54
    #37273984
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
whyt_Немного изменил то, что Вы предложили, но это тоже не работает :(

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

Я думал это мелочи...:)
...
Рейтинг: 0 / 0
23.05.2011, 11:02
    #37273998
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Хм, Вы знаете, самое удивительное в том, что я был уверен, что это проверил.. понедельник - таки дает о себе знать :)
Еще раз спасибо за помощь!
...
Рейтинг: 0 / 0
23.05.2011, 11:49
    #37274107
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный 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.
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
23.05.2011, 12:43
    #37274245
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
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
23.05.2011, 12:46
    #37274252
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
whyt_,
Ой, ошибся в коде:
stringVar str_warehouse;
if (len(str_warehouse) > 0) then str_warehouse := {?warehouse_id} + ",";
Смысл такого приема в том, что не надо анализировать последнюю строку особым образом.
Достаточно добавить в конец запятую к существующей строке и все.
...
Рейтинг: 0 / 0
23.05.2011, 12:47
    #37274258
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Ну вот опять :(

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

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

Почему?
Допустим, если warehouse_id = "%15%,%16%", то я должен посимвольно проанализировать и записать в str_temp.
Т.е. сначала str_temp должна стать = "*15*" и быть использовано в условии like, после этого обнуляю str_temp и снова заполняю, чтобы получть str_temp = "*16*" и снова применить like..
Вроде так..
...
Рейтинг: 0 / 0
23.05.2011, 13:12
    #37274335
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
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
23.05.2011, 13:16
    #37274339
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Но ведь тогда она будет пустой уже для условия like?
...
Рейтинг: 0 / 0
23.05.2011, 13:43
    #37274404
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
>Но ведь тогда она будет пустой уже для условия 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
23.05.2011, 14:46
    #37274547
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Хм, и снова ничего не выбирает.. :(
Можно как - то проверить то конечное условие, которое использует Crystal Reports после всех манипуляций?
...
Рейтинг: 0 / 0
23.05.2011, 14:51
    #37274555
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Понял, в чем ошибка.. поскольку в самом начале используется and, то происходит выбор записей типа "условия and field like XXX and field like YYY" - а это некорректно для одного и того же поля..
...
Рейтинг: 0 / 0
23.05.2011, 15:43
    #37274698
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
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
23.05.2011, 15:53
    #37274731
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
whyt_Понял, в чем ошибка.. поскольку в самом начале используется and, то происходит выбор записей типа "условия and field like XXX and field like YYY" - а это некорректно для одного и того же поля..
Вообще очень странно так писать:
and (
..операторы, что-то делают..
)

Может вычислить result сначала а в конце написать?:
if (.....) and result = true then true; else false;
Так?
...
Рейтинг: 0 / 0
23.05.2011, 16:17
    #37274814
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
А как так сделать если неизвестно количество условий изначально?
Ведь параметр может быть как %11%,%12%, так и %11%,%12%,%13%,%14%,...
Вот в этом вся и загвоздка..
...
Рейтинг: 0 / 0
23.05.2011, 16:44
    #37274884
MAYAKOV_SV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
whyt_А как так сделать если неизвестно количество условий изначально?
Ведь параметр может быть как %11%,%12%, так и %11%,%12%,%13%,%14%,...
Вот в этом вся и загвоздка..
Так у вас же цикл while идет. Я так понял, что вы его и сделали с той целью, чтобы обрабатывать любое количество условий like.
...
Рейтинг: 0 / 0
23.05.2011, 16:57
    #37274932
whyt_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CR. Множественный LIKE
Извиняюсь..сам путаюсь и Вас запутал..
В общем, решил чуть по-другому.
Создал формулу @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
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / CR. Множественный LIKE / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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