7

私のメイン レポートには 5 つのフィールドがあり、そのうちの 4つはjava.lang.String型で、最後の 1 つはjava.util.List型です。後者をサブレポートのデータ ソースとして使用しました。サブレポートのデータソースを設定しました。

サブレポートのプロパティ:

接続タイプ :データソース式を使用 データ
ソース式: new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{Field5})

Javaアプリケーション内でレポートを入力するため、データの受け渡しは正常に機能しています(推測します) 。フィールド 1 から 4 に渡されたデータを表示できますが、フィールド 5 では、サブレポートにデータが表示されず、列ヘッダーで定義された静的テキストのみが表示されるため、最初は確認できません。

次に、サブレポートのフィールドをPage Footerに配置すると、データが正常に渡されることがわかりました。問題は、詳細バンド自体が表示されていないことです。

表示されないのはなぜですか?

サブレポートのプロパティには、次のものがあります。

データがない場合:全セクション、詳細なし

誰でもこれに光を当てることができます。

4

5 に答える 5

11

私は1日以上同じ問題を抱えていました。私が開発しているアプリケーションには、動作する複数のJasperReportsがあります。新しいものを追加するときにこの問題が発生しました。何を試しても、詳細バンドには何も表示されませんでした。レポートに入力するコントローラーのトリプルチェックから、最新のjasperreportsjarおよび最新iReportsバージョンへのアップグレードまで、すべてを試しました。何も機能していないようでした。

問題は、レポートがデフォルトで:When No Data: All Sections, No Detailに設定されていることです。これは基本的に、レポートにデータが送信されない場合、詳細セクションを除くすべてのセクションが表示されることを意味します。

EXEC [myFunction] $P{parameterId}レポートのテストに使用していた静的テキストに加えて、Java コントローラーからパラメーターを直接渡していましたが、レポートのQuery Textプロパティにを追加するまで機能しませんでした。parameterIdこの関数は、 Java から渡された値をパラメーターとして受け取り、何かを返す単純でわかりやすい関数です。(また、データセット クエリの sqlプロパティの言語を SQL に設定してください)。

要約すると、何らかの理由で、レポートが Java パラメータをデータとして取得していないように見えるため (そのため、Detailを除くすべてのセクションが表示されます)、いくつかのパラメータを返す SQL 関数を明示的に呼び出して、それらを自分の詳細ページ、それは動作します。

これがお役に立てば幸いです。これを理解するために 10 時間頭を悩ませました。

于 2012-10-25T09:18:33.273 に答える
1

このサンプルを試すことができます。

POJO(Bean):

public class BeanWithList {

    private List<String> m_cities;
    private Integer m_id;

    public BeanWithList(List<String> cities, Integer id) {
        m_cities = cities;
        m_id = id;
    }

    public List<String> getCities() {
        return m_cities;
    }

    public Integer getId() {
        return m_id;
    }
}

レポートに記入するコード:

