10

カスタム データ ソースをテーブルに渡してテーブルを埋めようとしています。テーブルを含む簡単なレポートを作成しました。レポート自体は、ms sql データベースからデータを取得します。この例のクラスに似た Java クラスを作成しました。しかし、テーブルに値がありません。この例では、スクリプトレットはありません。(String) this.getFieldValue("KN_FormelGG"); コード行を確認しました。フィールドからデータを取得し、レポートに表示できます。したがって、Bean データ ソースが満たされていないと思います。で fill Table メソッドを呼び出しますafterGroupInit。ジャスパーでJavaからのデータの収集を使用するにはどうすればよいですか? データセットとクエリ ダイアログに Java Bean も追加しようとしましたが、どちらも役に立ちませんでした。スクリプトレットをサブレポート/テーブルに追加する必要がありますか? スクリプトレットにカスタム データ ソースがあるという私の問題の主な強調点。私は行きました他の問題は解決しましたが、まだ答えが得られません。データを確認するために追加しまし$P{FieldDataSource}.getData()たが、null が返されます。

Java クラス 1:

package testProjektIman.scriptlets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class FillTable extends JRDefaultScriptlet {

    @Override
public void afterGroupInit(final String id)
        throws JRScriptletException {
    fillTable();
}
public ArrayList<String> splitGGArray(final String kNFormelGG) {
    ArrayList<String> fieldNames = new ArrayList<>();
    String[] array = (kNFormelGG.split(" "));
    for (String sub : array) {
        fieldNames.add(sub);
    }
    return fieldNames;
}

public Map<String, Object> fillTable()
        throws JRScriptletException {
    String kNFormelGG = null;
    kNFormelGG = (String) this.getFieldValue("KN_FormelGG");
    List<TableCells> listTableCells = new ArrayList<>();
    TableCells tableCell;
    for (String fn : splitGGArray(kNFormelGG)) {
        tableCell = new TableCells();
        tableCell.setFieldName(fn);
        listTableCells.add(tableCell);
    }
    JRBeanCollectionDataSource tableCellJRBean = new JRBeanCollectionDataSource(listTableCells);
    Map<String, Object> parameters = new HashMap<>();
    parameters.put("FieldDataSource", tableCellJRBean);
    return parameters;
}

}

Java クラス 2

package testProjektIman.scriptlets;
public class TableCells {
private String fieldName;
private String keyFormel;
private String mK;
private String notation;
private String Item;
//getters setters
}

jrxml

