Добавление пользовательского источника данных в Jaspersoft Studio

Я пытаюсь заполнить таблицу, передав ей пользовательский источник данных. Я создал простой отчет с таблицей на нем. Отчет сам получает данные из базы данных ms sql. Я написал класс java, подобный классу в этом пример. Но я не получаю никакой ценности в таблице. На примере скриптлета нет. Я проверил (String) this.getFieldValue("KN_FormelGG"); строка кода. Он получает данные из поля и может отображать их в отчете. Поэтому я думаю, что источник данных bean не заполнен. Я называю наполнение Способ таблицы afterGroupInit. Как я могу использовать сбор данных из java в jasper? Я также попытался добавить 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 class 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>

1 ответов


Адаптер Данных

создайте файл адаптера данных, например 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"/>

установить Поля Отчета

теперь поля отчета должны иметь возможность ссылаться на свойства компонента:

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

важно fieldDescription элемент содержит значение, которое отражает свойство bean (т. е. код Java, который вы обычно вызываете, чтобы получить значение из bean на экземпляре этого bean).

приложение

на JRDataSourceFactory класс стоит отдельно -- он используется адаптером данных для создания коллекции экземпляров bean. Этот static метод (createCollection) не работают здесь и не могут использовать наследование.

пример

если это возможно, брать имена полей для отчета из атрибутов компонента. Код, написанный в вопросе, затрудняет распознавание, где значение для 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>

Класса

класс данных создает экземпляры компонента:

package com.compay.jasper;

import com.company.domain.Student;

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

Поля Отчета

поля отчета отражают бобовые поля:

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

в отчет передается коллекция экземпляров "student". В этом примере коллекция содержит один экземпляр. В вашем примере, коллекция может содержать много экземпляров. По мере итерации библиотеки отчетов по коллекции различные значения firstName и lastName будут доступны.

механика как Student данные экземпляра, первоначально заполненные, выходят за рамки этого ответа. Что касается инструмента отчетности, он просто использует предварительно заполненные экземпляры Student. Если FillTable заполняет TableCells, это не относится к инструменту отчетности.