I am having 2 objects one is opportunity and test object.
I Created product lookup, pricebook lookup, quantity, amount fields on "test" custom object and saved the record after filling all the required fields. all the fields should be required except Amount. see the following code snippet to achieve your requirements.
trigger on test Object. here consider 2nd object = test__c x = Opportunity
I want to update amount field in opportunity from test__C object
trigger calculateAmount on Test__c (before insert, before update, after insert, after update)
{
set<Id> productidsSet = new set<Id>();
set<Id> pricebookidsSet = new set<Id>();
map<String,Decimal> PriceBookEntryMap = new map<String, Decimal>();
list<PriceBookEntry> pbe_List = new list<PriceBookEntry> ();
if(trigger.isbefore){
if(trigger.isinsert){
for(Test__c oli : trigger.new){
productidsSet.add(oli.Product__c);
pricebookIdsSet.add(oli.Price_Book__c);
}
pbe_List = [select id, product2Id, pricebook2id, unitprice from pricebookentry
where product2Id IN : productidsSet
AND pricebook2id IN : pricebookidsSet];
System.debug('@@@@pbe_List '+pbe_List );
for (PricebookEntry pbe : pbe_List) {
pricebookentryMap.put(pbe.Product2Id+string.valueOf(pbe.Pricebook2Id),pbe.UnitPrice);
}
for(Test__c oli : trigger.new){
String productIdPriceBookIdKey = oli.Product__c + string.valueOf(oli.Price_Book__c);
oli.quantity__c = oli.quantity__c == null ? 1 : oli.quantity__c;
oli.Amount__c = PriceBookEntryMap.containsKey(productIdPriceBookIdKey ) ? oli.quantity__c * PriceBookEntryMap.get(productIdPriceBookIdKey) : 0;
System.debug('@@@@oli.Amount__c'+oli.Amount__c);
}
}
}
if(trigger.isafter){
set<Id> oppIds = new set<Id>();
if(trigger.isinsert){
for(Test__c oli : trigger.new) {
oppIds.add(oli.opportunity__c);
System.debug('@@@oli.opportunity__c'+oli.opportunity__c);
}
// retrieves all the parents records with child records
list<Opportunity> oppList = [select Amount,(select id, amount__c FROM Test__r) FROM Opportunity WHERE id IN : oppIds];
Decimal amt = 0;
for (Opportunity x : oppList) {
amt = 0;
for(Test__c oli : x.Test__r){
amt += oli.amount__c;
}
x.amount__c = amt;
}
// Perform DML On X object to update rollup amount
update oppList;
}
}
}
I had tried using this trigger but getting an error
"Didn't understand relationship 'Test__r' in FROM part of query call. If you are attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name. Please reference your WSDL or the describe call for the appropriate names. at line 56 column 33"
I mean __r field is showing errors