2012-08-14 2 views
14

ich meinen subreport einen Datasource mit Hilfe von List<String> Parametern des Master-Berichts übergeben müssen. Ich weiß nicht, was ist ein Typ von dataSource ist richtig und wie man Wert in Unterbericht erhalten.Vorbei an die Liste der Urtyp-Objekte als Datenquelle für subreport

Der Ausschnitt aus meinem Master-Report:

<parameter name="seznamPriloh" class="java.util.List" isForPrompting="false"/> 
.... 
<subreport> 
    <reportElement x="0" y="56" width="555" height="76"/> 
    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression> 
      <subreportExpression><![CDATA[cz.alis.keong.jasjdr.reporting.ReportCompiler.compile("R79_SeznamPriloh")]]></subreportExpression> 
</subreport> 

Der Ausschnitt aus meinem subreport:

<detail> 
    <band height="23"> 
     <textField> 
      <reportElement x="56" y="3" width="100" height="20"/> 
      <textElement/> 
      <textFieldExpression><![CDATA[$F{}]]></textFieldExpression> 
     </textField> 
    </band> 
</detail> 

mir bitte mitteilen, wie die Datenquelle zu übergeben über Master Bericht der Parameter von java.util.List<String> auf Unterbericht Art.

Edit: 08.14 14.20 Tags hinzufügen zu Java

Edit: 08.14 15.30 bezieht sich mit How do I print a list of strings contained within another list in iReport? und arbeitet für 4.5.0 Und List<String>

+0

Ok, müssen Sie sagen, welche Fehler Sie bekommen oder etwas ähnliches. Vielleicht können Sie auch Ihren StackTrace einbeziehen. –

+0

@Vyccus Ich brauche Hilfe mit Basic. Ich gebe Fehler das heißt dann muss ich Feld angeben aber ich weiß jetzt nicht welches. Wenn ich "Wert" versuche, ist es traurig, dass für den Bean-Wert kein Feldwert ist. – Perlos

Antwort

20

Sie haben was zu spezifizieren Feld, das Sie in Ihrem Unterbericht verwenden. Sie übergeben $ F {} und da Sie eine List<String> als DataSource übergeben, sollten Sie setzen $ F {_THIS}. Natürlich muss man mit diesem Namen auch ein Feld hinzufügen, nur tun, dass Sie den Ausdruck $ F verwenden können {} somefield

+1

Ich versuche es und es gibt mir einen weiteren Fehler. Der Name-Fehler der Felder wurde jetzt nicht angezeigt, aber es wurde abgerufen: net.sf.jasperreports.engine.JRRuntimeException: Der Unterbericht ist auf einem Band übergelaufen, das keinen Überlauf unterstützt. – Perlos

+0

Dies bedeutet, dass Ihr Unterbericht sich ausdehnt und nicht in den Bereich passt, in den Sie ihn eingefügt haben. Aber scheint das Feld funktioniert zu haben. Überprüfen Sie dies und sagen Sie mir, was passiert: http://stackoverflow.com/questions/10172074/sub-report-doesnt-display-when-overflow –

+1

Ich war dumm, nicht erkennen, was dieser Fehler bedeutet, es war nur schlechte Einstellung der Unterbericht-Komponente (Unterbericht-Detail war größer als eine Komponente für sie). Also definierende Feld _THIS arbeitet für 4.5.0 – Perlos

5

können Sie diese Datenquelle Ausdruck für das Bestehen java.util.List (über den Parameter verwenden zu Unterbericht):

<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{seznamPriloh})]]></dataSourceExpression> 

