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
Guru Vemuru 1Guru Vemuru 1 

How to write trigger for unrelated Objects to update records?

Hi Every one,
I want to write a trigger to update record for unrelated object. So that i written one trigger it showing error can any one help me out.

trigger populateExpenseFromUser on Expense__c (before insert , before update)
{
    
    Set<ID> setExpIds = new Set<ID>();
    for(Expense__c exp : trigger.new){
        if(exp.Claim_Purpose__c!= null)
        setExpIds.add(exp.Claim_Purpose__c);
    }
    
     MAP<ID , User> mapExp = new MAP<ID , User>([Select Id,Branch__c,Department__c,Designation__c from user where id in: setExpIds]);
     for(Expense__c exp : trigger.new)
       {
        if(exp.Claim_Purpose__c != null)
          {
            User tr = mapExp.get(exp.Claim_Purpose__c);
            exp.Branch__c= tr.Branch__c;
            exp.Department__c= tr.Department__c;
            exp.Designation__c=tr.Designation__c;
          //  update exp;
            
          }
       
       }
Best Answer chosen by Guru Vemuru 1
AvaneeshAvaneesh
Hi Guru 

finally , i make it 
trigger ExpenseExampletrigger on Expense__c (before insert) {
    
 Map<id,User> currentUserList = new map<id,user>([select id,Department__c,Branch__c,Designation__c from User where id =: UserInfo.getUserId()]);
    System.debug('user'+currentUserList);
    for(Expense__c ex:trigger.new){
        ex.Branch__c = currentUserList.get(ex.OwnerId).Branch__c;
        ex.Department__c= currentUserList.get(ex.OwnerId).Department__c;
        ex.Designation__c = currentUserList.get(ex.OwnerId).Designation__c;
    }    
}
if this code is helpful please like it and let me know ....

Thank you
Avaneesh Singh​

All Answers

AvaneeshAvaneesh
Hii 

What is your error please put that and let me know
1- Claim_Purpose__c  is this field have id of User
and in which line did you get error 

 
Sukanya BanekarSukanya Banekar
Hi, 
The code is correct. You don't need to write update operation I could see that it is commented. So this code should work fine. Please post the error you are getting.

Thanks,
Sukanya Banekar

 
Guru Vemuru 1Guru Vemuru 1
Hi Avaneesh,
It is not showing any error, but while saving record in expense it is not gets  saved.

I want to Fetch current id and then i can display data in expense.
AvaneeshAvaneesh
Hi 
May be in your org data are satisfied your trigger use debug 
trigger populateExpenseFromUser on Expense__c (before insert , before update)
{
    
    Set<ID> setExpIds = new Set<ID>();
    for(Expense__c exp : trigger.new){
        if(exp.Claim_Purpose__c!= null)
        setExpIds.add(exp.Claim_Purpose__c);
    }
    System.debug('setExpIds====>>>'+setExpIds);
     MAP<ID , User> mapExp = new MAP<ID , User>([Select Id,Branch__c,Department__c,Designation__c from user where id in: setExpIds]);
System.debug('mapExp =====>>>>'+mapExp );
     for(Expense__c exp : trigger.new)
       {
        if(exp.Claim_Purpose__c != null)
          {
            User tr = mapExp.get(exp.Claim_Purpose__c);
            System.debug('User =====>>>'+tr);
            exp.Branch__c= tr.Branch__c;
            exp.Department__c= tr.Department__c;
            exp.Designation__c=tr.Designation__c;
          //  update exp;
            
          }
       
       }
}

use these three debug in you code I put there and let me know in which line you are not getting value ??
Guru Vemuru 1Guru Vemuru 1
Hi Avaneesh,
  There is no errors after debug also.I Guess trigger not able fetch current user Id.

Can you please refer my code according with my requirement.
1. I am using Expense custom object and User Standard Object.
2. In User Object there are three fields like Branch__c,Department__c,Designation__c.
3.I given Lookup relation from Expense to User.
4. When He select User Name in Expense then it has search data in User like User__c== User Name.
5. Then it has to fetch the data from User Standard Obect.


Here It is my updated Code:

trigger populateExpenseFromUser on Expense__c (before insert , before update)
{
    
    Set<ID> setExpIds = new Set<ID>();
    for(Expense__c exp : trigger.new){
        if(exp.User__c!= null)
        setExpIds.add(exp.User__c);
    }
    
     MAP<ID , User> mapExp = new MAP<ID , User>([Select Id,Branch__c,Department__c,Designation__c from user where id in: setExpIds]);

     for(Expense__c exp : trigger.new)
       {
        if(exp.User__c != null)
          {
            User tr = mapExp.get(exp.User__c);
            
            exp.Branch__c= tr.Branch__c;
            exp.Department__c= tr.Department__c;
            exp.Designation__c=tr.Designation__c;
          //  update exp;
            
          }
       
       }
}


 
AvaneeshAvaneesh
okay 
just give me few minute's
 
AvaneeshAvaneesh
Hi Guru
Here is your trigger first we need to write this trigger in after insert not before because in before insert we don't have id to Query
in this trigger, in Expense__c object, I create a lookup field of the user name as a user
trigger ExpenseExampletrigger on Expense__c (after insert) {

    set<id> allrelatedset = new set<id>();
    List<expense__c> allExpense = new list<expense__c>();
    for(expense__c e:trigger.new){
        if(e.User__c !=NULL){
         allrelatedset.add(e.Id);   
        }
    }
    
    for(Expense__c e:[select id,name,user__r.Branch__c,user__r.Department__c,user__r.Designation__c 
                           from Expense__c where id IN : allrelatedset]){
        
               Expense__c exp = new Expense__c();
               exp.Id = e.Id;
               exp.Branch__c=e.User__r.Branch__c ;
               exp.Department__c = e.User__r.Department__c ;
               exp.Designation__c = e.User__r.Designation__c ;
               allExpense.add(exp);                
                               
    }
    
    if(allExpense.size()>0){
        update allExpense;
    }
    
}
if this was helpful please mark as best answer else let me know 

Thank you
Avaneesh Singh

 
Guru Vemuru 1Guru Vemuru 1
Thank You Avaneesh,
I Want some more help extends to this one.
1. Now we selecting User from lookup field. can we do with out selecting user.
2. That is the user who is login automatically populate in that lookup Field.
AvaneeshAvaneesh
Hii
hmmm......ok let me try
AvaneeshAvaneesh
Hi Guru 

finally , i make it 
trigger ExpenseExampletrigger on Expense__c (before insert) {
    
 Map<id,User> currentUserList = new map<id,user>([select id,Department__c,Branch__c,Designation__c from User where id =: UserInfo.getUserId()]);
    System.debug('user'+currentUserList);
    for(Expense__c ex:trigger.new){
        ex.Branch__c = currentUserList.get(ex.OwnerId).Branch__c;
        ex.Department__c= currentUserList.get(ex.OwnerId).Department__c;
        ex.Designation__c = currentUserList.get(ex.OwnerId).Designation__c;
    }    
}
if this code is helpful please like it and let me know ....

Thank you
Avaneesh Singh​
This was selected as the best answer