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
Dave The RaveDave The Rave 

Apex Trigger compare two date fields and change field value

After a record is created, I would like to update several number fields based the the date value on fields from 2 different objects. I tried this in the process builder but it did not work.

Attached is an image with object & field names, the list is also at the end of this message. In the Schema Builder the Master-Detail relationship is Meeting__c to RegistrationLayer__c and a Lookup Relationship Meeting__c to RegistrationLayer__c.

After a record on the Meeting__c object is created a process needs to be initiated to update the value of PointsYR1__c, PointsYR2 etc.. (on the RegistrationLayer__c  object) with Points__c (on the Meeting__c object). The YEAR on the two date fields of the two objects much match in order for PointsYR1__c etc.. to be updated.

The logic should be:

IF YEAR(datemeeting__c) = YEAR(certregfrom__c) AND freepoints__c =TRUE THEN  PointsYR1__c = (PointsYR1__c + Points__c)
IF YEAR(datemeeting__c) = YEAR(certregfrom__c +1 ) AND freepoints__c =TRUE THEN  PointsYR2__c = (PointsYR2__c + Points__c)
IF YEAR(datemeeting__c) = YEAR(certregfrom__c +2 )  AND freepoints__c =TRUETHEN  PointsYR3__c = (PointsYR3__c + Points__c)
IF YEAR(datemeeting__c) = YEAR(certregfrom__c +3)  AND freepoints__c =TRUETHEN  PointsYR4__c = (PointsYR4__c + Points__c)
IF YEAR(datemeeting__c) = YEAR(certregfrom__c +4) AND freepoints__c =TRUE THEN  PointsYR5__c = (PointsYR5__c + Points__c)
IF YEAR(datemeeting__c) = YEAR(certregfrom__c +5) AND freepoints__c =TRUE THEN  PointsYR6__c = (PointsYR6__c + Points__c)


Fieldname Field Type
Meeting__c (Object)
Points__c 
datemeeting__c 
freepoints__c

Registration__c (object)
CertRegFrom__c
 PointsYR1__c
 PointsYR2__c
 PointsYR3__c
 PointsYR4__c
 PointsYR5__c
 PointsYR6__c



 
Best Answer chosen by Dave The Rave
Matheus Sales FerreiraMatheus Sales Ferreira
Hi there,

Try this:
 
Trigger TrgOnMeeting on Meeting__c (before insert, before Update){
    if(Trigger.isInsert || Trigger.isUpdate) {
        Set<Id> regIds = new Set<Id>();
        
        for(Account meeting : Trigger.new) {
            if(meeting.RegistrationLayer__c != null)
                regIds.add(meeting.RegistrationLayer__c);
        }
        
        Map<Id, RegistrationLayer__c> mapReg = new Map<Id, RegistrationLayer__c>([SELECT Id, CertRegFrom__c, PointsYR1__c, PointsYR2__c, PointsYR3__c, PointsYR4__c, PointsYR5__c, PointsYR6__c
                                                                                  FROM RegistrationLayer__c WHERE Id IN: regIds]);
        
        for(Account meeting : Trigger.new) {
            
            if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year()) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR1__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 1) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR2__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 2) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR3__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 3) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR4__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 4) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR5__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 5) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR6__c += meeting.Points__c;
            }
        }
        
        update mapReg.values();
    }
}

 

All Answers

Matheus Sales FerreiraMatheus Sales Ferreira
Hi there,

Try this:
 
Trigger TrgOnMeeting on Meeting__c (before insert, before Update){
    if(Trigger.isInsert || Trigger.isUpdate) {
        Set<Id> regIds = new Set<Id>();
        
        for(Account meeting : Trigger.new) {
            if(meeting.RegistrationLayer__c != null)
                regIds.add(meeting.RegistrationLayer__c);
        }
        
        Map<Id, RegistrationLayer__c> mapReg = new Map<Id, RegistrationLayer__c>([SELECT Id, CertRegFrom__c, PointsYR1__c, PointsYR2__c, PointsYR3__c, PointsYR4__c, PointsYR5__c, PointsYR6__c
                                                                                  FROM RegistrationLayer__c WHERE Id IN: regIds]);
        
        for(Account meeting : Trigger.new) {
            
            if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year()) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR1__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 1) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR2__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 2) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR3__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 3) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR4__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 4) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR5__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.RegistrationLayer__c).CertRegFrom__c.Year() + 5) && meeting.freepoints__c) {
                mapReg.get(meeting.RegistrationLayer__c).PointsYR6__c += meeting.Points__c;
            }
        }
        
        update mapReg.values();
    }
}

 
This was selected as the best answer
Dave The RaveDave The Rave
Hi Matheus,

Finally, I get around to implementing your code in our Sandbox Org.

Unfortunately, I am getting 85 errors before I run this code.

This is what did exactly, I cut and paste you code into Excel and then changed the field and object names. I made no other changes.
Then I copied the code and pasted it back into the developer console. 

I receive the error below for every line of the code.

"Invalid identifier ''. Apex identifiers must start with an ASCII letter (a-z or A-Z) followed by any number of ASCII letters (a-z or A-Z), digits (0 - 9), '$', '_'."

Do you have any idea what the error is?
 
Trigger TrgOnMeeting on Meeting__c (before insert, before Update){
    if(Trigger.isInsert || Trigger.isUpdate) {
        Set<Id> regIds = new Set<Id>();
         
        for(Account meeting : Trigger.new) {
            if(meeting.Registration_Layer__c != null)
                regIds.add(meeting.Registration_Layer__c);
        }
         
        Map<Id, Registration_Layer__c> mapReg = new Map<Id, Registration_Layer__c>([SELECT Id, CertRegFrom__c, ObligatoryPointsObtainedYr1__c, ObligatoryPointsObtainedYr2__c, ObligatoryPointsObtainedYr3__c, ObligatoryPointsObtainedYr4__c, ObligatoryPointsObtainedYr5__c, ObligatoryPointsObtainedYr6__c
                                                                                  FROMRegistration_Layer__c WHERE Id IN: regIds]);
         
        for(Account meeting : Trigger.new) {
             
            if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.Registration_Layer__c).CertRegFrom__c.Year()) && meeting.freepoints__c) {
                mapReg.get(meeting.Registration_Layer__c).ObligatoryPointsObtainedYr1__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.Registration_Layer__c).CertRegFrom__c.Year() + 1) && meeting.freepoints__c) {
                mapReg.get(meeting.Registration_Layer__c).ObligatoryPointsObtainedYr2__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.Registration_Layer__c).CertRegFrom__c.Year() + 2) && meeting.freepoints__c) {
                mapReg.get(meeting.Registration_Layer__c).ObligatoryPointsObtainedYr3__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.Registration_Layer__c).CertRegFrom__c.Year() + 3) && meeting.freepoints__c) {
                mapReg.get(meeting.Registration_Layer__c).ObligatoryPointsObtainedYr4__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.Registration_Layer__c).CertRegFrom__c.Year() + 4) && meeting.freepoints__c) {
                mapReg.get(meeting.Registration_Layer__c).ObligatoryPointsObtainedYr5__c += meeting.Points__c;
            } else if(meeting.datemeeting__c.Year() == (mapReg.get(meeting.Registration_Layer__c).CertRegFrom__c.Year() + 5) && meeting.freepoints__c) {
                mapReg.get(meeting.Registration_Layer__c).ObligatoryPointsObtainedYr6__c += meeting.Points__c;
            }
        }
         
        update mapReg.values();
    }
}

 
Dave The RaveDave The Rave
I solved this issue, by actually pasting the above code back into the dev console. I think this was just a cut and paste issue and somehow invisble characters were added to the code.

However, I have 38 errors still in the above code. I am going top create a new question for this.