Die Arbeitsprobe, Master-Report:

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport ...> 
    <parameter name="listParam" class="java.util.List"/> 
    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false"> 
     <defaultValueExpression><![CDATA["<subreport_dir>"]]></defaultValueExpression> 
    </parameter> 
    <queryString> 
     <![CDATA[SELECT id, street, city FROM address]]> 
    </queryString> 
    <field name="ID" class="java.lang.Integer"/> 
    <field name="STREET" class="java.lang.String"/> 
    <field name="CITY" class="java.lang.String"/> 
    <detail> 
     <band height="57" splitType="Stretch"> 
      <frame> 
       <reportElement x="0" y="0" width="539" height="57"/> 
       <box> 
        <topPen lineWidth="1.0"/> 
        <leftPen lineWidth="1.0"/> 
        <bottomPen lineWidth="1.0"/> 
        <rightPen lineWidth="1.0"/> 
       </box> 
       <subreport> 
        <reportElement x="0" y="32" width="523" height="17"/> 
        <subreportParameter name="cityParam"> 
         <subreportParameterExpression><![CDATA[$F{CITY}]]></subreportParameterExpression> 
        </subreportParameter> 
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{listParam})]]></dataSourceExpression> 
        <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport_list_as_param.jasper"]]></subreportExpression> 
       </subreport> 
       <textField> 
        <reportElement x="300" y="0" width="208" height="20"/> 
        <box leftPadding="10"/> 
        <textElement> 
         <font isBold="true"/> 
        </textElement> 
        <textFieldExpression><![CDATA["City: " + $F{CITY}]]></textFieldExpression> 
       </textField> 
       <textField> 
        <reportElement x="100" y="0" width="200" height="20"/> 
        <box leftPadding="10"/> 
        <textElement> 
         <font isBold="true"/> 
        </textElement> 
        <textFieldExpression><![CDATA["Street: " + $F{STREET}]]></textFieldExpression> 
       </textField> 
       <textField> 
        <reportElement x="0" y="0" width="100" height="20"/> 
        <box leftPadding="10"/> 
        <textElement> 
         <font isBold="true"/> 
        </textElement> 
        <textFieldExpression><![CDATA["Id: " + $F{ID}]]></textFieldExpression> 
       </textField> 
      </frame> 
     </band> 
    </detail> 
</jasperReport> 

Th e subreport:

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport ...> 
    <parameter name="cityParam" class="java.lang.String"/> 
    <field name="id" class="java.lang.Integer"/> 
    <field name="station" class="java.lang.String"/> 
    <field name="city" class="java.lang.String"/> 
    <filterExpression><![CDATA[$F{city}.equals($P{cityParam})]]></filterExpression> 
    <title> 
     <band height="39"> 
      <textField> 
       <reportElement x="220" y="14" width="161" height="20"/> 
       <box leftPadding="10"/> 
       <textElement> 
        <font isBold="true" isItalic="true"/> 
       </textElement> 
       <textFieldExpression><![CDATA["City param: " + $P{cityParam}]]></textFieldExpression> 
      </textField> 
     </band> 
    </title> 
    <detail> 
     <band height="20" splitType="Stretch"> 
      <textField> 
       <reportElement x="0" y="0" width="100" height="20"/> 
       <box leftPadding="10"/> 
       <textElement/> 
       <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression> 
      </textField> 
      <textField> 
       <reportElement x="100" y="0" width="100" height="20"/> 
       <box leftPadding="10"/> 
       <textElement/> 
       <textFieldExpression><![CDATA[$F{station}]]></textFieldExpression> 
      </textField> 
     </band> 
    </detail> 
    <noData> 
     <band height="50"> 
      <textField> 
       <reportElement x="220" y="17" width="161" height="20"/> 
       <box leftPadding="10"/> 
       <textElement> 
        <font isBold="true" isItalic="true"/> 
       </textElement> 
       <textFieldExpression><![CDATA["No data for city param: " + $P{cityParam}]]></textFieldExpression> 
      </textField> 
     </band> 
    </noData> 
</jasperReport> 

Der Java-Code für das BestehenListe:

Map<String, Object> params = new HashMap<String, Object>(); 

List<TestBean> beansList = new ArrayList<TestBean>(); 

