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
Alexandre Santos 8Alexandre Santos 8 

Triger- Before Inset and Before update ?


The code is with before insert, and I need tb before updating the code run. But when I use the Before update the code works incorrectly, it blocks everything.


trigger ReservDuplicateDate on Reserva__c (before insert) {
    
    for(Reserva__c a:Trigger.new)
    {
        List<Reserva__c> lista=new List<Reserva__c>([Select ID,Data_de_terminio__c,Data_de_inicio__c,sala__c,Orador__c from Reserva__c]);
        for(Reserva__c existentes:lista){
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
           
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
                           
            }
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
           
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

        }
    }
    
}
 
Best Answer chosen by Alexandre Santos 8
Ravi Dutt SharmaRavi Dutt Sharma
1) I have moved the query out of for loop.
2) Added a limit to the query
3) In if condition, added a check to exclude the comparison with self record
 
trigger ReservDuplicateDate on Reserva__c (before insert, before update) {
    
    List<Reserva__c> lista=new List<Reserva__c>([Select ID,Data_de_terminio__c,Data_de_inicio__c,sala__c,Orador__c from Reserva__c LIMIT 25000]);
    for(Reserva__c a:Trigger.new){
        for(Reserva__c existentes:lista){
            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
            
            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }

            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
           
            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
                           
            }
            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
           
            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

        }
    }
    
}

 

All Answers

Ajay K DubediAjay K Dubedi
Hi Alexandre,

Try the following code it may be helpful for you:
trigger ReservDuplicateDate on Reserva__c (before insert,before update) {
    
    for(Reserva__c a:Trigger.new)
    {
        List<Reserva__c> lista=new List<Reserva__c>([Select ID,Data_de_terminio__c,Data_de_inicio__c,sala__c,Orador__c from Reserva__c]);
        for(Reserva__c existentes:lista){
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
           
            if(a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
                           
            }
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
           
            if(a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

        }
    }
    
}


I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.

Thanks,
Ajay Dubedi
Ravi Dutt SharmaRavi Dutt Sharma
Can you please explain what do you mean by "it blocks everything"? 
On a side note, you should look into few points : 1) Move your query outside of the for loop. I assume you do not need to query all the records for each record you receive in the trigger.
2) Put a limit in your query. You should not try to query all the records present in the DB.
Alexandre Santos 8Alexandre Santos 8

I already tried this, the moment I use the before update the triger blocks any type of insertion
Alexandre Santos 8Alexandre Santos 8
block all = always show the error message
Ravi Dutt SharmaRavi Dutt Sharma
Ok, got you. It will always show the error message because in before update, you will get the same record thorugh Trigger.new as well as your query. In your query you should add a condition to exclude the records which are present in Trigger.new.
Ravi Dutt SharmaRavi Dutt Sharma
1) I have moved the query out of for loop.
2) Added a limit to the query
3) In if condition, added a check to exclude the comparison with self record
 
trigger ReservDuplicateDate on Reserva__c (before insert, before update) {
    
    List<Reserva__c> lista=new List<Reserva__c>([Select ID,Data_de_terminio__c,Data_de_inicio__c,sala__c,Orador__c from Reserva__c LIMIT 25000]);
    for(Reserva__c a:Trigger.new){
        for(Reserva__c existentes:lista){
            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
            
            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }

            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
            }
           
            if(a.Id != existentes.Id && a.sala__c == existentes.sala__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Reserva Ja existente na sala com a mesma data!');
                           
            }
            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c &&
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c <= existentes.Data_de_terminio__c && a.Data_de_terminio__c >= existentes.Data_de_inicio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c >= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c && a.Data_de_inicio__c <= existentes.Data_de_terminio__c) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }
           
            if(a.Id != existentes.Id && a.Orador__c == existentes.Orador__c && a.Data_de_inicio__c <= existentes.Data_de_inicio__c && 
               a.Data_de_terminio__c >= existentes.Data_de_terminio__c ) {
                a.adderror('Esse Orador ja esta em cargo de uma reserva!');
            }

        }
    }
    
}

 
This was selected as the best answer
Alexandre Santos 8Alexandre Santos 8
Thanks so much man! :D