You need to sign in to do that
Don't have an account?
Prashant Yadav 90
Code not working in production
What is wrong with my code?
Description: The purpose of this code is to create multiple records based on two conditions
Parent Object: Opportunity Contract
Child Object: Annual Maintenance
Error in Production
This code is working fine in Developer Sandbox, after I installed in Production, this program is working as expected with the opportunity contract records which were previously created (before deploying this code)
However, this code does not work with opportunity contract records which are created after the deployment.
The error I am geting is “dereference a null object”
Where am I going wrong? Why this behaviour of working for existing records and not working with new records in Production?
Finally i have recomplied all Apex Classes in Production, but the result is the same
Any Help is highly appreciated!
Below is the code
public class OppConAMInvocableClass {
@InvocableMethod(label='Insert Child Records for Opportunity Contracts' description='Inserts the child records based on number of contract years.')
public static void insertChildRecords(List<Opportunity_Contract__c> parentList) {
List<Annual_Maintenance__c> childrecords = new List<Annual_Maintenance__c>();
for(Opportunity_Contract__c parent : parentList) {
Integer numberYears = Integer.valueOf(parent.Contract_Years__c);
for(Integer i=1;i<numberYears;i++) {
//Account acct = [SELECT Id FROM Account where Id = :e.WhatId];
Integer j = i + 1;
Annual_Maintenance__c child = new Annual_Maintenance__c();
Child.Anniversary_Date__c=Parent.Annual_Renewal_Date__c.addYears(i);
Child.Name=Parent.Name+'-'+Child.Anniversary_Date__c.year();
Child.Number_of_sites__c=Parent.Number_of_Sites__c;
Child.Opportunity_Department__c =Parent.Opportunity_Department__c;
Child.Account__c=Parent.Account_Name__c;
Child.Primary_Contact__c=Parent.Primary_Contact__c;
Child.Annual_Maintenance_Start_Date__c=Parent.Contract_Start_Date__c;
Child.Annual_Maintenance_End_Date__c=Parent.Contract_End_Date__c;
Child.Opportunity_Name__c=Parent.Opportunity_Name__c;
Child.Anniversary_Date__c=Parent.Annual_Renewal_Date__c;
Child.Sales_Territory__c=Parent.Sales_Territory__c;
Child.Annual_Maintenance_Amount__c=Parent.SMS_Maintenance_Amount__c;
child.Opportunity_Contract__c=parent.Id;
childrecords.add(child);
}
}
Database.SaveResult[] results = Database.insert(childrecords);
/*
List<ID> itemIds = new List<ID>();
for (Database.SaveResult result : results) {
if (result.isSuccess()) {
itemIds.add(result.getId());
}
}
return itemIds;
*/
}
}
Description: The purpose of this code is to create multiple records based on two conditions
- Custom Picklist: Value = Yes (condition set in process builder)
- (Number Field) Contract Term (Number of years) =
Parent Object: Opportunity Contract
Child Object: Annual Maintenance
Error in Production
This code is working fine in Developer Sandbox, after I installed in Production, this program is working as expected with the opportunity contract records which were previously created (before deploying this code)
However, this code does not work with opportunity contract records which are created after the deployment.
The error I am geting is “dereference a null object”
Where am I going wrong? Why this behaviour of working for existing records and not working with new records in Production?
Finally i have recomplied all Apex Classes in Production, but the result is the same
Any Help is highly appreciated!
Below is the code
public class OppConAMInvocableClass {
@InvocableMethod(label='Insert Child Records for Opportunity Contracts' description='Inserts the child records based on number of contract years.')
public static void insertChildRecords(List<Opportunity_Contract__c> parentList) {
List<Annual_Maintenance__c> childrecords = new List<Annual_Maintenance__c>();
for(Opportunity_Contract__c parent : parentList) {
Integer numberYears = Integer.valueOf(parent.Contract_Years__c);
for(Integer i=1;i<numberYears;i++) {
//Account acct = [SELECT Id FROM Account where Id = :e.WhatId];
Integer j = i + 1;
Annual_Maintenance__c child = new Annual_Maintenance__c();
Child.Anniversary_Date__c=Parent.Annual_Renewal_Date__c.addYears(i);
Child.Name=Parent.Name+'-'+Child.Anniversary_Date__c.year();
Child.Number_of_sites__c=Parent.Number_of_Sites__c;
Child.Opportunity_Department__c =Parent.Opportunity_Department__c;
Child.Account__c=Parent.Account_Name__c;
Child.Primary_Contact__c=Parent.Primary_Contact__c;
Child.Annual_Maintenance_Start_Date__c=Parent.Contract_Start_Date__c;
Child.Annual_Maintenance_End_Date__c=Parent.Contract_End_Date__c;
Child.Opportunity_Name__c=Parent.Opportunity_Name__c;
Child.Anniversary_Date__c=Parent.Annual_Renewal_Date__c;
Child.Sales_Territory__c=Parent.Sales_Territory__c;
Child.Annual_Maintenance_Amount__c=Parent.SMS_Maintenance_Amount__c;
child.Opportunity_Contract__c=parent.Id;
childrecords.add(child);
}
}
Database.SaveResult[] results = Database.insert(childrecords);
/*
List<ID> itemIds = new List<ID>();
for (Database.SaveResult result : results) {
if (result.isSuccess()) {
itemIds.add(result.getId());
}
}
return itemIds;
*/
}
}
Can you check whether the new records have all the fields populated. Atleast all the fields that are populated in existing records(old ones) for those its working fine. I think you might not populating some fields in new records.
Hope this helps!