// The TestBean class constructor is: 
//public TestBean(String city, Integer id, String station) 
TestBean bean = new TestBean("Dallas", 10, "Central park st."); 
beansList.add(bean); 

bean = new TestBean("Dallas", 11, "Railway st."); 
beansList.add(bean); 

bean = new TestBean("Dallas", 12, "Market st."); 
beansList.add(bean); 

bean = new TestBean("Lyon", 20, "Airport st."); 
beansList.add(bean); 

params.put("listParam", beansList); 

JasperReport jasperReport = JasperCompileManager.compileReport(reportSource); 
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDemoHsqldbConnection()); 

JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName); 

Das Ergebnis wird sein (die erzeugten PDF-Datei Ansicht):

Generated result in PDF format


Sie können an den Implementierungen von aussehen net.sf.jasperreports.engine.JRDataSource. Die am besten geeignete für Ihren Fall ist: JRBeanCollectionDataSource und JRBeanArrayDataSource. Wie Sie sehen können, sind sie beide Bean-basiert.

Ich glaube, Sie einfach Ihre List<String> zum List<StringBean> umwandeln kann.

Oder Sie können Ihre eigenen JRDataSource implementieren.

+0

Ich bin mot sicher, wenn ich richtig verstehe, aber scheint mir Sie pust Liste von Object (Bohnen mit definierten Eigenschaften) als dataSource und setzen Sie List als Parameter. Ich möchte von Master-Bericht nehmen Sie Parameter (Liste ) und legen Sie sie als sub-Bericht als dataSource – Perlos

+0

@Perlos Ich habe nur meinen Beitrag aktualisieren - Kommentar über net.sf.jasperreports.engine.JRDataSource Implementierung –

+0

Ich sah es richtig und ist was ich meine. Sie geben die Unterliste der Objekte mit Ihren eigenen Eigenschaften an. Ich habe das auch und arbeite für mich. Aber wissen wollen, wie List der primitiven Typen Objekte (wie Integer, String oder BigDecimal) als dataSource für Unterbericht setzen. Im Unterbericht möchte ich TextField mit einem Wert auf dieser Liste detailieren (etwas wie F $ {Wert}).Ich weiß, wenn ich wirklich will, kann ich Klassenobjekt in Java erstellen und es auf parametr Karte setzen, aber wie wissen, gibt es einen Weg nur mit Berichtsdesigner – Perlos

5

Ja, es funktioniert. Es ist nicht vollständig dokumentiert, aber es funktioniert mit jasperreport 4.5.1.

Sie müssen ein Feld in Ihrem Unterbericht namens "_THIS" deklarieren, mit Ihrem primitiven Typ, den Sie anzeigen möchten. In diesem Fall eine Zeichenfolge.

SubReport

<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="testSubReport" pageWidth="555" pageHeight="802" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" isSummaryWithPageHeaderAndFooter="true" whenResourceMissingType="Empty"> 

    <queryString> 
     <![CDATA[]]> 
    </queryString> 
    <field name="_THIS" class="java.lang.String"/> 
    <pageHeader> 
    ... 

Dann in diesem subreport, wo Sie den String-Wert angezeigt werden soll, nur $ F verwenden {_Diese}.

<detail> 
    <band height="25"> 
     <textField isStretchWithOverflow="true"> 
      <reportElement x="37" y="5" width="503" height="15"> 
      </reportElement> 
      <textFieldExpression><![CDATA[$F{_THIS}]]></textFieldExpression> 
     </textField> 
    </band> 
</detail> 

Hauptbericht

Der übergeordnete Bericht stellen die Liste als die datasourceExpression

<subreport> 
    <reportElement positionType="Float" x="0" y="4" width="554" height="1"/> 
    <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{bean}.getListeOfStringsMethode())]]></dataSourceExpression> 
    <subreportExpression><![CDATA[$P{subreportPrimitiveTypeList}]]></subreportExpression> 
</subreport> 

ich Inspiration nahm here

Verwandte Themen