Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > формирование отчета ireport


Автор: izver84 24.2.2009, 16:40
Есть отчет созданный ireport которой отображает документы. 
В проге есть 2 компанента  JTextField и одна кнопка. Если нажать на кнопку, формируется отчет (запрос
Код

<queryString><![CDATA[SELECT
     jrbp."datbp" AS datbp,
     jrbp."kvod" AS kvod,
     jrbp."nd" AS nd,
     jrbp."pr_annul" AS pr_annul,
     jrbp."sumo" AS sumo,
     jrbp."sumv" AS sumv,
     jrbp."sumd" AS sumd,
     s101."adpot" AS adpot,
     s101."npot" AS snpot,
     s215."fk" AS fk,
     vodil."kvod" AS vkvod,
     vodil."nvod" AS nvod,
     jrbp."kpot" AS jkpot,
     s101."kpot" AS kpot,
     s101."kpl" AS skpl,
     s215."kpl" AS kpl
FROM
     "public"."s101" s101 INNER JOIN "public"."jrbp" jrbp ON s101."kpot" = jrbp."kpot"
     INNER JOIN "public"."vodil" vodil ON jrbp."kvod" = vodil."kvod"
     INNER JOIN "public"."s215" s215 ON s101."kpl" = s215."kpl"  where  jrbp."pr_annul"=0]]></queryString>
 )



класс connection
Код

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;


public class DBConnector {
    public Connection connection; 
    public static Connection getConnection() {
        // TODO Автоматически созданная заглушка метода
        //return null;
        Connection connection = null;

        if (connection != null) {
        return connection;
        }
        Driver d;
        try{
        //    Class.forName(”org.gjt.mm.mysql.Driver”).newInstance()
            d = (Driver)Class.forName("org.postgresql.Driver").newInstance();
        }
        catch (Exception e) {
            System.out.println("Error 1");
            System.out.println(e.getStackTrace());
        }
        try{
            connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/bon", "postgres", "syrus");
        
        }
        catch(SQLException e)
        {
            System.out.println(e.getMessage());
        }
        return connection;
    }
    

    
//------------------------------------------------------
}




База постгрес.

Собственно вопрос:
Как сделать  такую штуку?

Пользователь водит в текстфилды диапазон документов.   Нажимает на кнопку и формируется отчет только для этого диапозона.
Отчет отображается в JRViewer

Код

