Looping through a multiple value parameter array

三世轮回 提交于 2019-12-30 09:32:20

问题


I have a parameter that allows multiple values. Its for a name field in my database. What I want to be able to do is allow the user to put in a name and then have crystal find any name like any of the names they entered. So for example you could put in 4 last names and crystal would return anyone who had any of those names in the name field. I can get the "like" to work just fine, but only when there is one string in the array. Here is my select formula:

    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
    )

This formula returns all of the names, not the ones in the parameter. Any ideas on what I'm doing wrong?


回答1:


Create a multi-value parameter ({?Customer Name}) with these properties:

  • Default Value: ALL
  • All multiple values: TRUE

Add a row to the parameter's pick-list grid; supply 'ALL' and 'ALL' (without single quotes)

Create a Custom Function (named 'Delimit') with this text:

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

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

Modify the report's record-selection formula:

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

Optionally, create a formula to display the parameter's values with this text:

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



回答2:


Luckily CR can handle this situation automatically (at least in CR2008, where I just confirmed it). You can just do {?Customer Name}="All" or {NAMEFIELD} like {?Customer Name}.

It will be up to the end user to use the wild cards appropriately, but you can add a blurb to the parameter's help text or force the *Name* format with an edit mask.




回答3:


Another approach (I thought it made sense to create a separate answer), if you have Oracle, is to make use of the REGEXP_LIKE expression.

  • Create a report that uses a Command.
  • Create a string parameter ({?QUERY}) in the Command's panel; set the default value to 'ALL' (without single quotes).
  • Add the query to the Command; reference the parameter:

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

  • Add fields to the report as usual
  • When prompted (running the report), enter a regular expression in the QUERY parameter. The pattern 'A|B|C' is equivalent to LIKE '%A%' OR LIKE '%B%' OR LIKE '%C%'.


来源:https://stackoverflow.com/questions/10093544/looping-through-a-multiple-value-parameter-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!