【问题标题】:JasperReports Server: Multi select query in report using input parameterJasperReports Server:使用输入参数在报表中进行多选查询
【发布时间】:2014-05-22 09:51:30
【问题描述】:

请帮助我在我的报告中传递一个输入参数,以便我可以使用带有参数的多选查询。

在我的报告中,我使用的是$x{IN,ADMIN1,admins},但得到了

错误:参数admins的java.lang.string类型错误,admins应该是一个数组或集合。

Mysql查询:

Select ADMIN1,WEEK1,WEEK2,WEEK3,(((WEEK3-WEEK2)/WEEK2)*100) as percentage_change, (WEEK3-

WEEK2) as MSU_Difference,SUMWEEK2,SUMWEEK3,SUMWEEK,WEEK4,WEEK5,(((WEEK5-WEEK4)/WEEK4)*100)

 as percentage_change_PRE,admin,ORGNo,OrgAbbr,msus from ((select admin as ADMIN1, sum(msu) 

as WEEK1 from sccp_raw where dt >= date_sub(date($P{start_date}), INTERVAL 14 DAY) and dt 

< date_sub(date($P{end_date}), INTERVAL 13 DAY) group by admin order by WEEK1) as 

q1,(select admin as ADMIN2, sum(msu) as WEEK2 from sccp_raw where dt >= 

date_sub(date($P{start_date}), INTERVAL 7 DAY) and dt < date_sub(date($P{end_date}), 

INTERVAL 6 DAY) group by admin order by WEEK2) as q2,(select admin as ADMIN3, sum(msu) as 

WEEK3 from sccp_raw where dt between $P{start_date} and $P{end_date} group by admin order 

by WEEK3) as q3,(select sum(msu) as SUMWEEK2 from sccp_raw where dt >= 

date_sub(date($P{start_date}), INTERVAL 7 DAY) and dt < date_sub(date($P{end_date}), 

INTERVAL 6 DAY))as q4,(select sum(msu) as SUMWEEK3 from sccp_raw where dt >= 

date_sub(date($P{start_date}), INTERVAL 14 DAY) and dt < date_sub(date($P{end_date}), 

INTERVAL 13 DAY))as q5,(select sum(msu) as SUMWEEK from sccp_raw where dt BETWEEN 

$P{start_date} and $P{end_date})as q6,(select sum(msu) as WEEK4 from sccp_raw where dt >= 

date_sub(date($P{start_date}), INTERVAL 372 DAY) and dt < date_sub(date($P{end_date}), 

INTERVAL 371 DAY)) as q7,(select sum(msu) as WEEK5 from sccp_raw where dt >= 

date_sub(date($P{start_date}), INTERVAL 365 DAY) and dt < date_sub(date($P{end_date}), 

INTERVAL 364 DAY)) as q8,(select sum(msu) as MSU from sccp_raw where dt between 

$P{start_date} and $P{end_date}) as q9,(select a.dt,a.admin,b.ORGNo, b.OrgAbbr, sum(a.msu) 

as msus from sccp_raw a left join (select ORGNo, ADMINS, OrgAbbr from orig) b on 

a.admin=b.ADMINS where a.dt between $P{start_date} and $P{end_date} group by a.admin)as 

q10)  where $X{IN,ADMIN1,admins} and ADMIN1=ADMIN3 and ADMIN2=ADMIN3 and admin=ADMIN3 

group by ADMIN1 order by WEEK3 desc; 

参数配置:

parameter "admins":  

class: `java.util.Collection`  

Default Value Expression: "select admin from sccp_raw group by admin"  

还帮助我了解是否要创建此下拉列表以选择为“所有管理员”,然后选择管理员列表。