private JRViewer getJRViewer() {
        if (JRViewer == null) {
            try {
            JRViewer = new JRViewer("bon1.jrprint",false);
            } catch (JRException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            JRViewer.setName("JRViewer");
            
        }
        return JRViewer;


Заранее спасибо.

Автор: jeank 24.2.2009, 18:27
Нда, моло того, что Вам лень мозгами пораскинуть, как подправить запрос, так еще толком объяснить не смогли. В частности, "диапазон документов" - это че вообще? Правильнее сказать подмножество документов по какому то критерию  - про критерий ничего не сказано, ну да фиг с ним. Собственно, надо добавить дополнительный INNER JOIN, если придерживаться данного синтаксиса, хотя все внутренние объединения множеств в читабельном sql описываются ключевым словом WHERE  и далее пошли приравнивания. Может, конечно, я не въехал в поставленную проблему...

Автор: izver84 25.2.2009, 10:28
Исправляюсь.
В ireport создал отчет. Данные в поля берутся из базы. По умолчанию работает этот селект(прописан в отчете)
 
Код

<queryString><![CDATA[SELECT
     jrbp."datbp" AS datbp,
     jrbp."kvod" AS kvod,
     jrbp."nd" AS nd,
     jrbp."pr_annul" AS pr_annul,
     jrbp."sumo" AS sumo,
     jrbp."sumv" AS sumv,
     jrbp."sumd" AS sumd,
     s101."adpot" AS adpot,
     s101."npot" AS snpot,
     s215."fk" AS fk,
     vodil."kvod" AS vkvod,
     vodil."nvod" AS nvod,
     jrbp."kpot" AS jkpot,
     s101."kpot" AS kpot,
     s101."kpl" AS skpl,
     s215."kpl" AS kpl
FROM
     "public"."s101" s101 INNER JOIN "public"."jrbp" jrbp ON s101."kpot" = jrbp."kpot"
     INNER JOIN "public"."vodil" vodil ON jrbp."kvod" = vodil."kvod"
     INNER JOIN "public"."s215" s215 ON s101."kpl" = s215."kpl"  where  jrbp."pr_annul"=0]]></queryString>


Запускаю в ireport отчет через JRViewer. Сохраняю как *.jrprint. Копирую  созданный файл в папку с проектом. 
В проекте есть прога - JFrame. На нём находиться JSplitPane
Код

    jSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
 

Слева находиться 2 компонента  JTextField и одна кнопка, справа JRViewer (отображающий*.jrprint). 

Вопрос следующий:

Пользователь водит в текстфилды приделы возможных значий поля jrbp.nbp. 
Запрос имеет вид.
Код

SELECT
     jrbp."datbp" AS datbp,
     jrbp."kvod" AS kvod,
     jrbp."nd" AS nd,
     jrbp."pr_annul" AS pr_annul,
     jrbp."sumo" AS sumo,
     jrbp."sumv" AS sumv,
     jrbp."sumd" AS sumd,
     s101."adpot" AS adpot,
     s101."npot" AS snpot,
     s215."fk" AS fk,
     vodil."kvod" AS vkvod,
     vodil."nvod" AS nvod,
     jrbp."kpot" AS jkpot,
     s101."kpot" AS kpot,
     s101."kpl" AS skpl,
     s215."kpl" AS kpl
FROM
     "public"."s101" s101 INNER JOIN "public"."jrbp" jrbp ON s101."kpot" = jrbp."kpot"
     INNER JOIN "public"."vodil" vodil ON jrbp."kvod" = vodil."kvod"
     INNER JOIN "public"."s215" s215 ON s101."kpl" = s215."kpl"  where  jrbp."pr_annul"=0 and between(jrbp.nbp,"значение 1 текстфилда","значение 2 текстфилда")


Генерируется отчет используя новый запрос. JRViewer отображает уже измененный отчет.

Как связать новый запрос с отчетом?

Автор: jeank 26.2.2009, 10:31
Ну вопрос, как я понял - как передать параметры из формы, в которую лупит пользователь в запрос, который в отчете.

Код

HashMap parameterMap = new HashMap();
    parameterMap.put("DT1", dt1);
    parameterMap.put("DT2", dt2);
    parameterMap.put("SB", simb);
                 
     JasperReport jasperReport = JasperCompileManager.compileReport("reports/kss1.jrxml");
     JasperPrint jasperPrintData = JasperFillManager.fillReport(jasperReport, parameterMap, db.getConnection());


Собственно, нужна последняя строчка, где помимо соединения можно передать параметры в виде HashMap, далее эти параметры можно использовать в отчете наполную.

Автор: skif18 21.4.2009, 11:19
jeank, на функцию compileReport  дает ошибку 

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester
    at net.sf.jasperreports.engine.JasperCompileManager.compileReport(JasperCompileManager.java:150)

Автор: izver84 4.5.2009, 09:54
решил

код работы с репортом
Код

    HashMap parameters = new HashMap();
                    int valfnum = Integer.parseInt(jTextField.getText());

                    parameters.put("fnum",valfnum);
                    int valfnut = Integer.parseInt(jTextField1.getText());
                    parameters.put("fcon",valfnut);
                    
                    try {
                        JasperDesign jasperDesign = JRXmlLoader.load("bon1.jrxml");
                        JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

                      Connection conn = DBConnector.getConnection(); 

                         
                       JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,parameters, conn);


                       JasperViewer.viewReport(jasperPrint,false);
                } catch (JRException ejr) {
  
                        ejr.printStackTrace();

                }
                    
                    


где valfnum и valfnut - значения jTextField.

Автор: Viktorr 12.5.2009, 12:55
С тем, как отправить параметры в JasperReport  все ясно, хотелось бы еще узнать как их принять.
А именно интересует отрывок xml файла, где описывается как эти valfnum и valfnut показать пользователю в отчете.
Заранее спасибо.

Автор: izver84 12.5.2009, 14:44
Код

<parameter name="fnum" isForPrompting="true" class="java.lang.Integer"/>
<parameter name="fcon" isForPrompting="true" class="java.lang.Integer"/>
<queryString><![CDATA[SELECT
 *
FROM
    table
WHERE
  column1>= $P{fnum}
 AND column2<= $P{fcon}]]></queryString>



где $P{fnum}=valfnum и $P{fcon}=valfnut
 

Автор: Viktorr 12.5.2009, 15:16
Огромное спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)