Faire un Tableau recevant des données venant de plusieurs requêtes avec Itext

cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014 - 18 juin 2012 à 14:46
cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014 - 5 juil. 2012 à 11:13
Bonjour à tous
J'ai un véritable soucis avec mon code. Je programme actuellement un rapport d'inventaire avec l'API Itext. Et je voudrais afficher dans un tableau " la liste des produits avec leur quantité et la quantité vendue et approvisionner à une période".
Pour avoir le résultat que je veux voici le code que j'ai produit :

public void imprimeInventaire(String dateDebut, String dateFin){


//Recuperation de l'environnement 
Runtime runtime = Runtime.getRuntime();

//Tableau de parametres : chemin vers l'appli, chemin vers le pdf
String []parametres = {"C:\\Program Files\\Adobe\\Reader 9.0\\Reader\\AcroRd32.exe","rapport/inventaire.pdf"};

// Creation du document à imprimer en lui donnant la taille qu'il faut
//la methode rotate() pour mettre la page en paysage
Document document = new Document(PageSize.A4.rotate());
try{
PdfWriter fichierpdf = PdfWriter.getInstance(document, new FileOutputStream("rapport/inventaire.pdf"));
document.addTitle("Inventaire");
document.addAuthor("Athanase KOUASSI");
document.addSubject("Génération de PDF.");
document.addKeywords("iText, gestion de stock");
document.getPageNumber();
document.open();

//Recupere la date système
Date date = new Date(); 
//formater la date
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd MMMM yyyy 'à' HH:mm:ss");
Paragraph par = new Paragraph("Inventaire réalisé le "+sdf.format(date),FontFactory.getFont(FontFactory.COURIER, 11f,0));
par.setAlignment(Element.ALIGN_RIGHT);
document.add(par);
document.add(new Paragraph(" "));
document.add(new Paragraph("Date debut : "+ dateDebut,FontFactory.getFont(FontFactory.COURIER, 12f,0)) );
document.add(new Paragraph("Date fin : "+ dateFin ,FontFactory.getFont(FontFactory.COURIER, 12f,0)) );
document.add(new Paragraph(" "));
document.add(new Paragraph(" "));

Chunk ck = new Chunk("INVENTAIRE", FontFactory.getFont(FontFactory.COURIER, 20f,Font.BOLD));
ck.setUnderline((float) 1, -2);
Paragraph para = new Paragraph(ck);
para.setAlignment(Paragraph.ALIGN_CENTER);
document.add(para);

String requete = "SELECT libelcatprod,refprod,nomprod,qtestock FROM produit, cat_produits " +
"WHERE produit.id_catprod = cat_produits.id_catprod " +
"GROUP BY cat_produits.libelcatprod,produit.refprod,produit.nomprod,produit.qtestock";


PreparedStatement prepare = Maconnexion.getInstance().prepareStatement(requete,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet res = prepare.executeQuery();
ResultSetMetaData resmeta = res.getMetaData();
res.last();
int lignetableau =res.getRow()+1;


//tableau(nbrecolonnes,nbrelignes)
Table tableau = new Table(6,lignetableau);

//La taille  se mesure en pourcentage par rapport à la largeur de la page
int [] widths = {18,13,33,12,12,12};  
tableau.setWidths(widths);
tableau.setAutoFillEmptyCells(true);
tableau.setPadding(1);

Cell cellule = new Cell("Catégorie");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Reférence ");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Désignation");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Qté en stock");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Qté appro.");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Qté vendue");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);
tableau.endHeaders();


//permet au curseur de se positionner avant le premier enregistrement dans la table
res.beforeFirst();
while(res.next()){
   for(int j = 2 ; j <= lignetableau;j++){
for(int i = 1 ; i <= (resmeta.getColumnCount()+2); i++ ){

switch(i)
{
case 4 :
int qteDisponible = (res.getInt("qtestock") + sommeQuantiteAppro(res.getString("refprod"), dateDebut, dateFin))	- sommeQuantiteVendue(res.getString("refprod"), dateDebut, dateFin);
cktable = new Chunk( (String.valueOf( qteDisponible)));
break;
case 5 :
cktable = new Chunk(String.valueOf(sommeQuantiteAppro(res.getString("refprod"), dateDebut, dateFin)));

break;
case 6 :
cktable = new Chunk( (String.valueOf( sommeQuantiteVendue(res.getString("refprod"), dateDebut, dateFin))));

break;						
default: 

}
    
cktable = new Chunk( (String.valueOf( res.getObject(i))));	
Phrase phrase = new Phrase(cktable);
tableau.addCell(phrase);

}
}
}

document.add(tableau);

runtime.exec(parametres);
prepare.close();
res.close();

}catch(DocumentException e){
e.printStackTrace();

} catch (FileNotFoundException e) {
e.printStackTrace();

} catch (IOException e) {
e.printStackTrace();

}catch (SQLException e) {
e.printStackTrace();
}