【问题讨论】:

    标签: jasper-reports jasperserver input-parameters


    【解决方案1】:

    对于Collection类型的multiselect参数,您不需要给出“All”来选择iReport中的所有值作为该参数的默认值,默认情况下表示所有值都被选中。

    但如果参数是单选,那么查询 jasperreport 服务器输入控件将在输入控件值中获取“全部”:-

     SELECT * FROM (
     SELECT 'All Admins' admin from sccp_raw 
     UNION
     SELECT DISTINCT admin from sccp_raw) a
     ORDER BY admin
    

    而 iReport 查询将是:-

      SELECT *
      FROM table
      WHERE ($P{admins}='All Admins' OR Admin=$P{admins}) 
    

    例如,使用 ireport 中的示例 HSQL 数据库查看此报告:-

      <?xml version="1.0" encoding="UTF-8"?>
      <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports 
      http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report1"     
      pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20"  
       topMargin="20" bottomMargin="20" uuid="0d2f9917-101e-4d51-9d78-172909ca097a"> 
    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <parameter name="p_SHIPCOUNTRY" class="java.lang.String">
        <defaultValueExpression><![CDATA["Germany"]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[SELECT SHIPCOUNTRY,SHIPCITY
    
        FROM orders
        WHERE  ($P{p_SHIPCOUNTRY}='All' OR SHIPCOUNTRY=$P{p_SHIPCOUNTRY})]]>
    </queryString>
    <field name="SHIPCOUNTRY" class="java.lang.String"/>
    <field name="SHIPCITY" class="java.lang.String"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="29">
            <textField>
                <reportElement uuid="f6cbe144-e64a-4537-b3b8-e6a461dd5a72"
                       x="114" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{SHIPCOUNTRY}]]>
                    </textFieldExpression>
            </textField>
            <textField>
    
                <reportElement uuid="c13e2483-d005-4f56-8ce8-d64f923f0359"
                     x="417" y="3" width="100" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{SHIPCITY}]]>             
            </textFieldExpression>
            </textField>
        </band>
            </detail>
    
                </jasperReport>
    

    更多详情可以访问我的blog

    【讨论】:

    • 1.正如您所建议的,现在“所有管理员”和不同的“管理员”在 ireport 中工作正常,但我所要做的就是手动键入管理员名称,因为 没有可见的下拉列表。 2.我的参数是管理员,我在下面的查询中分配了:“从 sccp_raw UNION SELECT DISTINCT admin 从 sccp_raw 中选择'所有管理员'管理员”但是如 ireport-4.7.0 中所述,我需要手动提供管理员名称,同时使用jasperserver 4.7.0 中相同的 jrxml 和输入控件(如上所述),在千名管理员中只有一个管理员名称可见。请提出建议。
    • 检查输入控件的查询或使用上述查询在 Jaspereport 服务器中创建基于单选查询的输入控件
    • 如果我在 mysql 命令行上测试你给出的参数查询运行良好,但在 ireport 和 jasperserver 上使用它时同样的问题。至少在我报告中,我必须手动输入管理员名称,然后它会填充正确的报告,但我碧玉它只在下拉列表中显示一个管理员名称:(
    • 我已经在 jasper 服务器上更新了我的参数配置,现在所有管理员都可以在下拉菜单中看到。但它仍然没有在 jasper 服务器中编译报告。
    • 我已经告诉过你,如果多选参数是类类型:java.util.Collection 那么你不需要选择“全部”来传递输入控件的所有值,我的解决方案可以使用类类型单选:java.land.String .
    【解决方案2】:

    您必须在 jrxm 文件中使用 java.util.Collection。

    Here, send your multi ids from your selection to your .jasper file.
          String qGelirGrubu = "1,2,3,4,5";
          String[] convertedGelirArray = qGelirGrubu.split(",");
          List<Integer> convertedGelirList = new ArrayList<Integer>();
          for (String number : convertedGelirArray) {
               convertedGelirList.add(Integer.parseInt(number.trim()));
          }
         parameters.put("qGelirGrubu1", convertedGelirList);
    

    在您的 .jrxml 文件中; 像这样定义你的参数;

    <parameter name="qGelirGrubu1" class="java.util.Collection"/>
    

    您的 SQL 查询可以像这样使用您的参数;

    select * from TABLE_NAME A where A.ID IN (1,2,3,4,5);像 .jrxml 文件中的那样:

     select * from TABLE_NAME A where  $X{IN,A.ID,qGelirGrubu1} 
    

    $X{IN,COLUMN_NAME,YOUR_PARAMETER_NAME}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多