2012-04-10 144 views
4

我有一個允許多個值的參數。它用於我的數據庫中的名稱字段。我想要做的就是讓用戶輸入一個名字,然後讓水晶找到任何名字,比如他們輸入的任何名字。例如,你可以輸入4個姓氏,水晶會返回姓名中任何名字的人。我可以讓「like」工作得很好,但只有當數組中有一個字符串時纔可以。以下是我的選擇公式:通過多值參數數組循環

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
  • 所有多個值:TRUE

添加一行到參數的選擇列表網格;供應 'ALL' 和 'ALL'(不含單引號)

這個文本創建自定義函數(命名爲 '劃界'):

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

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

修改報表的記錄選擇公式:

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

任選地,創建公式與該文本,以顯示該參數的值:

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

謝謝!這工作完美。 – ccarnley7 2012-04-11 15:00:24

2

幸運的是,CR可以自動處理這種情況(至少在CR2008中,我剛剛證實了這一點)。你可以做{?Customer Name}="All" or {NAMEFIELD} like {?Customer Name}

最終用戶可以正確使用通配符,但可以在參數的幫助文本中添加blurb,或者使用編輯蒙版強制*名稱*格式。

+0

Ryan說的是正確的,或者你當然可以做'{'Customer Name} =「All」或{NAMEFIELD} like'*'+ {?客戶名稱} +'*''所以用戶不必輸入通配符:) – 2012-04-10 20:30:29

+1

@LTetickt儘管看起來是正確的,那實際上是行不通的。 '+'運算符在字符串數組上的作用與字符串上的不同。它基本上將兩個'*'字符串作爲數組中的附加條目處理,因此您將匹配每條記錄。如果你嘗試以相同的方式使用'&'連接運算符,CR會給你一個錯誤。 – Ryan 2012-04-10 21:13:11

0

的其他方法(我認爲有必要創建一個單獨的答案),如果你有Oracle,就是利用REGEXP_LIKE表達式。

  • 創建一個使用命令的報告。
  • 在命令面板中創建一個字符串參數({?QUERY});將默認值設置爲'ALL'(不帶單引號)。
  • 將查詢添加到命令;參考參數:

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%'