public static void testBuildPdf() {
    try {

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

        params.put("BeanSubreport", JasperCompileManager.compileReport(subreportSource));

        JasperReport jasperReport = JasperCompileManager.compileReport(masterSource);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDataSource());

        JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static JRDataSource getDataSource() {
    Collection<BeanWithList> coll = new ArrayList<BeanWithList>();

    BeanWithList bean = new BeanWithList(Arrays.asList("London", "Paris"), 1);

    coll.add(bean);

    bean = new BeanWithList(Arrays.asList("London", "Madrid", "Moscow"), 2);
    coll.add(bean);

    bean = new BeanWithList(Arrays.asList("Rome"), 3);
    coll.add(bean);

    return new JRBeanCollectionDataSource(coll);
}

サブレポートjrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport .. leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
    <field name="city" class="java.lang.String">
        <fieldDescription><![CDATA[_THIS]]></fieldDescription>
    </field>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement positionType="Float" x="0" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{city}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

マスターjrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
    <parameter name="BeanSubreport" class="net.sf.jasperreports.engine.JasperReport"/>
    <field name="id" class="java.lang.Integer"/>
    <field name="cities" class="java.util.Collection"/>
    <title>
        <band height="103" splitType="Stretch">
            <staticText>
                <reportElement x="138" y="28" width="258" height="20"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true"/>
                </textElement>
                <text><![CDATA[Bean with List sample]]></text>
            </staticText>
        </band>
    </title>
    <columnHeader>
        <band height="20">
            <staticText>
                <reportElement x="0" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[Id]]></text>
            </staticText>
            <staticText>
                <reportElement x="100" y="0" width="100" height="20"/>
                <box>
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font isBold="true" isItalic="true" isUnderline="false"/>
                </textElement>
                <text><![CDATA[City name]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement stretchType="RelativeToTallestObject" x="0" y="0" width="100" height="20"/>
                <box leftPadding="10">
                    <topPen lineWidth="1.0"/>
                    <leftPen lineWidth="1.0"/>
                    <bottomPen lineWidth="1.0"/>
                    <rightPen lineWidth="1.0"/>
                </box>
                <textElement/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>
            <subreport>
                <reportElement positionType="Float" stretchType="RelativeToTallestObject" x="100" y="0" width="100" height="20" isPrintWhenDetailOverflows="true"/>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{cities})]]></dataSourceExpression>
                <subreportExpression><![CDATA[$P{BeanSubreport}]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

結果は次のようになります。

PDF形式のレポート


このサンプルの主なトリックは、_THIS「変数」の使用です。

詳細については、JavaBeanデータソースの記事を参照してください。

于 2012-10-23T11:01:42.260 に答える
0

パラメータを FillManager に渡すときは、null を使用せず、JREmptyDataSource を使用してください。

正しい方法: JasperFillManager.fillReport(this.getReportTemplate(JASPER_REPORT_EXPIRY_LETTER),this.parameters,new JREmptyDataSource());

間違った方法: JasperFillManager.fillReport(this.getReportTemplate(JASPER_REPORT_EXPIRY_LETTER),this.parameters, null);

于 2013-05-21T08:41:08.610 に答える
0
import java.awt.Desktop;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import net.sf.jasperreports.swing.JRViewer;
import net.sf.jasperreports.view.JasperViewer;

public class MyForm extends JFrame {



    public static JasperDesign jasperDesign;
    public static JasperPrint jasperPrint;
    public static JasperReport jasperReport;
    static JRBeanCollectionDataSource jrBeanCollectionDataSource;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                MyForm frame = new MyForm();
                frame.setVisible(true);
            }
        });
    }

    /**
     * Create the frame.
     */
    public MyForm() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 431, 286);
        setTitle("ThaiCreate.Com Java GUI Tutorial");
        getContentPane().setLayout(null);


        // Button Report
        JButton btnOpenReport = new JButton("Open Report");
        btnOpenReport.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                Connection connect = null;

                try {
                    Class.forName("com.mysql.jdbc.Driver");
                    connect =  DriverManager.getConnection("jdbc:mysql://localhost:3306/test" ,"root","");
                    System.out.println("Connected....");
                }
                catch (ClassNotFoundException e1) 
                {e1.printStackTrace();} 
                catch (SQLException e) 
                {e.printStackTrace();}

                // Application path
                FileInputStream report = null;
                try {
                     FileInputStream input = new FileInputStream(new File("C:\\Users\\admin\\Desktop\\report1.jrxml"));
                      try 
                     {

                        jasperDesign = JRXmlLoader.load(input);
                        jasperReport = JasperCompileManager.compileReport(jasperDesign);
                        jasperPrint = JasperFillManager.fillReport(jasperReport, null, connect);
                        JasperExportManager.exportReportToPdfFile(jasperPrint, "E:\\demo.pdf");



//                      Desktop.getDesktop().open(new File("D:/ReceiptReport.pdf"));

                    } catch (JRException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } 



                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

                JFrame frame = new JFrame();
                frame.setTitle("ThaiCreate.Com Customer Report");
                frame.setBounds(100, 100, 800,600);
                frame.getContentPane().add(new JRViewer(jasperPrint));
                frame.setVisible(true);

                try {
                    connect.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        });

        btnOpenReport.setBounds(137, 98, 146, 23);
        getContentPane().add(btnOpenReport);
        setResizable (false);
    }
}
于 2015-02-18T06:45:15.060 に答える
0

実行時にサブレポートパラメーターを設定することで解決しました。

同じ問題が発生した場合は、JasperReport オブジェクト (データ型はnet.sf.jasperreports.engine.JasperReport) を Java 変数に保存し、その変数をレポート内のパラメーターに渡します。このパラメーターは、 Subreport Expressionの値として設定されます。サブレポート パラメータの式クラスは である必要がありますnet.sf.jasperreports.engine.JasperReport

于 2012-10-29T03:36:54.223 に答える