2012-04-10 2 views
4

У меня есть параметр, который допускает несколько значений. Его для поля имени в моей базе данных. То, что я хочу сделать, это позволить пользователю ввести имя, а затем кристалл найти любое имя, как любое из имен, которые они ввели. Например, вы могли бы добавить 4 фамилии, и кристалл вернет любого, у кого было какое-либо из этих имен в поле имени. Я могу заставить «как» работать нормально, но только тогда, когда в массиве есть одна строка. Вот моя формула выбора:Цитирование через массив параметров с несколькими значениями

numbervar counter := 1; 
    numbervar positionCount:=count({?Customer Name}); //I'm not sure what to put 
                 here. Count? UBound? 

    if {?Customer Name}[1] <> 'ALL' 
    then 
    (
     while(counter <= positionCount) 
     do 
     (  
      {NAMEFIELD} like '*' & {?Customer Name}[counter] & '*'; 
      counter := counter + 1; 
     ); 
    ) 
    else 
    if {?Customer Name}[1] = 'ALL' 
    then 
    true 
    ) 

Эта формула возвращает все имена, а не те, которые указаны в параметре. Любые идеи о том, что я делаю неправильно?

ответ

2

Создать параметр многозначным ({имя клиента?}) С такими свойствами:

  • Значение по умолчанию: ВСЕ
  • Все несколько значений: ИСТИНА

Добавить строку в сетка списков параметров; поставки 'ALL' и 'ALL' (без одиночных кавычек)

Создание пользовательской функции (названный 'разграничить') с этим текстом:

// Delimit() 
// enclose each value in array in **, returning an array 
Function (Stringvar Array params) 

    Split("*" + Join(params, "*,*") + "*", ",") 

Modify формулу записей селекционной отчета:

If {?Customer Name}<>"ALL" Then 
    {TABLE.CUSTOMER_NAME} LIKE Delimit({?Customer Name}) 
Else 
    True 

Необязательно создать формулу для отображения значений параметра с таким текстом:

//{@Customer Name} 
Join(Delimit({?Customer Name}), ";") 
+0

Спасибо! Это сработало отлично. – ccarnley7

2

К счастью, CR может справиться с этой ситуацией автоматически (по крайней мере, в CR2008, где я только что подтвердил это). Вы можете просто сделать {?Customer Name}="All" or {NAMEFIELD} like {?Customer Name}.

Соответствующим образом использовать дикие карты будет конечным пользователем, но вы можете добавить рекламный блок в текст справки параметра или форматировать * * формат * с помощью маски редактирования.

+0

Что говорит Райан, или вы можете, конечно, «{? Customer Name} =« All »или {NAMEFIELD}, например '*' + {?Имя клиента} + '*' ', поэтому пользователю не нужно вводить подстановочный знак :) –

+1

@LeeTickett Несмотря на кажущееся правильное, это фактически не сработает. Оператор «+» работает по-разному на строковых массивах, чем на строках. В основном это касается двух строк «*» в качестве дополнительных записей в массиве, поэтому вы будете сопоставлять каждую запись. Если вы попытаетесь использовать оператор '&' concatenation таким же образом, CR выдаст вам ошибку. – Ryan

0

другой подход (я думал, что имеет смысл создать отдельный ответ), если у вас есть Oracle, нужно использовать выражение REGEXP_LIKE.

  • Создайте отчет, в котором используется команда.
  • Создайте параметр строки ({? QUERY}) на панели команд; установите для значения по умолчанию значение «ВСЕ» (без одинарных кавычек).
  • Добавьте запрос в команду; ссылки на параметр:

SELECT customer_name FROM customers WHERE ('{?QUERY}'='ALL' OR REGEXP_LIKE(customer_name, '{?QUERY}'))

  • Добавление полей в отчет, как обычно
  • При запросе (запуск отчета), введите регулярное выражение в параметре запроса. Образец 'A|B|C' эквивалентен LIKE '%A%' OR LIKE '%B%' OR LIKE '%C%'.
Смежные вопросы