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

Salesforce.com Discussion :

Modification de l'objet requete via un trigger RequeteAfterUpdate


Sujet :

Salesforce.com

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Par défaut Modification de l'objet requete via un trigger RequeteAfterUpdate
    Bonjour à tous,

    Voila j'ai un petit problème (j'espère ), j'essaie de mettre à jour une donnée (de l'objet requete) lorsqu'une autre est renseigné. Pour cela je fais appelle à un trigger RequeteAfterUpdate. Je ne passe pas par un workflow car j'utilise le processus d'autorisation. En fait lorsque je ferme un jalon (appelé T2) et que je renseigne la date CompletionDate (dans l'objet CaseMilestone) je veux que ça mette à jour une donnée (j'insère cette même date dans un champ date de l'objet requête).

    J'ai finis le code mais je rencontre un problème, le message d'erreur est le suivant:

    Erreur :Le déclencheur Apex CaseAfterUpdate a provoqué une exception inattendue. Contactez l'administrateur : CaseAfterUpdate: System.LimitException: Too many SOQL queries: 101

    Le code du trigger:

    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
    //----------------------------------------------------------------------------------------
    	// —	mettre à jour la date de proposition commerciale lorsque Avancee_Jalon_TEC__c == '2'
    	//----------------------------------------------------------------------------------------  
    	
    	if(PAD.canTrigger('AP15')){
    		System.debug('###################### -> AP15QSD');
    		List<Case> lstCaseDateUpdate = new List<Case>();
    		
    		for(integer i=0;i<Trigger.new.size();i++){
    			//Trigger.new[i].Date_proposition_financement__c != null && 
    			if(Trigger.new[i].Avancee_Jalon_TEC__c == '2')
      				lstCaseDateUpdate.add(Trigger.new[i]);
    		}
    		
    		System.debug('###################### -> AP1544 ' + lstCaseDateUpdate);
    		
    		
    		
    		if(lstCaseDateUpdate.size() > 0)
    		{
    		AP15CaseMajDate.setDatePropositionCommerciale(lstCaseDateUpdate);
    		}
    	}
    Voila code appelé:

    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
    
    public without sharing class AP15CaseMajDate{
    	
    	public static void setDatePropositionCommerciale  (List<Case> lstCase){
    		
    		System.debug('###################### -> AP15CaseMajDate.setDatePropositionCommerciale - BEGIN -');
    		
    	   	set<Id> setIdCaseUpdate = new set<Id>();
    		
    		 for(Case cCase: lstCase)
    		 {
    		 	setIdCaseUpdate.add(cCase.Id);
    		 }
    	 
    	 		System.debug('###################### -> AP15CaseMajDate.setDatePropositionCommerciale setIdCaseUpdate - BEGIN -' + setIdCaseUpdate);
    		    //List récupérant la date de la fermeture du jalon T2 CompletionDate de la table CaseMilestone) 
        	    List<CaseMilestone> lstCaseMilestone = [Select MilestoneTypeId, Id, CompletionDate, CaseId From CaseMilestone WHERE CaseId IN :setIdCaseUpdate  AND MilestoneTypeId IN (:System.Label.Case_MilestoneTypeId_T2_ContactReseauPhysique, :System.Label.Case_MilestoneTypeId_T2_DossierReseauPhysique_DossierReseauPlateau)];
    			System.debug('###################### -> AP15CaseMajDate.setDatePropositionCommerciale setIdCaseUpdate - BEGIN qsd-' + lstCaseMilestone);
    		
    			Map<Id, DateTime> mapIdCaseDateT2 = new Map<Id, DateTime>();
    
    			for(CaseMilestone m: lstCaseMilestone)
    			{
    				if(m.CompletionDate != null)
    				{
    					mapIdCaseDateT2.put(m.CaseId, m.CompletionDate);
    					System.debug('###################### -> mapIdCaseDateT2 m.CaseId' + m.CaseId);
    					System.debug('###################### -> mapIdCaseDateT2  m.CompletionDate' +  m.CompletionDate);
    				}
    			}
    			
    			
    			List<Case> lstCaseRecup = [SELECT Id, Date_proposition_financement__c FROM Case WHERE Id IN :setIdCaseUpdate];
    		        
    			List<Case> lstUpdateCase = new List<Case>();
    			
    			for(Case a: lstCaseRecup)
    			{
    				if(mapIdCaseDateT2.containskey(a.Id))
    				{
    				    //mettre la date CompletionDate dans la date de proposition commerciale
    	       		    //CompletionDate est de type dateTime et Date_proposition_financement__c est de type Date
    	       			//utilisation de Date.newinstance pour pour avoir le bon format
    					DateTime datePropCommerciale = mapIdCaseDateT2.get(a.Id);
    					Date DtePropComm = Date.newinstance(datePropCommerciale.year(), datePropCommerciale.month(), datePropCommerciale.day());
    					a.Date_proposition_financement__c = DtePropComm;
    					//a.Date_proposition_financement__c = null;
    					System.debug('###################### -> DtePropComm' + DtePropComm);
    					lstUpdateCase.add(a);
    					System.debug('###################### -> lstUpdateCaseqsdd d' + lstUpdateCase);
    				}
    				
    			}
    			
    			System.debug('###################### -> lstUpdateCasesdsdaz' + lstUpdateCase);
    	        if(lstUpdateCase.size() > 0)
    			{
    			update lstUpdateCase;
    			}
    			
    
    	        System.debug('###################### -> AP15CaseMajDate.setDatePropositionCommerciale - END');
    	
    	
    	}
    }
    J'ai cherché mais pas moyen de trouver.

    Pouvez-vous m'aider s'il vous plait?

    Merci beaucoup.


    Si ça peut aider:

    Nom : Capture.JPG
