IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Calcul colonne DataTable JSF


Sujet :

JSF Java

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut Calcul colonne DataTable JSF
    Bonjour,

    Je suis actuellement nouveau dans le developpement JSF et je developpe avec JDeveloper.
    J'ai actuellement 3 colonnes dans une datatable; les autres colonnes doivent se calculer à partir des 3 premières (par exemple la 4ème est 1ère/2ème*100...enfin des calculs assez basiques!); comment peut on faire pour faire ces calculs cases par cases ??
    Aussi une colonne doit être calculée à partir d'une fonction; comment peut on appeler une fonction sur toute une colonne ??

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Salut 2 solutions :

    - Avec l'EL de JSF tu dois pouvoir effectuer le calcul en direct.

    - Ajouter un champ résultat a tes objets et effectuer le calcul avant l'affichage.


    La première solution est la meilleure je pense.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Merci pour ta reponse; je souhaiterais effectuer le calcul avant le rendu dans la page JSF; j'ai recuperé des composants de MyFaces et j'ai le code suivant (avec pas mal de trucs modifiés par mes soins; les resultset n'y étaient pas avant!):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
             rs=stmt.executeQuery("SELECT *,(pmp*soldf) RES FROM PVMCA WHERE id=11");  
             }
              catch(SQLException e){}    
     
            List rowList = new ArrayList();
            while (rs.next())
            {
                List colList = new ArrayList();
                String tmpTit = rs.getString("sym");
                String tmpUti = rs.getString("soldf");
                String tmpSta = rs.getString("pmp");
                String tmpIdu = rs.getString("res");
                colList.add(tmpTit);
                colList.add(tmpUti);
                colList.add(tmpSta);
                colList.add(tmpIdu);
                rowList.add(colList); 
            }
            data = new ListDataModel(rowList);
    Je souhaiterais faire le calcul dans le executeQuery (pmp*soldf); sans le (pmp*soldf) RES dans le SELECT cela marche bien; mais des que je le rajoute avec le String tmpIdu = rs.getString("res"); cela me crée une erreur de pointeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    javax.faces.FacesException: javax.servlet.ServletException: java.lang.NullPointerException
    	at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:351)
    	at org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:211)
    	at oracle.adfinternal.view.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:157)
    	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:107)
    	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:245)
    	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:137)
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:140)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.ResourceFilterChain.doFilter(ResourceFilterChain.java:65)
    	at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl._invokeDoFilter(AdfFacesFilterImpl.java:228)
    	at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl._doFilterImpl(AdfFacesFilterImpl.java:197)
    	at oracle.adfinternal.view.faces.webapp.AdfFacesFilterImpl.doFilter(AdfFacesFilterImpl.java:123)
    	at oracle.adf.view.faces.webapp.AdfFacesFilter.doFilter(AdfFacesFilter.java:103)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:623)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:370)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.HttpRequestHandler.doProcessRequest(HttpRequestHandler.java:871)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:453)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.HttpRequestHandler.serveOneRequest(HttpRequestHandler.java:221)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:122)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.HttpRequestHandler.run(HttpRequestHandler.java:111)
    	at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSocketReadHandler.java:260)
    	at oracle.oc4j.network.ServerSocketAcceptHandler.procClientSocket(ServerSocketAcceptHandler.java:239)
    	at oracle.oc4j.network.ServerSocketAcceptHandler.access$700(ServerSocketAcceptHandler.java:34)
    	at oracle.oc4j.network.ServerSocketAcceptHandler$AcceptHandlerHorse.run(ServerSocketAcceptHandler.java:880)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:298)
    	at java.lang.Thread.run(Thread.java:595)
    Caused by: javax.servlet.ServletException: java.lang.NullPointerException
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.EvermindPageContext.handlePageThrowable(EvermindPageContext.java:866)
    	at com.evermind[Oracle Containers for J2EE 10g (10.1.3.3.0) ].server.http.EvermindPageContext.handlePageException(EvermindPageContext.java:813)
    	at _app._jspService(_app.java:1546)
    	[/app.jsp]
    Est ce une erreur de SQL ? de Java ? Puis je récuperer en Integer mes valeurs des colonns pmp et soldf et les calculer avec une fontion Java avant de les rajouter à mon datatable ??

    Merci

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Points : 1 745
    Points
    1 745
    Par défaut
    Il faut que tu donne à JSF une collection d'objet qui contiennent tes informations (1 objet = une ligne de base de donnée).

    Donc je te conseille de faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class TonTypeDObjet{
       TypeQu'ilFaut sym;
       TypeQu'ilFaut soldf;
       TypeQu'ilFaut pmp.
       TypeQu'ilFaut pmp.
     
    // GETTERS ET SETTERS
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    List rowList = new ArrayList();
    while (rs.next())
    {
     
                List colList = new ArrayList();
                TonTypeDObjet obj = new TonTypeDObjet();
     
     
                obj.setSym( rs.getString("sym") );
                obj.setSolfd( rs.getString("soldf") );
                obj.setPmp( rs.getString("pmp") );
     
                // Calculer le résultat
                obj.setRes( obj.getPmp() * obj.getSoldf() );
     
                // Ajouter l'objet à la liste
                rowList.add(obj); 
    }
    data = new ListDataModel(rowList);
    Après dans ta JSP par l'attribut var du DataTable à 1 objet de la liste.
    et dans chaque colomne tu peut mettre

    <h:outputText value="#{var.spmp}">


    EDIT : merdouille j'avais pas vu que tu passais par une ColList

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Je comprends ton exemple; mais cela ne marche pas...c'est quoi la difficulté d'utiliser une colList ?? La colList était utilisée dans les exemples d'Apache MyFaces donc j'ai laissé dans le même style.
    j'espère que je ne vais pas devoir tout refaire...quelqu'un à d'autres idées ??

    Merci

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    Bon...j'ai essayé de convertir les données du resultset que je récupere en float pour pouvoir faire le calcul dans mon bean java:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
                String tmpTit = rs.getString("sym");            
                String tmpUti = rs.getString("soldf");
                f1 = strToFloat(tmpUti);
                String tmpSta = rs.getString("pmp");
                f2 = strToFloat(tmpSta);
                f3 = f2*f1;
                colList.add(tmpTit);
                colList.add(f3);
                colList.add(tmpSta);
                rowList.add(colList);....
     
        public static float strToFloat(String s) 
        { 
        Integer integ = new Integer(s); 
        float f = integ.floatValue(); 
        return f; 
        }
    mais je recois une erreur:
    javax.faces.FacesException: javax.servlet.ServletException: java.lang.NumberFormatException: For input string: "0.9231"....

    Je ne comprends pas; quand je fait le colList.add(f1); ça marche très bien mais c'est après le f2 que ça foire...pourtant dans ma colonne soldf j'ai des valeurs comme 0.0, 47000.0... et dans pmp 0.9231, 1.3782...ça devrait marcher dans les deux cas...mystère!

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2005
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 42
    Points : 24
    Points
    24
    Par défaut
    avec quelques fonctions supplémentaires j'ai reussi à m'en sortir; si quelqu'un a besoin je posterais le code; aussi j'ai un autre souci sur ce même resultset;
    je souhaiterais pendant que je recupere les données dans le rs calculer une nouvelle colonne avec une fonction définie dans la BD dans un package vm_util. Cette fonction s'apelle get_data et prends en param un symbol et la date. Donc je souhaieterais pour chaque symbole sym recupere dans le rs effectuer
    cette fonction get_data(sym,sysdate) pour la date du jour!
    Donc ca devrait donner ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rs=stmt.executeQuery("SELECT *, vm_utl.get_pret_data(sym,sysdate) RES FROM PVMCA WHERE id=11");
    et la j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    javax.faces.FacesException: javax.servlet.ServletException: java.lang.NullPointerException.....
    Des idées sur mon erreur ?

Discussions similaires

  1. formatage date d'une colonne DataTable
    Par mappy dans le forum VB.NET
    Réponses: 4
    Dernier message: 14/09/2007, 11h35
  2. Réponses: 4
    Dernier message: 12/09/2007, 19h04
  3. Rendu Partiel Datatable JSF
    Par mihaestii dans le forum JSF
    Réponses: 6
    Dernier message: 23/08/2007, 16h05
  4. Somme colonne datatable à partir ResultSet
    Par mihaestii dans le forum JSF
    Réponses: 2
    Dernier message: 20/08/2007, 14h18
  5. Réponses: 5
    Dernier message: 19/07/2007, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo