function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Nejib EssouriNejib Essouri 

Trigger that calculates total stock

Hi everyone, I am beginner  of trigger development. I have 2 custom object 'Vente_c' & 'Tissus__c'. I would calculate the total stock of tissues after passing the sale. My code has no errors but nothing happens. Would you help me please..
trigger StockUpdateTissu on Vente__c (after delete, after insert, after update) {
    set<Id> set_Id = new set<Id>();
       
    if(trigger.isInsert || trigger.isUpdate)
    for(Vente__c v : Trigger.new)
    set_Id.add(v.Tissus__c);
    
    if(trigger.isDelete)
    for(Vente__c v : Trigger.old)
    set_Id.add(v.Tissus__c);
    
    List<Tissus__c> listTissus = new List<Tissus__c>([SELECT ID FROM Tissus__c WHERE ID IN :set_Id]);
    List<Vente__c> listVente = new List<Vente__c>([SELECT ID FROM Vente__c WHERE ID IN :set_Id]);
    
    for(Tissus__c t : listTissus ){
        t.Stock_actuel__c=500;
        
        for(Vente__c v : listVente ) 
       
        t.Stock_actuel__c -= v.Metrage_tissus_vendu__c;
     }
     update listTissus;
}

 
Best Answer chosen by Nejib Essouri
Abhishek BansalAbhishek Bansal
Hi Nejib,

There were few small mistakes in your code which have been corrected by me.
Please replace your trigger with below code :
trigger StockUpdateTissu on Vente__c (after delete, after insert, after update) {
    set<Id> set_Id = new set<Id>();
       
    if(trigger.isInsert || trigger.isUpdate){
    	for(Vente__c v : Trigger.new){
    		set_Id.add(v.Tissus__c);
    	}
    }
    
    if(trigger.isDelete){
    	for(Vente__c v : Trigger.old){
    		set_Id.add(v.Tissus__c);
    	}
    }
    
    Map<Id,Tissus__c> listTissus = new Map<Id,Tissus__c>([SELECT ID,Stock_actuel__c FROM Tissus__c WHERE ID IN :set_Id]);
    
    if(trigger.isInsert || trigger.isUpdate){
	    for(Vente__c v : trigger.new ){
	    	if(listTissus.containsKey(v.Tissus__c)){
	    		listTissus.get(v.Tissus__c).Stock_actuel__c -= v.Metrage_tissus_vendu__c;
	    	}
	    }
    }
    if(trigger.isDelete){
    	for(Vente__c v : trigger.old ){
	    	if(listTissus.containsKey(v.Tissus__c)){
	    		listTissus.get(v.Tissus__c).Stock_actuel__c -= v.Metrage_tissus_vendu__c;
	    	}
	    }
    }
    update listTissus.values();
}

Let me know if you have any issue with the above code.

Thanks,
Abhishek

All Answers

Alexander TsitsuraAlexander Tsitsura
Hi Nejib

try to use before event for trigger
before insert, before update

As a common practice, if your question is answered, please choose 1 best answer. 
But you can give every answer a thumb up if that answer is helpful to you.

Thanks,
Alex
 
Peter Friberg 26Peter Friberg 26
Since you need to take care of new, changed and deleted sales you will need to adjust Tissus accordingly.
Maybe something like this:
 
trigger StockUpdateTissu on Vente__c (after delete, after insert, after update) {
    set<Id> tissus_ids = new set<Id>();
       
    if(trigger.isInsert || trigger.isUpdate)
        for(Vente__c v : Trigger.new)
            tissus_ids.add(v.Tissus__c);
    
    if(trigger.isDelete)
        for(Vente__c v : Trigger.old)
            tissus_ids.add(v.Tissus__c);
    
    Map<Id,Tissus__c> tissus_by_id = new Map<Id,Tissus__c>([
        SELECT Id, t.Stock_actuel__c FROM Tissus__c WHERE ID IN :tissus_ids]);
    
    for(Vente__c v : listVente ) {
        Tissus__c t = tissus_by_id.get(v.Tissus__c);
        Vente__c old_vente = Trigger.oldMap.get(v.Id);
        
        if (trigger.isInsert) {
            t.Stock_actuel__c -= v.Metrage_tissus_vendu__c;
        }
        else if (trigger.isUpdate) {
            if (old_vente.Metrage_tissus_vendu__c != v.Metrage_tissus_vendu__c) {
                t.Stock_actuel__c -= (v.Metrage_tissus_vendu__c - old_vente.Metrage_tissus_vendu__c);
            }
        }
        else if (trigger.isDelete) {
            t.Stock_actuel__c += old_vente.Metrage_tissus_vendu__c;
        }
    }

    update tissus_by_id.values();
}

 
Abhishek BansalAbhishek Bansal
Hi Nejib,

There were few small mistakes in your code which have been corrected by me.
Please replace your trigger with below code :
trigger StockUpdateTissu on Vente__c (after delete, after insert, after update) {
    set<Id> set_Id = new set<Id>();
       
    if(trigger.isInsert || trigger.isUpdate){
    	for(Vente__c v : Trigger.new){
    		set_Id.add(v.Tissus__c);
    	}
    }
    
    if(trigger.isDelete){
    	for(Vente__c v : Trigger.old){
    		set_Id.add(v.Tissus__c);
    	}
    }
    
    Map<Id,Tissus__c> listTissus = new Map<Id,Tissus__c>([SELECT ID,Stock_actuel__c FROM Tissus__c WHERE ID IN :set_Id]);
    
    if(trigger.isInsert || trigger.isUpdate){
	    for(Vente__c v : trigger.new ){
	    	if(listTissus.containsKey(v.Tissus__c)){
	    		listTissus.get(v.Tissus__c).Stock_actuel__c -= v.Metrage_tissus_vendu__c;
	    	}
	    }
    }
    if(trigger.isDelete){
    	for(Vente__c v : trigger.old ){
	    	if(listTissus.containsKey(v.Tissus__c)){
	    		listTissus.get(v.Tissus__c).Stock_actuel__c -= v.Metrage_tissus_vendu__c;
	    	}
	    }
    }
    update listTissus.values();
}

Let me know if you have any issue with the above code.

Thanks,
Abhishek
This was selected as the best answer
Nejib EssouriNejib Essouri
Thank you guys :)