Подтвердить что ты не робот

Передача списка объектов примитивного типа в качестве источника данных для подзаголовка

Мне нужно передать в мой subreport источник данных с помощью основного отчета List<String>. Я не знаю, что такое тип dataSource, и как получить значение в подзаголовке.

Отрывок из моего основного отчета:

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

Отрывок из моего отчета:

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

Пожалуйста, сообщите мне, как передать источник данных для подчинения через параметр основного отчета типа java.util.List<String>.

Редактировать: 08.14 14:20 Добавить теги в Java

Редактировать: 08.14 15:30 относится к Как распечатать список строк, содержащихся в другом списке в iReport? и работает для версии 4.5.0 и List<String>

4b9b3361

Ответ 1

Вы должны указать, какое поле вы используете в своем подотчете. Вы передаете $F{} и, когда вы передаете List<String> в качестве источника данных, вы должны поместить $F{_THIS}. Конечно, вы также должны добавить поле с этим именем, только сделав это, вы можете использовать выражение $F{somefield}.

Ответ 2

Вы можете использовать это выражение источника данных для передачи java.util.List (через параметр) для представления в отчете:

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

Рабочий образец, основной отчет:

<?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>

Подрепорт:

<?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>

Код Java для передачи Список:

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

Результат будет (просмотр сгенерированного PDF файла):

Generated result in PDF format


Вы можете посмотреть на реализации net.sf.jasperreports.engine.JRDataSource. Наиболее подходящими для вашего случая являются: JRBeanCollectionDataSource и JRBeanArrayDataSource. Как вы можете видеть, они оба основаны на Bean.

Я думаю, вы можете легко преобразовать List<String> в List<StringBean>.

Или вы можете реализовать свой собственный JRDataSource.

Ответ 3

Да, это работает. Это полностью не ясно задокументировано, но работает с jasperreport 4.5.1.

Вы должны объявить поле в вашем подотчете с именем "_THIS", введенное с вашим типом примитива, который вы хотите отобразить. В этом случае строка.

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>
  ...

Затем в этом подотчете, где вы хотите отобразить значение String, просто используйте $ F {_THIS}.

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

Основной отчет

Родительский отчет предоставляет список в виде выражения 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>

Я черпал здесь вдохновение