Affichages : 323
Taille : 66,0 Ko

  2. #2
    Membre confirmé
    Homme Profil pro
    Salesforce Developer
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Salesforce Developer

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Par défaut
    Je ne vois pas trop dans ton code ou est l'erreur exact, pourrais tu detailler un peu plus ton trigger?
    Mais en gros l'erreur que tu as c'est quand tu as une requete SQL dans une boucle.

    Stupide Example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Account acct: Trigger.new){
           List<Contact> contacts = [select id from Contact where AccountId = :acct.Id];
    }
    Si tu as 150 Accounts, tu aura donc 150 requetes SQL. Salesforce limite le nombre a 100 par transaction.
    Tu dois absolument enlever tes requests SQL de tes boucles et passer par l'utlisation de map.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Par défaut
    Merci pour ta réponse brovasi.
    Et bien en fait lorsque je mets le journal de débogage dans salesforce.
    Même le trigger est appelé plusieurs fois. Donc je me dis que le Update (l.58: update lstUpdateCase) rappelle le trigger.

    Est ce que le problème ne viendrait pas de ma condition dans le trigger!?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			if(Trigger.new[i].Avancee_Jalon_TEC__c == '2')
      				lstCaseDateUpdate.add(Trigger.new[i]);
    		}
    Une fois que je fais l'update, Avancee_Jalon_TEC__c est toujours = '2' du coup ça re rentre dans la condition et sa appel à nouveau le update...


    Merci beaucoup pour ton aide. (je test de mon côté).

    ps:J'ai testé mes requêtes elle retourne qu'une ligne

  4. #4
    Membre confirmé
    Homme Profil pro
    Salesforce Developer
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Salesforce Developer

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Par défaut
    Ha ok, je vois c'est quoi ton probleme. Donc tu es dans ton trigger case et tu veux modifier un champs du meme objet. Verifie que tu appelles bien "before update" et non "after update".Ensuite tu n'auras pas besoin de update ta list de Case a nouveau. Voici un simple example :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    trigger CaseTrigger on Case (before update){
    	for(Case record: Trigger.new){
    		if (record.Avancee_Jalon_TEC__c == '2'){
    			record.Description = 'Ceci est appele before update pcq mon avancee jalon tec = 2';
    		}
    	}
    }
    Donc les lignes suivantes te sont inutiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    System.debug('###################### -> lstUpdateCasesdsdaz' + lstUpdateCase);
    if(lstUpdateCase.size() > 0)
    {
    	update lstUpdateCase;
    }

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    177
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 177
    Par défaut
    J'appel CaseAfterUpdate mais c'est fait exprès car je dois récupérer la valeur CompletionDate de l'objet CaseMilestone pour l'insérer dans un champ de l'objet Case par la suite. Et je pense que la valeur CompletionDate de l'objet CaseMilestone est renseigné qu'une fois enregistrée, c'est pour ça que je fais appel à un after update.

    Tu vois?

  6. #6
    Membre confirmé
    Homme Profil pro
    Salesforce Developer
    Inscrit en
    Mai 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Salesforce Developer

    Informations forums :
    Inscription : Mai 2013
    Messages : 14
    Par défaut
    Je pense qu'un before update serait plus utile. Sinon je pense que dans ton trigger tu devrais faire qqch comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for(integer i=0;i<Trigger.new.size();i++){
    			//Trigger.new[i].Date_proposition_financement__c != null && 
    			if(Trigger.new[i].Avancee_Jalon_TEC__c == '2' 
    				&& Trigger.oldMap.get(Trigger.new[i].id).Avancee_Jalon_TEC__c != '2')
      				lstCaseDateUpdate.add(Trigger.new[i]);
    		}
    Ceci veut dire que tu appelle le reste de ton code seulement si la valeur de 'Avancee_Jalon_TEC__c' passe de n'importe qu'elle valeur a 2

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

Discussions similaires

  1. Modification de l'objet request via plugin
    Par Nighty dans le forum MVC
    Réponses: 3
    Dernier message: 09/12/2008, 17h56
  2. requete via VBA sur different schema oracle
    Par FO dans le forum Access
    Réponses: 3
    Dernier message: 19/01/2006, 15h40
  3. Réponses: 2
    Dernier message: 24/11/2005, 11h46
  4. Requete via phpmyadmin
    Par louroulou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/11/2005, 22h36
  5. Pb d'envoi de requete via un TADOQuery à une BD access
    Par gsmurf dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/06/2004, 13h20

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