document.close();
}
/**
 * 	Méthode retournant la somme de la quantité vendue pour un produit à une période
 * @param numeroProduit
 * @param date1
 * @param date2
 * @return
 */
public int sommeQuantiteVendue(String referenceProduit, String date1, String date2){
int somQteVendu = 0;
String requete ="SELECT SUM(qteligne) AS qtevendue FROM produit P,ligne_facture L,facture F " +
        "WHERE P.id_prod L.id_prod AND L.id_fact F.id_fact AND P.refprod = '"+referenceProduit+"' " +
"AND F.datfact BETWEEN '"+date1+"' AND '"+date2+"'";

try{
PreparedStatement prepare = Maconnexion.getInstance().prepareStatement(requete,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet res = prepare.executeQuery();
//ResultSetMetaData resmeta = res.getMetaData();
res.next();
somQteVendu = res.getInt("qtevendue");
System.out.println("LA Quantité vendue pour le produit de réference "+referenceProduit+" est "+somQteVendu);
prepare.close();
res.close();

}catch(SQLException e){
e.printStackTrace();
}
return somQteVendu;
}

/**
 * Méthode retournant la somme de la quantité approvisionner pour un produit à une période
 * @param numeroProduit
 * @param date1
 * @param date2
 * @return
 */
public int sommeQuantiteAppro(String referenceProduit, String date1, String date2){
int somQteAppro = 0;

String req= "SELECT  SUM(ligne_approvisionnement.qteappro) AS quantite " +
"FROM   produit INNER JOIN ligne_approvisionnement ON produit.id_prod =  ligne_approvisionnement.id_prod " +
"INNER JOIN approvisionnement ON ligne_approvisionnement.id_appro = approvisionnement.id_appro " +
"WHERE  produit.refprod = '"+referenceProduit+"'AND  approvisionnement.datappro BETWEEN '"+date1+"' AND '"+date2+"' ";

try{
PreparedStatement prepare = Maconnexion.getInstance().prepareStatement(req,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet result = prepare.executeQuery();
//ResultSetMetaData resmeta = res.getMetaData();
result.next();
somQteAppro = result.getInt("quantite");
System.out.println("LA Quantité approvisionner pour le produit  de reférence  "+referenceProduit+" est "+somQteAppro);
prepare.close();
result.close();

}catch(SQLException e){
e.printStackTrace();
}
return somQteAppro;
}

J'explique un peu ce code:
En fait , j'ai écrire une requête qui m'envoie la liste des produits que j'ai dans ma table produit que je classe par catégorie de produit.
puis j'ai écrire une méthode pour avoir la somme de quantité de vendue par produit et une pour la somme de quantité approvisionner par produit à une période
Ces deux méthodes reçoivent en paramètre la référence du produit, la date de début période et la date de fin période
Ainsi J'utilise ces deux méthode pour remplir le tableau que j'ai crée avec Itext en utilisant les meta de la requête qui me renvoie la liste des produits.
Mais c'est là que je crois que tout ce complique car il me semble que les colonne du table que j'ai instancié avec Itext ne sont pas pris en compte.
cela me ramène une erreur que voici:


org.postgresql.util.PSQLException: L'indice de la colonne est hors limite : 5, nombre de colonnes : 4.
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkColumnIndex(AbstractJdbc2ResultSet.java:2668)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.checkResultSet(AbstractJdbc2ResultSet.java:2685)
at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getObject(AbstractJdbc2ResultSet.java:2516)
at impression.EtatInventaire.imprimeInventaire(EtatInventaire.java:160)
at mti.Inventaire$ValiderListener.actionPerformed(Inventaire.java:118)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.WaitDispatchSupport$2.run(Unknown Source)
at java.awt.WaitDispatchSupport$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.WaitDispatchSupport.enter(Unknown Source)
at java.awt.Dialog.show(Unknown Source)
at java.awt.Component.show(Unknown Source)
at java.awt.Component.setVisible(Unknown Source)
at java.awt.Window.setVisible(Unknown Source)
at java.awt.Dialog.setVisible(Unknown Source)
at mti.Inventaire.(Inventaire.java:39)
at mti.MenuPrincipal$21.actionPerformed(MenuPrincipal.java:549)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)


J'ai pourtant déclaré un tableau de 6 colonnes et de nombre de ligne le nombre d'enregistrement que me renvoie la requête sur la liste des produit.

je n'arrive pas à m'en sortir , j'ai besoin de votre aide
Merci

1 réponse

cs_redbar Messages postés 112 Date d'inscription mardi 26 janvier 2010 Statut Membre Dernière intervention 26 mai 2014
5 juil. 2012 à 11:13
Bonjour à tous
Je viens de trouver la solution a mon problème. en fait le problème se posait au niveau de ma requète. J'ai fais donc une jointure externe et j'ai eu mon résultat:
Voici donc le code que j'ai produit;

public void imprimeInventaire(String dateDebut, String dateFin){


//Recuperation de l'environnement 
Runtime runtime = Runtime.getRuntime();

//Tableau de parametres : chemin vers l'appli, chemin vers le pdf
String []parametres = {"C:\\Program Files\\Adobe\\Reader 9.0\\Reader\\AcroRd32.exe","rapport/inventaire.pdf"};

/** 
 * Creation du document à imprimer en lui donnant la taille qu'il faut
 * la methode rotate() pour mettre la page en paysage
 */
Document document = new Document(PageSize.A4.rotate());
try{
PdfWriter fichierpdf = PdfWriter.getInstance(document, new FileOutputStream("rapport/inventaire.pdf"));
document.addTitle("Inventaire");
document.addAuthor("Athanase KOUASSI");
document.addSubject("Génération de PDF.");
document.addKeywords("iText, gestion de stock");
document.getPageNumber();
document.open();

//Recupere la date système
Date date = new Date(); 
//formater la date
SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd MMMM yyyy 'à' HH:mm:ss");
Paragraph par = new Paragraph("Inventaire réalisé le "+sdf.format(date),FontFactory.getFont(FontFactory.COURIER, 11f,0));
par.setAlignment(Element.ALIGN_RIGHT);
document.add(par);
document.add(new Paragraph(" "));
document.add(new Paragraph("Date debut : "+ dateDebut,FontFactory.getFont(FontFactory.COURIER, 12f,0)) );
document.add(new Paragraph("Date fin : "+ dateFin ,FontFactory.getFont(FontFactory.COURIER, 12f,0)) );
document.add(new Paragraph(" "));
document.add(new Paragraph(" "));

Chunk ck = new Chunk("INVENTAIRE", FontFactory.getFont(FontFactory.COURIER, 20f,Font.BOLD));
ck.setUnderline((float) 1, -2);
Paragraph para = new Paragraph(ck);
para.setAlignment(Paragraph.ALIGN_CENTER);
document.add(para);

String requete = " SELECT  TRIM(libelcatprod),TRIM(refprod), TRIM(nomprod), qtestock ,  Sum(DISTINCT qteappro) AS qteappro,SUM(DISTINCT qteligne) AS qtevendue " +
"FROM cat_produits LEFT JOIN produit ON cat_produits.id_catprod = produit.id_catprod " +
"LEFT JOIN ligne_facture ON produit.id_prod = ligne_facture.id_prod " +
"LEFT JOIN facture ON ligne_facture.id_fact = facture.id_fact " +
"LEFT JOIN ligne_approvisionnement  ON  produit.id_prod = ligne_approvisionnement.id_prod " +
"LEFT JOIN approvisionnement ON ligne_approvisionnement.id_appro = approvisionnement.id_appro " +
"WHERE approvisionnement.datappro BETWEEN '"+ dateDebut+"' AND '"+dateFin+" '  OR approvisionnement.datappro IS NULL AND" +
" facture.datfact BETWEEN '"+dateDebut+"' AND '"+dateFin+"' OR facture.datfact IS NULL  " +
"GROUP BY libelcatprod,nomprod, refprod, qtestock  " +
"ORDER BY libelcatprod";
 
  		
PreparedStatement prepare = Maconnexion.getInstance().prepareStatement(requete,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet res = prepare.executeQuery();
ResultSetMetaData resmeta = res.getMetaData();
res.last();
int lignetableau =res.getRow()+1;


//tableau(nbrecolonnes,nbrelignes)
Table tableau = new Table(6,lignetableau);

//La taille  se mesure en pourcentage par rapport à la largeur de la page
int [] widths = {18,13,33,12,12,12};  
tableau.setWidths(widths);
tableau.setAutoFillEmptyCells(true);
tableau.setPadding(1);

Cell cellule = new Cell("Catégorie");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Reférence ");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Désignation");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Qté en stock");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Qté appro.");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);

cellule = new Cell("Qté vendue");
cellule.setHeader(true);
cellule.setBackgroundColor(Color.darkGray.brighter().brighter().brighter());
cellule.setHorizontalAlignment(Element.ALIGN_CENTER);
tableau.addCell(cellule);
tableau.endHeaders();

//permet au curseur de se positionner avant le premier enregistrement dans la table
res.beforeFirst();
while(res.next()){
for(int i = 1 ; i <= (resmeta.getColumnCount()); i++ ){
    
cktable = new Chunk( (String.valueOf( res.getObject(i))));	
Phrase phrase = new Phrase(cktable);
tableau.addCell(phrase);

}
}

document.add(tableau);

runtime.exec(parametres);
prepare.close();
res.close();

}catch(DocumentException e){
e.printStackTrace();

} catch (FileNotFoundException e) {
e.printStackTrace();

} catch (IOException e) {
e.printStackTrace();

}catch (SQLException e) {
e.printStackTrace();
}

document.close();
}
}


aussi si vous avez des remarques à faire sur ce code je suis ouvert à les recevoir afin d'ameliorer merci.
0
Rejoignez-nous