2016-08-17 2 views
4

je charge rapport principal et sous rapport * .jrxml et styliser conditionnel au rapport principal et sous rapport. Dans le rapport principal, le style conditionnel fonctionne, mais pas dans le sous-rapport.Pourquoi le style conditionnel ne fonctionne-t-il pas dans les sous-rapports lors de l'ajout à partir de Java?

code

public static JasperDesign getJasperDesign(InputStream isReport) throws JRException { 
    JasperDesign jasperDesign = JRXmlLoader.load(isReport); 

    // rootStyle 
    JRDesignStyle jrDesignRootStyle = (JRDesignStyle) dynamicReportToJasperReportConverter.convertStyle(Template.rootStyle.getStyle()); 
    jrDesignRootStyle.setName("rootStyle"); 
    jasperDesign.addStyle(jrDesignRootStyle); 

    //creatConditional Style 
    JRDesignStyle jrDesignStyle = (JRDesignStyle) dynamicReportToJasperReportConverter.convertStyle(Template.columnStyle.getStyle()); 
    jrDesignStyle.setName("columnStyle"); 
    jrDesignStyle.setParentStyle(jrDesignRootStyle); 
    JRDesignConditionalStyle jrDesignConditionalStyle = new JRDesignConditionalStyle(); 
    JRDesignExpression conditionExpression = new JRDesignExpression(); 
    conditionExpression.setValueClassName(String.valueOf(Boolean.class)); 
    conditionExpression.setText("$V{REPORT_COUNT}%2 == 1"); 
    jrDesignConditionalStyle.setConditionExpression(conditionExpression); 
    jrDesignConditionalStyle.setBackcolor(Template.valueColor2); 
    jrDesignStyle.addConditionalStyle(jrDesignConditionalStyle); 
    jasperDesign.addStyle(jrDesignStyle); 
    return jasperDesign; 
} 

Dans l'image que vous voyez résultat et la valeur de REPORT_COUNT:

Result main report and sub report

Java Code où générer le rapport.

JasperReport jasperSubReportIC = TemplateConfigurator.buildSubReport(isSubReportIC, subQueryTO); 
     return Template.getReport(reportParameters.getOutputType(),sheetNameInExcel) 
       .setTemplate(Template.reportTemplate) 
       .title(Template.createTitleHeader(reportName, dateText, bundle, reportContext, reportParameters)) 
       .lastPageFooter(Template.createFooter(dateText, bundle)) 
       .setParameter("subreportParameterTO", jasperSubReportTO) 
       .setParameter("subreportParameterIC", jasperSubReportIC) 
       .setParameter("subQueryTO", subQueryTO) 
       .setParameter("subQueryIC", subQueryIC) 
       .setParameter("CONTEXT", super.reportContext) 
       .setLocale(locale) 
       .setResourceBundle(bundle) 
       .setTemplateDesign(TemplateConfigurator.getJasperDesign(is)) 
       .setDataSource(query, DatabaseConnection.getConnection()) 
       .show() 
       .toJasperPrint(); 

JRXML Code où sous rapport mis en œuvre.

<subreport> 
      <reportElement x="0" y="0" width="802" height="49" uuid="50369a11-d831-4c54-b16f-95fbed8b5bba"/> 
      <subreportParameter name="REPORT_LOCALE"> 
       <subreportParameterExpression><![CDATA[$P{REPORT_LOCALE}]]></subreportParameterExpression> 
      </subreportParameter> 
      <subreportParameter name="TO_ID"> 
       <subreportParameterExpression><![CDATA[$F{TO_ID}]]></subreportParameterExpression> 
      </subreportParameter> 
      <subreportParameter name="REPORT_RESOURCE_BUNDLE"> 
       <subreportParameterExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}]]></subreportParameterExpression> 
      </subreportParameter> 
      <dataSourceExpression><![CDATA[$P{dataScriplet_SCRIPTLET}.createDataSourceTO($P{REPORT_CONNECTION},$P{subQueryTO},$F{TO_ID})]]></dataSourceExpression> 
      <subreportExpression><![CDATA[$P{subreportParameterTO}]]></subreportExpression> 
     </subreport> 
+0

Avez-vous appliqué 'getJasperDesign' sur les deux rapports? –

Répondre

3

Vous devez exécuter cette méthode à la fois sur la conception principale et sous-état, les styles sont pas passé automatiquement à sous-état.

Vous pouvez également ne pas accéder à la conception de sous-état de la principale conception du rapport voir How to get subreport name from JasperReport object (.jasper compiled file) via API?

La façon la plus simple est sans doute d'inclure une autre méthode statique dans votre classe YourClass

public static JasperReport getSubreport(String fileName) throws JRException, FileNotFoundException{ 
    JasperDesign jd = getJasperDesign(new FileInputStream(fileName)); 
    return JasperCompileManager.compileReport(jd); 
} 

et dans votre principal appel de rapport le sous-rapport avec cette expression

<subreportExpression class="net.sf.jasperreports.engine.JasperReport"> 
    <![CDATA[my.package.YourClass.getSubreport("..pathToSubReport..")]]> 
</subreportExpression> 

Le sous-état est chargé dans JasperDesign, vous appliquez vos styles, puis le compiler à JasperReport et le retourner comme un sous-état .

+0

Eh bien, j'ai déjà essayé, la seule différence est que j'ajoute sous-rapport en tant que paramètre, pas comme résultat de la méthode. Et cela ne fonctionne pas pour mes styles conditionnels – quento

+0

@quento, fondamentalement, vous devez laisser la conception de sous-état passent par la même méthode que le rapport principal, si vous ajoutez en tant que paramètre subreports, ajoutez comme objet JasperReport ou » ..pathToSubReport .. " –

+0

Je fais tout comme ça, en appelant les mêmes méthodes pour les sous-rapports et le rapport principal. J'obtiens même les mêmes polices, mais rien de conditionnel n'apparaît dans le sous-rapport. – quento