<?xml version="1.0" encoding="UTF-8"?>
<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="tableAutoFill" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="37fc3a9c-38e9-41be-9039-56249c5283d7">
    <subDataset name="TableDataSource" uuid="5999e646-aeec-4b2b-b29b-68e897d56999">
        <queryString>
            <![CDATA[]]>
        </queryString>
        <field name="fieldName" class="java.lang.String"/>
    </subDataset>
    <scriptlet name="Filltable" class="testProjektIman.scriptlets.FillTable"/>
    <parameter name="FieldDataSource" class="net.sf.jasperreports.engine.data.JRBeanCollectionDataSource" isForPrompting="false"/>
    <queryString>
        <![CDATA[select * from "KennzahlReferenz2015_QIBericht",  "Images" 
where LB_ID =  62
and KN_OffiziellGruppe =  3
and  IMG_ID = 1]]>
    </queryString>
    <field name="KN_Id" class="java.lang.Integer"/>
    <field name="KN_FormelZ" class="java.lang.String"/>
    <field name="KN_FormelGG" class="java.lang.String"/>
    <group name="id">
        <groupExpression><![CDATA[$F{KN_Id}]]></groupExpression>
        <groupHeader>
            <band height="50"/>
        </groupHeader>
        <groupFooter>
            <band height="50"/>
        </groupFooter>
    </group>
    <detail>
        <band height="191" splitType="Stretch">
            <componentElement>
                <reportElement x="50" y="18" width="260" height="120" uuid="942ab836-df83-4a2f-8215-845073ad163f">
                    <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
                    <property name="com.jaspersoft.studio.table.style.table_header" value="Table_TH"/>
                    <property name="com.jaspersoft.studio.table.style.column_header" value="Table_CH"/>
                    <property name="com.jaspersoft.studio.table.style.detail" value="Table_TD"/>
                </reportElement>
                <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" whenNoDataType="AllSectionsNoDetail">
                    <datasetRun subDataset="TableDataSource" uuid="b554ada5-c388-4534-af8e-93571a417adb">
                        <parametersMapExpression><![CDATA[$P{FieldDataSource}]]></parametersMapExpression>
                        <dataSourceExpression><![CDATA[$P{FieldDataSource}]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="100" uuid="f57e4e8e-8a2e-405f-b9ab-7a704e0986fd">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:columnHeader style="Table_CH" height="30">
                            <staticText>
                                <reportElement x="0" y="0" width="100" height="30" uuid="9a55dd73-71e3-4559-9a8b-17d98bf17753"/>
                                <textElement>
                                    <font isBold="true"/>
                                </textElement>
                                <text><![CDATA[FieldName]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell style="Table_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="100" height="30" uuid="c3e6ccfc-9f91-4d7a-800a-613f5dded928"/>
                                <textFieldExpression><![CDATA[$F{fieldName}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </detail>
</jasperReport>
4

1 に答える 1

7

データ アダプタ

たとえばadapter.xml、ユーザー インターフェイスを使用して、データ アダプタ ファイルを作成します。内容は次のようになります。

<?xml version="1.0" encoding="UTF-8" ?>
<beanDataAdapter class="net.sf.jasperreports.data.bean.BeanDataAdapterImpl">
    <name>YourClass</name>
    <factoryClass>com.yourcompany.jasper.JRDataSourceFactory</factoryClass>
    <methodName>createCollection</methodName>
    <useFieldDescription>false</useFieldDescription>
</beanDataAdapter>

データクラス

createCollection上記のデータ アダプターの定義に従って、メソッドを持つクラスを作成します。

package com.compay.jasper;

public class JRDataSourceFactory {
    /**
     * @return A collection of data for the report.
     */
    public static Collection<YourClass> createCollection() {
        return Arrays.asList( new YourClass() );
    }
}

レポート プロパティの設定

レポートに次のプロパティがあることを確認します (レポートをカスタム データ アダプターにリンクします)。

<property name="com.jaspersoft.studio.data.defaultdataadapter" value="adapter.xml"/>

レポート フィールドの設定

レポート フィールドは、Bean プロパティを参照できるようになります。

<field name="yourObject.property" class="java.lang.String">
    <fieldDescription><![CDATA[yourObject.property]]></fieldDescription>
</field>

Bean プロパティを反映する値が要素に含まれていることが重要ですfieldDescription(つまり、その Bean のインスタンスで Bean から値を取得するために通常呼び出す Java コード)。

応用

このJRDataSourceFactoryクラスは独立しており、Bean インスタンスのコレクションを作成するためにデータ アダプタによって使用されます。staticメソッド ( ) はここcreateCollectionで作業を行いますが、継承を使用することはできません。

可能であれば、レポートのフィールド名を Bean の属性から借用します。質問に書かれているコードでは、の値がどこから来たのかを識別するのが難しくなっていますKN_Id

次の例では、データ アダプターをレポートのフィールド名にリンクします。

ビーンクラス

Bean はいくつかのプロパティを公開します。

package com.company.domain;

public final class Student extends Entity {
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public String getLastName() {
        return this.lastName;
    }
}

データ アダプタ

データ アダプタは次のようになります。

<?xml version="1.0" encoding="UTF-8" ?>
<beanDataAdapter class="net.sf.jasperreports.data.bean.BeanDataAdapterImpl">
    <name>Student</name>
    <factoryClass>com.company.jasper.JRDataSourceFactory</factoryClass>
    <methodName>createCollection</methodName>
    <useFieldDescription>false</useFieldDescription>
</beanDataAdapter>

データクラス

データ クラスは、Bean のインスタンスを作成します。

package com.compay.jasper;

import com.company.domain.Student;

public class JRDataSourceFactory {
    public static Collection<Student> createCollection() {
        return Arrays.asList( new Student() );
    }
}

レポート フィールド

レポート フィールドは Bean フィールドを反映します。

<field name="firstName" class="java.lang.String">
    <fieldDescription><![CDATA[firstName]]></fieldDescription>
</field>
<field name="lastName" class="java.lang.String">
    <fieldDescription><![CDATA[lastName]]></fieldDescription>
</field>

「学生」インスタンスのコレクションがレポートに渡されます。この例では、コレクションに 1 つのインスタンスが含まれています。あなたの例では、コレクションには多くのインスタンスが含まれる可能性があります。firstNameレポート ライブラリがコレクションを反復処理すると、とのさまざまな値がlastName使用可能になります。

Studentインスタンス データが最初に入力される仕組みは、この回答の範囲外です。レポート ツールに関する限り、あらかじめ設定された のインスタンスを使用するだけですStudentFillTablepopulatesの場合TableCells、それはレポート ツールにとって問題ではありません。

于 2016-07-22T21:35:11.267 に答える