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
Gopal ChatGopal Chat 

In my trigger Account have two child (GF_Order_Summary__c,GF_Outlet__c),GF_Outlet__c have a child GF_Outlet_Monthly_Order_Summary__c ,on the basis of transction year,transction months i want to bulkify my trigger

if GF_Order_Summary__c have matching recod(yr,month) then update the matching recod else ceate the new recod.below my code

thanks in advance.

Trigger UpdateOutletMOrderSummaryToAccmOrders on GF_Outlet_Monthly_Order_Summary__c (after insert,after Update,before delete){
    Map<Id,String> AccIdMap=new Map<Id,String>();
    Map<Id,GF_Order_Summary__c> AccToOrdSumMap=new Map<Id,GF_Order_Summary__c>();
    List<GF_Order_Summary__c> updateOrdSumList = new List<GF_Order_Summary__c>();
    List<GF_Order_Summary__c> listAccountMonOrder = new List<GF_Order_Summary__c>();
    List<GF_Order_Summary__c> deleteOrdSumList = new List<GF_Order_Summary__c>();
    if(trigger.isInsert || trigger.isUpdate){
        List<GF_Outlet_Monthly_Order_Summary__c> OrdSumList = [Select Id,Name,GF_Total_No_of_Orders__c,CurrencyIsoCode,GF_Total_Revenue__c,
                                                               GF_Transaction_Month__c,GF_Transaction_Year__c,GF_Outlet__r.GFID_Account__c 
                                                               from GF_Outlet_Monthly_Order_Summary__c 
                                                               where  GF_Outlet__r.GFID_Account__c!=NULL AND Id IN :Trigger.new];
        system.debug('===>OrdSumList'+OrdSumList);
        if(OrdSumList.size()>0){
            for(GF_Outlet_Monthly_Order_Summary__c outMonSum : OrdSumList){
                AccIdMap.put(outMonSum.GF_Outlet__r.GFID_Account__c,null);
                AccToOrdSumMap.put(outMonSum.GF_Outlet__r.GFID_Account__c,null);
            }
        }
        if(AccIdMap.keySet().size() > 0){
            for(GF_Order_Summary__c ordSum : [SELECT Id,Name,GF_Total_No_of_Orders__c,GF_Total_Revenue__c,GF_Transaction_Year__c,GF_Transaction_Month__c,GF_Account__c FROM GF_Order_Summary__c WHERE  GF_Account__c IN :AccIdMap.keySet()]){
                AccIdMap.put(ordSum.GF_Account__c,String.valueOf(ordSum.GF_Transaction_Month__c +'@@'+ordSum.GF_Transaction_Year__c));
                system.debug('===>ragh'+ordSum);
                AccToOrdSumMap.put(ordSum.GF_Account__c,ordSum);
                
                System.debug('AccIdMap>>>>>>'+AccIdMap);
                System.debug('AccToOrdSumMap>>>>>>'+AccToOrdSumMap);
                
            }
            
            for(GF_Outlet_Monthly_Order_Summary__c outMontOrdSum : OrdSumList){
                system.debug('-->'+AccIdMap.get(outMontOrdSum.GF_Outlet__r.GFID_Account__c));
                system.debug('-->'+ String.valueOf(outMontOrdSum.GF_Transaction_Month__c+'@@'+outMontOrdSum.GF_Transaction_Year__c));
                
                if(AccToOrdSumMap.containsKey(outMontOrdSum.GF_Outlet__r.GFID_Account__c) &&
                   AccIdMap.containsKey(outMontOrdSum.GF_Outlet__r.GFID_Account__c) && 
                   String.valueOf(outMontOrdSum.GF_Transaction_Month__c+'@@'+outMontOrdSum.GF_Transaction_Year__c) == 
                   AccIdMap.get(outMontOrdSum.GF_Outlet__r.GFID_Account__c)){
                       GF_Order_Summary__c orsu=new GF_Order_Summary__c();
                       orsu = AccToOrdSumMap.get(outMontOrdSum.GF_Outlet__r.GFID_Account__c);
                       orsu.GF_Total_Revenue__c +=outMontOrdSum.GF_Total_Revenue__c;
                       orsu.GF_Total_No_of_Orders__c += outMontOrdSum.GF_Total_No_of_Orders__c;
                       updateOrdSumList.add(orsu); 
                       System.debug('>>>>>updateOrdSumList '+updateOrdSumList);
                   }
                else{
                    GF_Order_Summary__c orsu=new GF_Order_Summary__c();
                    orsu.CurrencyIsoCode=outMontOrdSum.CurrencyIsoCode ;
                    orsu.GF_Total_Revenue__c=outMontOrdSum.GF_Total_Revenue__c!=null?outMontOrdSum.GF_Total_Revenue__c:0;
                    orsu.GF_Total_No_of_Orders__c = outMontOrdSum.GF_Total_No_of_Orders__c!=null?outMontOrdSum.GF_Total_No_of_Orders__c:0;
                    orsu.GF_Transaction_Month__c=outMontOrdSum.GF_Transaction_Month__c!=null?outMontOrdSum.GF_Transaction_Month__c:'';
                    orsu.GF_Transaction_Year__c=outMontOrdSum.GF_Transaction_Year__c!=null?outMontOrdSum.GF_Transaction_Year__c:'';
                    orsu.GF_Account__c=outMontOrdSum.GF_Outlet__r.GFID_Account__c;
                    listAccountMonOrder.add(orsu);
                }
            }
        }
    }
    
    if(trigger.isDelete){
        List<GF_Outlet_Monthly_Order_Summary__c> OrdSumList = [Select Id,Name,GF_Total_No_of_Orders__c,CurrencyIsoCode,GF_Total_Revenue__c,
                                                               GF_Outlet__r.GFID_Account__c,GF_Transaction_Month__c,GF_Transaction_Year__c
                                                               from GF_Outlet_Monthly_Order_Summary__c 
                                                               where GF_Outlet__r.GFID_Account__c !=NULL AND Id IN :Trigger.old]; 
        system.debug('===>'+OrdSumList);
        if(OrdSumList.size()>0){
            for(GF_Outlet_Monthly_Order_Summary__c outMonSum : OrdSumList) {
                AccIdMap.put(outMonSum.GF_Outlet__r.GFID_Account__c,null);
                AccToOrdSumMap.put(outMonSum.GF_Outlet__r.GFID_Account__c,null);
            }
        }
        if(AccIdMap.keySet().size() > 0){
            for(GF_Order_Summary__c ordSum : [SELECT Id,Name,GF_Total_No_of_Orders__c,GF_Total_Revenue__c,GF_Transaction_Year__c,
                                              GF_Transaction_Month__c,GF_Account__c 
                                              FROM GF_Order_Summary__c 
                                              WHERE  GF_Account__c IN :AccIdMap.keySet()]){
                                                  AccIdMap.put(ordSum.GF_Account__c,String.valueOf(ordSum.GF_Transaction_Month__c +'@@'+ordSum.GF_Transaction_Year__c));
                                                  AccToOrdSumMap.put(ordSum.GF_Account__c,ordSum);
                                                  System.debug('AccIdMap>>>>>>'+AccIdMap);
                                                  System.debug('AccToOrdSumMap>>>>>>'+AccToOrdSumMap);
                                                  system.debug('===>'+ordSum);
                                              }
            
            for(GF_Outlet_Monthly_Order_Summary__c outMontOrdSum : OrdSumList){
                system.debug('-->'+AccIdMap.get(outMontOrdSum.GF_Outlet__r.GFID_Account__c));
                system.debug('-->'+ String.valueOf(outMontOrdSum.GF_Transaction_Month__c+'@@'+outMontOrdSum.GF_Transaction_Year__c));
                
                if(AccToOrdSumMap.containsKey(outMontOrdSum.GF_Outlet__r.GFID_Account__c) &&
                   AccIdMap.containsKey(outMontOrdSum.GF_Outlet__r.GFID_Account__c) && 
                   String.valueOf(outMontOrdSum.GF_Transaction_Month__c+'@@'+outMontOrdSum.GF_Transaction_Year__c) == 
                   AccIdMap.get(outMontOrdSum.GF_Outlet__r.GFID_Account__c)){
                       system.debug('--->Raghav');
                       GF_Order_Summary__c orsu=new GF_Order_Summary__c();
                       orsu = AccToOrdSumMap.get(outMontOrdSum.GF_Outlet__r.GFID_Account__c);
                       system.debug('===>orsu.GF_Total_Revenue__c'+orsu.GF_Total_Revenue__c);
                       system.debug('===>orsu.GF_Total_Revenue__c'+outMontOrdSum.GF_Total_Revenue__c);
                       system.debug('==fgndhfghg');
                       if(orsu.GF_Total_No_of_Orders__c == outMontOrdSum.GF_Total_No_of_Orders__c){
                           system.debug('===Raghav');
                           deleteOrdSumList.add(orsu);
                           break;
                       }
                       else{
                           orsu.GF_Total_Revenue__c -=outMontOrdSum.GF_Total_Revenue__c;
                           orsu.GF_Total_No_of_Orders__c-= outMontOrdSum.GF_Total_No_of_Orders__c;
                           updateOrdSumList.add(orsu);
                           break;
                       }
                   }
            }
        } 
    }
    if(listAccountMonOrder.size() > 0)
        insert listAccountMonOrder;
    system.debug('==listAccountMonOrder'+listAccountMonOrder);
    if(updateOrdSumList.size()> 0)
        update updateOrdSumList;
    system.debug('==updateOrdSumList'+updateOrdSumList);
    if(deleteOrdSumList.size() > 0)
        delete deleteOrdSumList;
    system.debug('==deleteOrdSumList'+deleteOrdSumList);
}
Glyn Anderson (Slalom)Glyn Anderson (Slalom)
Gopal,  I didn't find anything non-bulkified about your trigger.  It's entirely bulkified.  I did, however, consolidate the isDelete code into the isInsert/isUpdate code and made a few other simplifications.  The re-formatting was to help me read and understand the code.  I'm pretty sure I didn't break it; but you should convince yourself of that.  I added a few comments that might help you optimize even further.  Let me know if you have any questions.

