2015-01-14 2 views
0

웹 응용 프로그램에 BIRT를 통합했습니다. Eclipse Luna, JDK 1.8, BIRT 보고서 엔진 4.1.1 및 을 사용하고 있습니다. 데이터 원본은 Excel 데이터 원본 그리고 그 모든 것). `JSP 페이지에서 여러 값을 전달하는 BIRT 보고서 매개 변수

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); 
     } 
    }); 
보고서 매개 변수 "금속"내가 선택한 디스플레이 유형에 대해

: 목록 상자, 데이터 형식 : 내 JSP 페이지에서 내가 좋아하는 자바 스크립트 AJAX를 사용하여 URL에서 두 개의 매개 변수를 전달하고 문자열을 동적 값을 선택하고 "Allow Multiple Values"체크 박스를 체크합니다.

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

을 내 ReportRenderer.java에서 JavaEE 어플 관점이 전환 후, 나는 여러 값이과 관련된 얻을 코드 다음 한 다음 그런 다음 필터 탭에서 테이블의 속성 편집기에서 나는 표현을 준 나는 모든 매개 변수를 얻고있다 및 그것의는 HashMap에서

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; 
} 

: "금속"매개 변수 (URL에서 전달되는), I는 쉼표로 그 값을 합병 한 (,)와 같은 하나의 문자열 변수에 목록을 구분 각각의 값은 성공적으로지도를 설정했습니다.

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의 개체입니다. 이제 웹 응용 프로그램을 실행할 때 "Reports"라는 하이퍼 링크를 클릭 한 후 콘솔에서 예외가 발생하고 웹 페이지에는 출력이 표시되지 않습니다.

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 데이터 소스와 관련되어 있으며 많은 도움이되지 않는 많은 블로그를 이미 보았습니다.

답변

0

listbox 매개 변수가 "Allow multiple values"로 선언되면 BIRT 엔진은 값 배열을 기대하지만 귀하의 경우 String을 보냅니다. 따라서 다중 값 매개 변수를 감지 할 때 쉼표로 구분 된 String을 작성하는 대신 값의 Java 배열을 작성하고이 배열을 매개 변수 맵에 전달해야합니다. 이렇게하면 효과가 있습니다.

이 배열의 요소는 BIRT에 의해 예상되는 데이터 유형을 가져야합니다. "Metal"매개 변수가 보고서 디자인에서 "문자열"유형으로 설정된 경우 "값"배열을 그대로 사용할 수 있습니다. getParameter 함수를 사용하십시오. 그렇지 않으면 새로운 배열을 작성해야합니다.

관련 문제