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 :

Accès ancienne valeur d'une ligne dans DataTable


Sujet :

JSF Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 146
    Points : 78
    Points
    78
    Par défaut Accès ancienne valeur d'une ligne dans DataTable
    Bonjour à tous,

    je voudrais savoir s'il était possible d'accéder à la valeur de mon objet avant que celui-ci ai été modifié dans une dataTable. Je m'explique un peu mieux. J'ai une dataTable qui représente une liste de Personne, possédant uniquement 3 colonnes ; le nom, le prénom et une icone pour la modification (rowEditor).

    Lorsque je clique sur le mode édition, que je modifie différentes valeurs et que je valide j'appelle la fontion onEdit :

    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
     
    private List<Personne> maList;
     
    public void onEdit(RowEditEvent event)
    {
        // recuperation du nouvel objet
        Personne pnew = (Personne) event.getObject();
     
        // recuperation de l'ancien objet
        Personne pold; // je ne sais pas comment
     
       // traitement
       maList.remove(pold);
       maList.add(pnew);
     
       // modification dans la base
    }
    En fait j'ai vraiment besoin de connaitre l'ancienne valeur de mon objet Personne. J'ai cru voir que cela été possible avec un CellEdit. Mais faire ce traitement avec un cellEdit ne me parait pas une bonne chose. Je préférerais réaliser un seul update par ligne.

    Si cela n'est pas possible : peut-on récupérer l'ensemble des objets enregistrés dans la dataTable ? Si je pose cette question c'est que je l'initialise avec ma List<Personne>, et si je pouvais récupérer dans la fonction onEdit la nouvelle liste, je pourrais comparer les valeurs de mes objets.

    Si vous ne comprenez pas ce que je dit, dites le moi et je tenterais de reformuler ^^

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 75
    Points : 54
    Points
    54
    Par défaut
    Il faudrait quand même que tu donnes plus de code...

    Quel est le code de ta classe Personne ? Il n'y a pas d'id ? Tant que tu n'as pas fait le remove sur ta liste, ton ancienne valeur y est encore...
    Ca serait simpa aussi que tu mettes en ligne le code de ta table. J'en ai déduit que tu utilisais prime faces (mais pas sûr) ; dans ton event, tu as la source, donc il doit y avoir moyen de retrouver l'élément de ta liste...

    Bref, si t'es pas plus généreux en information, ça va être dur de t'aider...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 146
    Points : 78
    Points
    78
    Par défaut
    Oui j'utilise bien primefaces. Si vous voulez plus de code je vous en met mais sa me semblait plus clair comme sa plutot que de rentrer dans les détails qui vont vous paraitre un peu "bizare" surement.

    Donc ma dataTable :
    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
     
    <h:form id="form1" >   
     
    	<p:growl id="messages2" showDetail="true"/>
     
    	<h:outputLabel for="coorddataTable" value="Coordinateur(s) :" style="font-weight:bold"/> 
    	<p:dataTable id="coorddataTable" var="pers" value="#{pageInstanceAdminBean.coord}" editable="true">
     
    		<p:ajax event="rowEdit" listener="#{pageInstanceAdminBean.onEditCoord}" update=":form1:messages2" /> 
    		<p:ajax event="rowEditCancel" listener="#{pageInstanceAdminBean.onCancelCoord}" update=":form1:messages2" /> 
     
    		<p:column sortBy="nom" headerText="Nom">
    			<p:cellEditor>
    				<f:facet name="output">
    					<h:outputText value="#{pers.nom}"/>
    				</f:facet>
    				<f:facet name="input">
    					<h:inputText value="#{pers.nom}"/>
    				</f:facet>											
    			</p:cellEditor>
    		</p:column>
     
    		<p:column sortBy="prenom" headerText="Prenom">
    			<p:cellEditor>
    				<f:facet name="output">
    					<h:outputText value="#{pers.prenom}"/>
    				</f:facet>
    				<f:facet name="input">
    					<h:inputText value="#{pers.prenom}"/>
    				</f:facet>
    			</p:cellEditor>
    		</p:column>
     
    		<p:column style="width:6%">
    			<p:rowEditor/>
    		</p:column>
     
    		<f:facet name="footer">
    			<h:commandButton value="Ajouter" actionListener="#{pageInstanceAdminBean.addRowCoord}" rerender="coorddataTable"/>
    		</f:facet>
    	</p:dataTable>
     
    </h:form>
    Ma classe Personne ne possede que 2 propriétés Nom et Prenom, et aucun identifiant. En fait cette classe n'est pas une entity et donc pas une classe dans ma base de donnée.

    Dans ma base j'ai une autre table Instance qui possede un champ coord que j'ai mis en string. Et j'inscris les différentes personnes dans ce champ de cette maniere : "Toto titi;Titi tutu;Tata titi". Ainsi pour cette instance il existe 3 coordinateurs du nom de Toto titi, Titi tutu et Tata titi. Donc pour former et récupérer mes personnes je m'amuse avec des splits... Ce choix est fait comme je n'ai a enregistrer en base que des noms, et je n'ai aucune autre action à faire dessus. Ils sont destinés à être affiché / modifié / supprimé mais on a pas besoin de controle dessus.

    Enfin bref j'ai fait ce choix. Ainsi comme je n'ai pas d'identifiant et que si l'utilisateur modifie le nom et le prénom d'une personne j'ai besoin que dans le string que je vais produire, l'ancien ne s'y trouve pas et le nouveau oui. Donc j'ai besoin d'avoir accès à l'ancienne valeur de mon objet Personne.

    J'ai tenté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Personne p = (Personne) event.getSource();
    Mais sa me retourne la nouvelle valeur de mon objet...

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 146
    Points : 78
    Points
    78
    Par défaut
    J'ai trouvé une façon de faire sa. J'arrive a récupérer la position de mon objet. Avec celle-ci je peux supprimer l'ancien objet dans ma liste et ajouter mon nouvel objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DataTable dt = (DataTable) event.getSource();
    int nb = dt.getRowIndex();
     
    maList.remove(nb);
     
    Personne pnew = (Personne) event.getObject();
    maList.add(pnew);
    Néanmoins je ne suis pas totalement satisfaite. J'aurais aimé pouvoir comparer mes 2 objets pour savoir s'il y a eu ou non des modifications. Car si l'utilisateur clique sur l'icone modifier et valide sans apporter de modifications, derrière il y a quand même un update dans la base de donnée qui est complètement inutile.

    Si vous ne comparez pas vos 2 objets comment faites vous dans vos projets pour ne pas faire ces update inutiles ?

  5. #5
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut mais pour quoi ne pas utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Personne oldValue = tu recuperes cela dans ton rowEdit
    et avant de sauvegarder, tu la compare avec la nouvelle valeur.

    si cela est en vue ViewScoped.

    Eric

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 146
    Points : 78
    Points
    78
    Par défaut
    Je suis désolais mais je ne comprend pas du tout comment faire cela...

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Citation Envoyé par Lolosan Voir le message
    Avec celle-ci je peux supprimer l'ancien objet dans ma liste et ajouter mon nouvel objet.
    je ne comprend pas pourquoi ??? normalement dans ta liste tu trouve les valeurs modifié !

    pour avoir les valeurs précédentes, tu utilises l'event rowEditInit et tu gardes l'objet jusqu'a l'evenement rowEdit ou rowEditCancel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <p:ajax event="rowEditInit" listener="#{pageInstanceAdminBean.beforeEditCoord}"/>

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 146
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Alkhan Voir le message
    je ne comprend pas pourquoi ??? normalement dans ta liste tu trouve les valeurs modifié !
    Non mais comment j'ai pu passer à côté de sa ?!

    Je viens de retirer mes remove et add de ma liste et effectivement elle se met à jour seule. Mais je ne comprend pas par quel miracle cela fonctionne. J'ai bien un getter sur cette liste mais aucun setter... Comment cela se met à jour ?

  9. #9
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Citation Envoyé par Lolosan Voir le message
    Comment cela se met à jour ?
    C'est simple, il ne modifie pas la liste mais uniquement les données de ton instance de 'Personne' qui se trouve dans la liste donc pas besoin de setteur sur la liste !

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 146
    Points : 78
    Points
    78
    Par défaut
    Ok ok merci je vois mieux comment c'est géré. Et je comprend mieux aussi pourquoi la seconde liste que je tentais de conserver apparaît toujours avec les nouvelles valeurs... c'est que mes 2 listes référencent les même objets et quand un objet est mis à jour, il l'ai sur mes deux listes...

    Je viens de tester le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <p:ajax event="rowEditInit" listener="#{pageInstanceAdminBean.beforeEditCoord}"/>
    Et c'est exactement ce que je cherchais merci beaucoup !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/01/2015, 16h55
  2. Récupérer le contenu d'une ligne dans datatable
    Par stoner2008 dans le forum JSF
    Réponses: 5
    Dernier message: 26/12/2013, 17h16
  3. Récupérer la valeur d'une ligne dans une procédure stockée
    Par mobscene dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 07/12/2006, 19h29
  4. Réponses: 14
    Dernier message: 24/05/2006, 16h05
  5. Réponses: 2
    Dernier message: 07/07/2005, 11h47

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