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
nishant shrivastava 40nishant shrivastava 40 

trigger is not working, it is giving 'dereference null point exception',

My first system.debug is showing null value and i am not able to understand, what is wrong in it. my trigger is not working. kindly let me know. thanks :)

Trigger :

trigger SumQuote on QuoteLineItem (before delete) {
    if (trigger.isbefore && trigger.isdelete){
            SumQuoteHandler.sumQuotefeld(trigger.new);
        }
    }

Apex Class : 

public class SumQuoteHandler {
    Public static set<Id> ids;
    Public static List<Quote> QI = New List<Quote>();
    Public static List<QuoteLineItem> QLI = New List<QuoteLineItem>();
    
    Public Static void sumQuotefeld(List<QuoteLineitem>QLISUM){
        set<Id> ids = new set<Id>();
        for(QuoteLineItem QLII : QLISUM){
            Ids.add(QLII.QuoteId);
        }
        system.debug(ids);
        List<Quote> QI = [SELECT Id, Rabatt_der_einmaligen_Geb_hren__c, einmalige_Geb_hren__c, monatlicher_LP_Lizenzen__c  FROM Quote where Id IN:ids];
        system.debug(QI);
        List<QuoteLineItem> QL = [SELECT id, QuoteId FROM QuoteLineItem WHERE Id IN: Ids ];
        system.debug(QL);
        for (Quote Q : QI){
            for(QuoteLineItem QQ : QL){
                if(Q.id==QQ.QuoteId && QQ.QuoteId!=null && QQ.Produktkategorie__c=='Software Subscription'){
                          Q.Rabatt_der_einmaligen_Geb_hren__c = Q.Rabatt_der_einmaligen_Geb_hren__c-QQ.Euro_Rabatt_del__c;
                        Q.einmalige_Geb_hren__c = Q.einmalige_Geb_hren__c-QQ.GesamtpreisNEU__c;
                }
                else if(QQ.QuoteId==Q.id && QQ.QuoteId!=null && QQ.Produktkategorie__c=='Software'){
                    Q.monatlicher_LP_Lizenzen__c = Q.monatlicher_LP_Lizenzen__c-QQ.ListPrice;
                }
            }
        }
        update QI;
        system.debug(QI);
}
}


I shall be grateful to you for your valuable feedback. Thanks :)
David Zhu 🔥David Zhu 🔥
List Ids contains Id of Quote.
When you query quotelineItem, you use " Id IN :ids ". This will return null.
List<QuoteLineItem> QL = [SELECT id, QuoteId FROM QuoteLineItem WHERE Id IN: Ids ];
        system.debug(QL);

I think you need to change to 
List<QuoteLineItem> QL = [SELECT id, QuoteId FROM QuoteLineItem WHERE QuoteId IN: Ids ];
       
nishant shrivastava 40nishant shrivastava 40
Thanks David for your reply. :( No David, it is still Zero.
system.debug(ids) is also zero.
David Zhu 🔥David Zhu 🔥
There are two variable ids defined. One in the class as a static property, another one the the method as a local variable.

You may need to remove ids defination in the class.
public class SumQuoteHandler {
    Public static set<Id> ids;

Public Static void sumQuotefeld(List<QuoteLineitem>QLISUM){
        set<Id> ids = new set<Id>();    //second ids defined.

 
nishant shrivastava 40nishant shrivastava 40
`public class SumQuoteHandler {
    
    Public static List<Quote> QI = New List<Quote>();
    Public static List<QuoteLineItem> QLI = New List<QuoteLineItem>();
    
    Public static void sumQuotefeld(List<QuoteLineItem>QLI){
        
        List<QuoteLineitem>QLISUM = [select id, QuoteId from QuoteLineItem ];
        set<Id> ids = new set<Id>();
        for(QuoteLineItem QLII : QLISUM){
            ids.add(QLII.QuoteId);
        }
        system.debug(ids);
        List<Quote> QI = [SELECT Id, Rabatt_der_einmaligen_Geb_hren__c, einmalige_Geb_hren__c, monatlicher_LP_Lizenzen__c  FROM Quote]; // where Id IN:ids
        system.debug(QI);
        List<QuoteLineItem> QL = [SELECT id, QuoteId,Produktkategorie__c, Euro_Rabatt_del__c FROM QuoteLineItem WHERE QuoteId IN: Ids ];
        system.debug(QL);// line 17
        for (Quote Q : QI){
            for(QuoteLineItem QQ : QL){
                double amount = Q.Rabatt_der_einmaligen_Geb_hren__c;
                double amount1 = Q.einmalige_Geb_hren__c;
                double amount2 = Q.monatlicher_LP_Lizenzen__c;
                if(Q.id==QQ.QuoteId && QQ.QuoteId!=null && QQ.Produktkategorie__c=='Software Subscription'){
                          amount += QQ.Euro_Rabatt_del__c;
                        amount1 += QQ.GesamtpreisNEU__c;
                }
                else if(QQ.QuoteId==Q.id && QQ.QuoteId!=null && QQ.Produktkategorie__c=='Software'){
                    amount2 += QQ.ListPrice;
                }
                Q.Rabatt_der_einmaligen_Geb_hren__c = amount;
                Q.einmalige_Geb_hren__c = amount1;
                Q.monatlicher_LP_Lizenzen__c = amount2;
            }
        }
        update QI;
        system.debug(QI);
       
it is working good until 17 and retrieving records accordingly, then after it shows that (attempt to dereference a null object)... i am running out of mind.
David Zhu 🔥David Zhu 🔥
Save as Ids, you have static property defined:
 Public static List<Quote> QI = New List<Quote>();

and local variable:
List<Quote> QI = [SELECT Id, Rabatt_der_einmaligen_Geb_hren__c, einmalige_Geb_hren__c, monatlicher_LP_Lizenzen__c  FROM Quote]; // where Id IN:ids

You need to Remove unneccessary static properties.