【问题标题】:BIRT report parameter with multiple values passed from JSP page具有从 JSP 页面传递的多个值的 BIRT 报告参数
【发布时间】:2015-01-14 09:34:35
【问题描述】:

我已将 BIRT 集成到 Web 应用程序中。我正在使用 Eclipse Luna、JDK 1.8、BIRT Report Engine 4.1.1 和 我使用的数据源是 Excel 数据源(不是 JDBC 等) .在我的 JSP 页面中,我使用 Javascript AJAX 在 URL 中传递了两个参数,例如:`

var reporturl ="/Reporting/loadReport?ReportName="+reportName+"&ReportFormat=html&Supplier=Supplier4&Metal=Gold&Metal=Tin";     

    $("#reportData").html("Loading...<br><img src='/Reporting/resources/images/loading.gif' align='middle' >");

    $('#reportData').load(reporturl ,function(response, status, xhr) {

      if (status == "error") {
        var msg = "Sorry but there was an error getting details ! ";
        $("#reportData").html(msg + xhr.status + " " + xhr.statusText);
      }
    });

对于报告参数“金属”,我选择了显示类型:列表框、数据类型:字符串并选择了动态值,然后选中了“允许多个值”复选框。然后在表格的属性编辑器中,在过滤器选项卡中,我给出了如下表达式:

row["Supplier Name"] Equal to params["Supplier"].value
row["Metal"] In params["Metal"].value

在 ReportRenderer.java 中切换到 JavaEE 透视图后,我有以下代码来获取与“Metal”参数关联的多个值(从 URL 传递),我已将这些值合并为逗号(, ) 单个字符串变量中的分隔列表,例如:

    public static String getParameter( HttpServletRequest request,
        String parameterName )
{

    if ( request.getCharacterEncoding( ) == null )
    {
        try
        {
            request.setCharacterEncoding( UTF_8_ENCODE );
        }
        catch ( UnsupportedEncodingException e )
        {
        }
    }
    String[] values = request.getParameterValues(parameterName);
    String temp="";
    if(values.length>1)
    {
        int i=0;
       for(i=0;i<values.length-1;i++)
       {
         temp=temp+values[i]+",";
       }
       temp=temp+values[i];
    }
    else
    {
        temp = values[0];
    }

    return temp;
}

在 HashMap 中,我成功获取了所有参数及其各自的值,并将该 Map 设置为:

HashMap<String,Object> tempMap = new HashMap<String,Object>(); 
    tempMap = discoverAndSetParameters( runnable, request ); 
    for(String str : tempMap.keySet())
    {
        System.out.println("Key : "+str);
        System.out.println("Value : "+tempMap.get(str));
    }
    iRunTask.setParameterValues(tempMap);

这里runnable是IReportRunnable的对象,request是HttpServletRequest的对象。 现在,当我运行 Web 应用程序时,单击名为“报告”的超链接后,我在控制台上收到以下异常,而网页上没有输出。

org.eclipse.birt.report.engine.api.impl.ParameterValidationException: The type of parameter "Metal" is expected as "Object[]", not "java.lang.String".
at org.eclipse.birt.report.engine.api.impl.EngineTask.validateAbstractScalarParameter(EngineTask.java:857)
at org.eclipse.birt.report.engine.api.impl.EngineTask.access$0(EngineTask.java:789)
at org.eclipse.birt.report.engine.api.impl.EngineTask$ParameterValidationVisitor.visitScalarParameter(EngineTask.java:706)
at org.eclipse.birt.report.engine.api.impl.EngineTask$ParameterVisitor.visit(EngineTask.java:1531)
at org.eclipse.birt.report.engine.api.impl.EngineTask.doValidateParameters(EngineTask.java:692)
at org.eclipse.birt.report.engine.api.impl.RunTask.doRun(RunTask.java:214)
at org.eclipse.birt.report.engine.api.impl.RunTask.run(RunTask.java:86)

请帮助我如何解决这个问题,我再次指定我使用的是 Excel 数据源,而不是 JDBC 或脚本等等。我已经浏览了许多与 JDBC 数据源相关的问题的博客,但对我没有帮助。

【问题讨论】:

    标签: java eclipse excel birt


    【解决方案1】:

    当列表框参数声明为“允许多个值”时,BIRT 引擎需要一个值数组,但在您的情况下您发送一个字符串。 因此,当您检测到一个多值参数时,而不是构建一个逗号分隔的字符串,您应该构建一个 java 值数组并将这个数组传递给参数映射。这样它就会起作用。

    注意这个数组的元素应该具有 BIRT 期望的数据类型:如果“Metal”参数在您的报表设计中设置为“String”类型,那么您应该能够使用来自 getParameter 的“values”数组函数,否则将需要构建一个新数组。

    【讨论】:

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