<pre>
trigger UpdateOutletMOrderSummaryToAccmOrders on GF_Outlet_Monthly_Order_Summary__c
(   after insert
,   after update
,   before delete
)
{
    //  this lets us consolidate all trigger events
    List<GF_Outlet_Monthly_Order_Summary__c> records = Trigger.isDelete ? Trigger.old : Trigger.new;

    Map<Id,String> accIdMap = new Map<Id,String>();
    Map<Id,GF_Order_Summary__c> accToOrdSumMap = new Map<Id,GF_Order_Summary__c>();

    List<GF_Outlet_Monthly_Order_Summary__c> ordSumList =
    (   [   SELECT  Id, Name, GF_Total_No_of_Orders__c, CurrencyIsoCode, GF_Total_Revenue__c,
                    GF_Transaction_Month__c, GF_Transaction_Year__c, GF_Outlet__r.GFID_Account__c
            FROM    GF_Outlet_Monthly_Order_Summary__c
            WHERE   (   GF_Outlet__r.GFID_Account__c != null
                    AND Id IN :records
                    )
        ]
    );

    //  if no query results, there's nothing else to do...
    if ( ordSumList.isEmpty() ) return;

    for ( GF_Outlet_Monthly_Order_Summary__c outMonSum : ordSumList )
    {
        accIdMap.put( outMonSum.GF_Outlet__r.GFID_Account__c, null );
        accToOrdSumMap.put( outMonSum.GF_Outlet__r.GFID_Account__c, null );
    }

    for ( GF_Order_Summary__c ordSum :
        [   SELECT  Id, Name, GF_Total_No_of_Orders__c, GF_Total_Revenue__c,
                    GF_Transaction_Year__c, GF_Transaction_Month__c, GF_Account__c
            FROM    GF_Order_Summary__c
            WHERE   GF_Account__c IN :accIdMap.keySet()
        ]
        )
    {
        String monthYear =
        (   outMontOrdSum.GF_Transaction_Month__c
        +   '@@'
        +   outMontOrdSum.GF_Transaction_Year__c
        );

        accIdMap.put( ordSum.GF_Account__c, monthYear );
        accToOrdSumMap.put( ordSum.GF_Account__c, ordSum );
    }

    List<GF_Order_Summary__c> listAccountMonOrder = new List<GF_Order_Summary__c>();
    List<GF_Order_Summary__c> updateOrdSumList = new List<GF_Order_Summary__c>();
    List<GF_Order_Summary__c> deleteOrdSumList = new List<GF_Order_Summary__c>();

    for ( GF_Outlet_Monthly_Order_Summary__c outMontOrdSum : ordSumList )
    {
        String monthYear =
        (   outMontOrdSum.GF_Transaction_Month__c
        +   '@@'
        +   outMontOrdSum.GF_Transaction_Year__c
        );

        if  (   accToOrdSumMap.containsKey( outMontOrdSum.GF_Outlet__r.GFID_Account__c )
            &&  monthYear == accIdMap.get( outMontOrdSum.GF_Outlet__r.GFID_Account__c )
            )
        {
            GF_Order_Summary__c orsu = accToOrdSumMap.get( outMontOrdSum.GF_Outlet__r.GFID_Account__c );
            if ( !Trigger.isDelete )
            {
                orsu.GF_Total_Revenue__c += outMontOrdSum.GF_Total_Revenue__c;
                orsu.GF_Total_No_of_Orders__c += outMontOrdSum.GF_Total_No_of_Orders__c;
                updateOrdSumList.add( orsu );
            }
            else if ( orsu.GF_Total_No_of_Orders__c == outMontOrdSum.GF_Total_No_of_Orders__c )
            {
                deleteOrdSumList.add( orsu );
                //  I don't understand why we want to break here...
                break;
            }
            else
            {
                orsu.GF_Total_Revenue__c -= outMontOrdSum.GF_Total_Revenue__c;
                orsu.GF_Total_No_of_Orders__c -= outMontOrdSum.GF_Total_No_of_Orders__c;
                updateOrdSumList.add( orsu );
                //  I don't understand why we want to break here...
                break;
            }
        }
        else if ( !Trigger.isDelete )
        {
            listAccountMonOrder.add
            (   new GF_Order_Summary__c
                (   CurrencyIsoCode = outMontOrdSum.CurrencyIsoCode
                ,   GF_Account__c = outMontOrdSum.GF_Outlet__r.GFID_Account__c
                    //  if these fields are defined to have a default
                    //  value of 0, then we don't need these tests
                ,   GF_Total_Revenue__c =
                    (   outMontOrdSum.GF_Total_Revenue__c != null
                    ?   outMontOrdSum.GF_Total_Revenue__c
                    :   0
                    )
                ,   GF_Total_No_of_Orders__c =
                    (   outMontOrdSum.GF_Total_No_of_Orders__c != null
                    ?   outMontOrdSum.GF_Total_No_of_Orders__c
                    :   0
                    )
                    //  I don't think these next two can ever be null, or
                    //  we would have already thrown an exception.
                ,   GF_Transaction_Month__c =
                    (   outMontOrdSum.GF_Transaction_Month__c != null
                    ?   outMontOrdSum.GF_Transaction_Month__c
                    :   ''
                    )
                ,   GF_Transaction_Year__c =
                    (   outMontOrdSum.GF_Transaction_Year__c != null
                    ?   outMontOrdSum.GF_Transaction_Year__c
                    :   ''
                    )
                )
            );
        }
    }

    //  no need to test for empty lists.  DML on empty lists does
    //  not throw an error and does not count against DML limits.
    insert listAccountMonOrder;
    update updateOrdSumList;
    delete deleteOrdSumList;
}
</pre>