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

W4 Express Java Discussion :

Persister les modifications d'un LyObject depuis une processAction


Sujet :

W4 Express Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Points : 126
    Points
    126
    Par défaut Persister les modifications d'un LyObject depuis une processAction
    Bonjour.

    Je cherche à changer en base la valeur d'un champ d'un LyObject.
    Je reussi à changer la valeur en mémoire mais il n'impact pas la base de données.

    Auriez-vous une piste ?

    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
     
    	public LyController processAction(LySession session, LyController parent, LyAction action,
    		LyClassInfo classInfo, LyObjectList objects)
    	{
     
    		// Si nous n'avons pas d'objets selectionnés
    		if(objects == null || objects.getSize() <= 0){
    			LyClassWorkSpace ws = new LyClassWorkSpace(session, classInfo, true);
    			objects = new LySimpleObjectList(ws);
    		}
     
    		// Pour chaque objet, on fait une RAZ du champ commentaire et une réinitialisation du champ statut.
    		Iterator<LyObject> it = objects.iterator();
    		LyFieldInfo infoCommentaire = classInfo.getFieldInfo(PRJ_AGATE.FLD_COMMENTAIRE_CHAMP);
     
     
    		while (it.hasNext()) {
     
    			LyObject lyObject = (LyObject) it.next();
    			lyObject.setValue(infoCommentaire, null);
     
    		}
     
     
    		return null;
    	}
    Pour une bonne résolution :
    - N'hésitez pas à donner le maximum d'informations sur vos problèmes, ca vous fera gagner du temps en évitant les aller-retours.
    - Si vous utilisez maven, pensez à rajouter votre pom !

    --> Le meilleur code est celui qui concrétise ce qui a été posé et analysé sur le papier

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Points : 126
    Points
    126
    Par défaut
    Pour mise à jour :

    Je ne passe plus dans une processAction mais désormais dans un behavior.
    Cependant mon problème reste identique

    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
    	@Override
    	public boolean handleDemand(LyController controller, LyDemand demand) {
    		boolean res = super.handleDemand(controller, demand);
     
    		if(demand != null && 
    				demand instanceof LyActionDemand &&
    				demand.getSource().equalsIgnoreCase(PRJ_AGATE.ACT_ACT_RAZ_EDIT_VIEW_LIST_PRODUCTION)){
     
    			if(controller != null && 
    					controller instanceof LyEditTableController){
     
    				LyClassInfo classInfo =controller.getClassInfo(PRJ_AGATE.CLS_CHAMPS_LIVRAISON_PRODUCTION_CLS);
    				LySession session = controller.getSession();
    				LyFieldInfo infoCommentaire = classInfo.getFieldInfo(PRJ_AGATE.FLD_COMMENTAIRE_CHAMP);
    				LyFieldInfo infoStatut = classInfo.getFieldInfo(PRJ_AGATE.FLD_STATUT_CHAMP);
     
    				LyEditTableController editTableController = (LyEditTableController)controller;
    				LyObjectList objects = editTableController.getSelection();
     
    				if (objects == null || objects.getSize() <= 0){
    					objects = editTableController.getContent();
    				}
     
    				Iterator<LyObject> it = objects.iterator();
     
    				while (it.hasNext()) {
     
    					LyObject lyObject = (LyObject) it.next();
    					lyObject.setValue(infoCommentaire, null);
    					lyObject.setValue(infoStatut, (short) 0);
     
    				}
     
    				editTableController.reset();
     
    			}
    		}
    		return res;
    	}
    Pour une bonne résolution :
    - N'hésitez pas à donner le maximum d'informations sur vos problèmes, ca vous fera gagner du temps en évitant les aller-retours.
    - Si vous utilisez maven, pensez à rajouter votre pom !

    --> Le meilleur code est celui qui concrétise ce qui a été posé et analysé sur le papier

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 63
    Points
    63
    Par défaut
    Je pense qu'il faut enregistrer les modifications faites sur l'objet.
    Cela passe par un lyObject.set() après les setValue().

    Utiliser un LyContext permettrait d'envoyer les modifications de tous les objets en une seule transaction.
    FAQ Studio et FAQ Leonardi pour les outils W4

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 93
    Points : 126
    Points
    126
    Par défaut
    Merci Eric pour ton retour.

    J'ai trouvé une solution avec la technique que tu donne (ce qui me conforte dans ma solution)

    Voici ce que j'ai fais :
    1 - J'ai viré l'action de l'écran de navigation
    2 - J'ai crée une action spécifique rattachée à mon entité puis j'ai rajouté la marque tool pour l'avoir dans mes tables, etc ..
    3 - j'ai étendu le Behavior et j'ai rajouté le code spécifique directement dans la méthode validate. J'arrive donc au bon résultat avec des commits / rollback manuels :

    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
     
    	@Override
    	public boolean validate(LyController controller, LyParameterValues values) {
     
    		final boolean validate = super.validate(controller, values);
    		if (validate) {
    			final LyEnvironment lyEnv = controller.getEnvironment();
    			final LyUserInputController userInputController = (LyUserInputController) controller;
    			final LyWorkSpace context = userInputController.getContext();
     
    			if (context != null) {
    				LyClassInfo classInfo = controller
    						.getClassInfo(PRJ_AGATE.CLS_CHAMPS_LIVRAISON_PRODUCTION_CLS);
    				LyFieldInfo infoCommentaire = classInfo
    						.getFieldInfo(PRJ_AGATE.FLD_COMMENTAIRE_CHAMP);
    				LyFieldInfo infoStatut = classInfo
    						.getFieldInfo(PRJ_AGATE.FLD_STATUT_CHAMP);
     
    				// Création d'un nouveau context
    				final LyContext newContext = controller.getSession()
    						.getContextManager()
    						.newContext(controller.getSession(), Type.AUTO);
     
    				final Iterator<?> iterator = context.iterator();
    				while (iterator.hasNext()) {
    					// Recupération de l'objet
    					final LyObject ligneCheckList = (LyObject) iterator.next();
     
    					// Initialisation des valeurs
    					newContext.setValue(ligneCheckList, infoCommentaire, null);
    					newContext.setValue(ligneCheckList, infoStatut, (short) 0);
     
    					final LyResponse response = newContext
    							.setObject(ligneCheckList);
    					if (response.getStatus() == Status.ERROR) {
     
    						controller.showError("ERR_SERVICE_SET_STATE");
    						lyEnv.writeException(new Throwable(
    								"[AGATE] : Une erreur est survenue lors de la mise à jour de l'objet suivant : "
    										+ ligneCheckList.getDisplayId()));
    						newContext.rollback();
    						return false;
    					}
    				}
     
    				leon.data.LyContext.Status status = newContext.commit();
    				if (status == leon.data.LyContext.Status.ERROR) {
    					controller.showError("ERR_SERVICE_SET_STATE");
    					lyEnv.writeException(new Throwable(
    							"[AGATE] : Une erreur est survenue lors de la mise à jour de l'objet suivant "
    									+ "\n Cause : "
    									+ newContext.getErrorMessage()));
    					newContext.rollback();
    					return false;
    				}
    			}
    		}
     
    		return validate;
    	}
    Ca fonctionne à merveille
    Pour une bonne résolution :
    - N'hésitez pas à donner le maximum d'informations sur vos problèmes, ca vous fera gagner du temps en évitant les aller-retours.
    - Si vous utilisez maven, pensez à rajouter votre pom !

    --> Le meilleur code est celui qui concrétise ce qui a été posé et analysé sur le papier

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

Discussions similaires

  1. Récupérer les sessions connectées à mon application DEPUIS une session
    Par touria_lahsine dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 30/05/2008, 17h33
  2. Récupérer les parametres de context.xml depuis une appli JAVA
    Par anthropo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 12/02/2008, 00h10
  3. Attaquer les méthodes d'un controle depuis une classe
    Par chti_vince dans le forum ASP.NET
    Réponses: 10
    Dernier message: 18/07/2007, 16h04
  4. Consommer les méthodes d'un controle depuis une classe
    Par chti_vince dans le forum ASP.NET
    Réponses: 8
    Dernier message: 12/07/2007, 10h22
  5. Réponses: 4
    Dernier message: 13/05/2007, 00h24

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