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 :

JSF / HTML / PrimeFaces : actualiser un DataTable


Sujet :

JSF Java

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut JSF / HTML / PrimeFaces : actualiser un DataTable
    Bonjour,

    J'ai une liste de produits dans un datatable avec les colonnes : Prix, Quantité (éditable) et Total.

    Quand je modifie la Quantité, je veux bien sur calculer : Total = Prix * Quantité.

    Un listener <p:ajax> sur Quantité me permet de récupérer l'objet Produit de la ligne, mais je n'arrive pas à actualiser Total.

    Je sais, c'est idiot, mais je suis bloqué là dessus depuis tellement de temps que je n'ose pas le préciser !!!

    Merci de m'aider

  2. #2
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    si tu veux un peu d'aide, il serait bon que tu nous fournisses ce que tu as déjà mis en place.
    Attention le code généré, celui lisible dans le navigateur.

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    Bonjour,

    Lorsque je saisis une quantité, je souhaite mettre à jour le total ht de la ligne et de la colonne.

    Merci.

    Mon code :

    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
    <p:column headerText="Quantité">
        <p:inputText value="#{prod.quantite}" >
             <p:ajax event="change" listener="#{catalogManagerBean.quantiteSaisie(prod)}" />
        </p:inputText>
    </p:column>
     
    <p:column headerText="Total HT">
         <h:outputText value="#{prod.total}"/>
         <f:facet name="footer" >
               <h:outputText value="#{catalogManagerBean.totalGeneral}" />
         </f:facet>
    </p:column>
     
     
    public void quantiteSaisie(Product p) {
         p.setTotal(p.getPrix() * p.getQuantite());
         calculerTotalGeneral();
        }
     
        public void calculerTotal() {
            for (Product p : listeProduit) {
                p.setTotal(p.getPrix() * p.getQuantite());
            }
        }
     
        public void calculerTotalGeneral() {
            Double total = 0.0;
            for (Product p : listeProduit) {
                total = total + p.getTotal();
                setTotalGeneral(total);
            }

    Nom : Capture.PNG
Affichages : 955
Taille : 19,2 Ko

  4. #4
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Je n'avais pas bien vu le langage qui possède son propre forum, je déplaces.

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Là, c'est un peu plus compliqué, d'autant que mettre à jour la zone dans le footer nécessite une bidouille (de mémoire)...

    La solution simple (si tu n'as pas beaucoup de donner dans le datatable) consiste à faire un update sur la table après la modification.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <p:datatable id="maTable" ....>
    ...
       <p:column>
          <p:inputText ...>
             <p:ajax event="change" process="@this" listener="..." update="maTable"/>
       </p:column>
    ...
    </p:datatable>
    Sinon, il va falloir faire un update du total de la ligne + un update de la ligne de totalisation...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    Merci pour ta réponse, mais j'ai omis de préciser que Quantité et Total HT ne sont pas en base, ici c'est juste pour de l'affichage.

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:inputText value="#{prod.quantite}" >
    que représente "prod" ? Une entity ? Un objet différent ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    "Prod" correspond à une entité "Produit", et quantité est un transient car non stocké en base.

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    J'aurais fait une méthode pour renvoyer la donnée calculée, pas besoin d'un @Transient
    Ceci dit, ça ne change rien au problème, tu dois rafraichir la colonne également...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    J'ai déjà essayé mais ça ne marche pas.
    Lorsque je modifie la quantité, je renvoie bien l'objet "Produit" concerné au manager, puis je modifie le total (lui aussi transient car non basé), mais il me manque la ligne du tableau.

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Il faudrait montrer plus de code là, on va tourner en rond...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    Je souhaite qu'à la saisie d'une quantité, le total de la ligne et le total général (vertical) soit actualisés avec pour résultat : Prix * Quantité.

    Quantité et total ne sont pas en base à ce niveau : il s'agit pour l'utilisateur de pré commander. La commande sera finalisée plus tard s'il le souhaite.

    Dans l'exemple ci-dessous : j'ai saisi "2" en quantité sur la 2ème ligne et le prix étant de 800, je voudrais qu'en sortant du champ Quantité s'affiche "1600" dans la colonne Total HT et "1600" en total vertical de la colonne Total HT.

    MERCI


    Nom : Capture.PNG
Affichages : 935
Taille : 11,4 Ko


    Voici l'entité :

    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
    @Entity
    @Table(name = "PRODUCT")
    public class Product implements java.io.Serializable {
    
        @Column(name = "ID")
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int identifiant;
    
        @Column(name = "NAME")
        private String nom;
    
        @Column(name = "SELLING_PRICE")
        private Double prix;
        
        @Transient
        private int quantite;
        
        @Transient
        private Double total;
    
        public Product() {
            setQuantite(0);
            setTotal(0.0);
        }
    La page :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    <h:form>
                    <p:dataTable id="produits" var="prod" 
                                 rendered="#{catalogManagerBean.listSize() > 0}" 
                                 value="#{catalogManagerBean.listeProduit}"
                                 resizableColumns="true" 
                                 draggableColumns="true" 
                                 reflow="true" 
                                 rows="5"
                                 paginator="true"
                                 paginatorPosition="bottom" 
                                 paginatorAlwaysVisible="false"
                                 paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                 rowsPerPageTemplate="5,10,15,20,25,30"
                                 scrollable="true"
                                 selectionMode="multiple" selection="#{catalogManagerBean.lignesSelectionnees()}" rowKey="#{prod.identifiant}"
                                 >                 
    
                        <f:facet name="header">
                            Les articles du catalogue
                            <p:commandButton id="toggler" type="button" icon="ui-icon-calculator" />
                            <p:columnToggler datasource="produits" trigger="toggler" />
                        </f:facet>
                        
                        <h:outputText value="Le catalogue est vide !" rendered="#{catalogManagerBean.listSize()==0}"/>
                        
                        <p:column headerText="Identifiant" sortBy="#{prod.identifiant}" > 
                            <h:outputText value="#{prod.identifiant}" />
                        </p:column> 
                        
                        <p:column headerText="Libellé" sortBy="#{prod.nom}" >
                            <h:outputText value="#{prod.nom}" />
                        </p:column>
                        
                        <p:column headerText="Prix" sortBy="#{prod.prix}" >
                            <h:outputText value="#{prod.prix}" />
                        </p:column>
                        
                        <p:column headerText="Quantité" sortBy="#{prod.quantite}" >
                            <p:inputText value="#{prod.quantite}" >
                                <p:ajax event="change" listener="#{catalogManagerBean.quantiteSaisie(prod)}" />
                            </p:inputText>
                        </p:column>
                        
                        <p:column headerText="Total HT" sortBy="#{prod.total}" >
                            <h:outputText value="#{prod.total}" />
                            <f:facet name="footer" >
                                <h:outputText value="#{catalogManagerBean.totalGeneral}" />
                            </f:facet>
                        </p:column>
                        
                        <p:column>
                            <h:commandButton value="Modifier" action="#{catalogManagerBean.mergeProduct}">
                                <!--Retourne l'objet de la ligne courante-->
                                <f:setPropertyActionListener value="#{prod}" 
                                                             target="#{catalogManagerBean.ligneCourante}" />
                            </h:commandButton>
                        </p:column>
                        
                        <p:column>
                            <h:commandButton value="Supprimer" action="#{catalogManagerBean.removeProduct}">
                                <!--Retourne l'objet de la ligne courante-->
                                <f:setPropertyActionListener value="#{prod}"
                                                             target="#{catalogManagerBean.ligneCourante}" />
                            </h:commandButton>
                        </p:column>
                        
                        <f:facet name="footer">
                            il y a #{catalogManagerBean.listeProduit.size()} produits dans le catalogue
                        </f:facet>
                        
                    </p:dataTable>
                    
                    <h:commandLink styleClass="lien" action="retourCatalogue">
                        <p></p>
                        <h:outputText value="Retour à l'accueil"/>
                    </h:commandLink>
                    
                </h:form>
    Le manager :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    @ManagedBean
    @ApplicationScoped
    public class CatalogManagerBean implements Serializable {
    
        @EJB
        private ProductFacade productFacade;
    
        private List<Product> listeProduit;
    
        private Product ligneCourante;
        
        private List<Product> lignesSelectionnees;
    
        private int identifiant;
        private String nom;
        private Double prix;
        private int quantite;
        private Double total;
    
        private Double totalGeneral;
    
        public CatalogManagerBean() {
            listeProduit = new ArrayList<Product>();
        }
    
        @PostConstruct
        public void initCatalog() {
            
            setListeProduit(getProductFacade().findAll());
            
            setTotalGeneral(0.0);
        }
    
        public void quantiteSaisie(Product p) {
            
            p.setTotal(p.getPrix() * p.getQuantite());
    
            calculerTotalGeneral();
            
        }
    
        public void calculerTotal() {
    
            for (Product p : listeProduit) {
    
                p.setTotal(p.getPrix() * p.getQuantite());
            }
        }
    
        public void calculerTotalGeneral() {
    
            Double total = 0.0;
    
            for (Product p : listeProduit) {
    
                total = total + p.getTotal();
    
                setTotalGeneral(total);
            }
        }

  13. #13
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Ajoute l'update
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <p:ajax event="change" listener="#{catalogManagerBean.quantiteSaisie(prod)}" update="produits"/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2015
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Février 2015
    Messages : 402
    Points : 153
    Points
    153
    Par défaut
    CA MARCHE

    Merci infiniment OButterlin

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/09/2010, 09h28
  2. actualiser un datatable
    Par intissar_g dans le forum JSF
    Réponses: 2
    Dernier message: 22/09/2008, 12h01
  3. jsf/core et jsf/html non trouvés
    Par kimlee dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 07/11/2007, 16h49
  4. quel tag JSF HTML utiliser ( <h:/> ) ?
    Par gaet_045 dans le forum JSF
    Réponses: 7
    Dernier message: 12/06/2007, 17h03

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