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
Vignesh RamshettyVignesh Ramshetty 

Below is screenshort of error im getting unable to insert

Whenever the record inserted need to insert another record with same data


trigger opprunitybeforeandafter on Opportunity (Before insert, after insert){

if(trigger.isbefore == true && trigger.isinsert == true){

         oppurinityamountclass.makefunction(trigger.new);
}
if(trigger.isafter == true && trigger.isinsert == true){

           oppurinityamountclass.makefunction2(trigger.new,trigger.oldMap);
}
}User-added image









Public class oppurinityamountclass{
    
    Public static void makefunction(list<Opportunity> varocc){
        
        for(Opportunity varo : varocc){
            if (varo.Amount >= 50000){
                varo.Amount = varo.Amount/2;
            }
        }
    }
    
    
    Public static void makefunction2(list<Opportunity> varocd,map<id,Opportunity> varold){
        
        
        List<Opportunity> varins = new List<Opportunity>();
        
        for (Opportunity opp : varocd ){
            
            
            
         
            
            opp.Name = varold.get(opp.id).Name;
            opp.CloseDate = varold.get(opp.id).CloseDate;
            opp.StageName = varold.get(opp.id).StageName;
            
            varins.add(opp);
        }
        insert varins;
    }
}
Best Answer chosen by Vignesh Ramshetty
Sai PraveenSai Praveen (Salesforce Developers) 
Hi Vignesh,

Can you try the below trigger and handler.

Trigger:
trigger opprunitybeforeandafter on Opportunity (Before insert, after insert){

    
if(trigger.isbefore  && trigger.isinsert && oppurinityamountclass.isFirstTime){
oppurinityamountclass.isFirstTime=false;
         oppurinityamountclass.makefunction(trigger.new);
}
}

Handler:
Public class oppurinityamountclass{
         public static Boolean isFirstTime = true;

    Public static void makefunction(list<Opportunity> varocc){
        List<Opportunity> varins = new List<Opportunity>();
        for(Opportunity varo : varocc){
            if (varo.Amount >= 50000){
                varo.Amount = varo.Amount/2;
                opportunity newopp= new opportunity();
                newopp.name=varo.name;
                newopp.StageName=varo.StageName;
                newopp.Amount= varo.Amount;
                newopp.CloseDate=varo.CloseDate;
                varins.add(newopp); 
                
            }
        }
        if(varins.size()>0)
        insert varins;
        
    }
}

Let me know if you face any issues.

If this solution helps, Please mark it as best answer.

Thanks,

All Answers

Sai PraveenSai Praveen (Salesforce Developers) 
Hi Vignesh,

Can you share the error message more clearly. It is Blured out.

Also can you confirm what functionality you are trying to achieve in this trigger?

Thanks,
 
Vignesh RamshettyVignesh Ramshetty
Below is the error iam  geeting

opprunitybeforeandafter: execution of AfterInsert caused by: System.NullPointerException: Attempt to de-reference a null object Class.oppurinityamountclass.makefunction2: line 22, column 1 Trigger.opprunitybeforeandafter: line 9, column 1


Below is the Code:
trigger opprunitybeforeandafter on Opportunity (Before insert, after insert){

if(trigger.isbefore == true && trigger.isinsert == true){

         oppurinityamountclass.makefunction(trigger.new);
}
if(trigger.isafter == true && trigger.isinsert == true){

           oppurinityamountclass.makefunction2(trigger.new,trigger.oldMap);
}



Public class oppurinityamountclass{
    
    Public static void makefunction(list<Opportunity> varocc){
        
        for(Opportunity varo : varocc){
            if (varo.Amount >= 50000){
                varo.Amount = varo.Amount/2;
            }
        }
    }
    
    
    Public static void makefunction2(list<Opportunity> varocd,map<id,Opportunity> varold){
        
        
        List<Opportunity> varins = new List<Opportunity>();
        
        for (Opportunity opp : varocd ){
            
            
            
                   opp.Amount = varold.get(opp.id).Amount == null ?0 : varold.get(opp.id).Amount;
            
            opp.Name = varold.get(opp.id).Name;
            opp.CloseDate = varold.get(opp.id).CloseDate;
            opp.StageName = varold.get(opp.id).StageName;
            
            varins.add(opp);
        }
        insert varins;
    }
}
Sai PraveenSai Praveen (Salesforce Developers) 
Hi Vignesh,

Thanks for sharing the error. What functionality you are trying to achieve with this triger.

The main issue in the trigger is Trigger.oldmap will be always null in insert mode. You have to use Trigger.newmap.

Also as per the code i see you are trying to update same opporunity in afterinsert. In after context the record will be in readonly mode so it fails to save it. If any modification you perform on same record should be in before context only.

Thanks,
 
Vignesh RamshettyVignesh Ramshetty
Can you share correct Code
Sai PraveenSai Praveen (Salesforce Developers) 
Hi Vignesh,

Can you let me know what excatly is the requirement so i can share the code for it,

Thanks,
 
Vignesh RamshettyVignesh Ramshetty
User-added image
Vignesh RamshettyVignesh Ramshetty
[image: User-added image]
Sai PraveenSai Praveen (Salesforce Developers) 
Hi Vignesh,

Can you try the below trigger and handler.

Trigger:
trigger opprunitybeforeandafter on Opportunity (Before insert, after insert){

    
if(trigger.isbefore  && trigger.isinsert && oppurinityamountclass.isFirstTime){
oppurinityamountclass.isFirstTime=false;
         oppurinityamountclass.makefunction(trigger.new);
}
}

Handler:
Public class oppurinityamountclass{
         public static Boolean isFirstTime = true;

    Public static void makefunction(list<Opportunity> varocc){
        List<Opportunity> varins = new List<Opportunity>();
        for(Opportunity varo : varocc){
            if (varo.Amount >= 50000){
                varo.Amount = varo.Amount/2;
                opportunity newopp= new opportunity();
                newopp.name=varo.name;
                newopp.StageName=varo.StageName;
                newopp.Amount= varo.Amount;
                newopp.CloseDate=varo.CloseDate;
                varins.add(newopp); 
                
            }
        }
        if(varins.size()>0)
        insert varins;
        
    }
}

Let me know if you face any issues.

If this solution helps, Please mark it as best answer.

Thanks,
This was selected as the best answer