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
kathybbkathybb 

Problem with a before insert trigger

I'm attempting to write a trigger on an opportunity that brings over information from the related Account and adds it to the Opportunity just inserted.  This is my first attempt at writing a trigger.  For some reason my soql queries are not returning any rows.  I will post my code for the trigger and the test I'm trying to create below.  Can someone spot what I'm doing wrong and tell me how to correct it?  Thanks very much in advance.

 

The Trigger:

trigger FillFieldsFromAcct on Opportunity (before insert) {
    string holdAccountId = ' ';
    Account acct = new Account();
    Account acctToCopy= new Account();
    Opportunity opp = new Opportunity();
    for(Opportunity a : Trigger.New){
    opp = (Opportunity)Trigger.New[0];
    holdAccountId = a.Account.id;
    }
    system.debug(holdAccountId);
    acct=[SELECT id, Display__c, Mobile__c, Video__c, Monthly_Display_Imps__c, Monthly_Mobile_Imps__c, Monthly_Video_Imps__c, Uniques__c, Vertical__c from Account where id = :holdAccountId limit 1];
    acctToCopy = (Account)acct;
    opp.Display__c = acctToCopy.Display__c;
    opp.Mobile__c = acctToCopy.Mobile__c;
    opp.Video__c = acctToCopy.Video__c;
    opp.Monthly_Display_Impressions__c = acctToCopy.Monthly_Display_Imps__c;
    opp.Monthly_Video_Impressions__c = acctToCopy.Monthly_Video_Imps__c;
    opp.Monthly_Mobile_Impressions__c = acctToCopy.Monthly_Mobile_Imps__c;
    opp.Uniques__c = acctToCopy.Uniques__c;
    opp.Vertical__c = acctToCopy.Vertical__c;
    system.debug(opp);
}

 And here is the test:

@isTest
private class TestOppTrigger {
static testMethod void verify_Acct_update() {
	integer x = 0;
	Account testAcct1 = new Account(Name='TestAcct1', Vertical__c = 'Education',Uniques__c = 30000, Pageviews__c=20000,Display__c=TRUE, Video__c =TRUE,
	Mobile__c = TRUE, Monthly_Display_Imps__c = 500000,Monthly_Mobile_Imps__c = 500003, Monthly_Video_Imps__c = 500002);
	database.insert(testAcct1);
    string myAccount=testAcct1.id;
	Opportunity TestOp1 = new Opportunity(Name='TestOp1', StageName = '3 - On Hold',CloseDate = date.parse('3/30/2033'), Pub_Dev_Rep__c ='Tara');
	database.insert(TestOp1);
	string qry = 'select id, Name, Vertical__c,Uniques__c, Pageviews__c,Display__c, Video_PubDev__c, Mobile__c, Monthly_Display_Imps__c,Monthly_Mobile_Imps__c, Monthly_Video_Imps__c from Opportunity where id = :myAccount limit 1 ';
	List<Opportunity> Results = new List<Opportunity>();
	Results = database.query(qry);
    system.debug(Results);
	Results[0] = (Opportunity)Results[0];
		if(Results[x].Name == 'TestOp1'){
			system.assertEquals(TestOp1.Vertical__c,TestAcct1.Vertical__c );
			system.assertEquals(TestOp1.Uniques__c,TestAcct1.Uniques__c );
			system.assertEquals(TestOp1.Pageviews__c,TestAcct1.Pageviews__c );
			system.assertEquals(TestOp1.Display__c,TestAcct1.Display__c );
			system.assertEquals(TestOp1.Video_PubDev__c,TestAcct1.Video__c );
			system.assertEquals(TestOp1.Mobile__c,TestAcct1.Mobile__c );
			system.assertEquals(TestOp1.Monthly_Display_Impressions__c,TestAcct1.Monthly_Display_Imps__c );
			system.assertEquals(TestOp1.Monthly_Video_Impressions__c,TestAcct1.Monthly_Video_Imps__c);
			system.assertEquals(TestOp1.Monthly_Mobile_Impressions__c,TestAcct1.Monthly_Mobile_Imps__c );
		}else{
            system.debug('One of the assertions failed');
		
		
		}
	}
}

 Thank you so much in advance

 

Naidu PothiniNaidu Pothini
trigger FillFieldsFromAcct on Opportunity (before insert) 
{
    List<Id> accIds = new List<Id>();
    

    for(Opportunity Oppty : Trigger.New)
    {
        accIds.add(Oppty.AccountId);
    }

    Map<Id, Account> accMap = new Map<Id, Account>([SELECT Id, Display__c, Mobile__c, Video__c, Monthly_Display_Imps__c, Monthly_Mobile_Imps__c, Monthly_Video_Imps__c, Uniques__c, Vertical__c FROM Account WHERE Id IN :accIds]);

    for(Opportunity Opp : Trigger.new)
    {
        Account acctToCopy = accMap.get(Opp.AccountId);

        opp.Display__c = acctToCopy.Display__c;
        opp.Mobile__c = acctToCopy.Mobile__c;
        opp.Video__c = acctToCopy.Video__c;
        opp.Monthly_Display_Impressions__c = acctToCopy.Monthly_Display_Imps__c;
        opp.Monthly_Video_Impressions__c = acctToCopy.Monthly_Video_Imps__c;
        opp.Monthly_Mobile_Impressions__c = acctToCopy.Monthly_Mobile_Imps__c;
        opp.Uniques__c = acctToCopy.Uniques__c;
        opp.Vertical__c = acctToCopy.Vertical__c;
    }
}

 

kathybbkathybb

Naidu, Thank you so much for your prompt reply.  Unfortunately, I am still getting the error message about the list having no lines to assign to the SObject.  From the debug log it appears that the SOQL is returning results -- the problem is that I haven't been able to figure out how to get the fields I queried so that they can be assigned to the fields in the opportunity.    I appreciate your help -- please let me know if something else occurs to you.

 

Sincerely,

KBB

Naidu PothiniNaidu Pothini
@isTest
private class TestOppTrigger {
static testMethod void verify_Acct_update() {
	integer x = 0;
	Account testAcct1 = new Account(Name='TestAcct1', Vertical__c = 'Education',Uniques__c = 30000, Pageviews__c=20000,Display__c=TRUE, Video__c =TRUE,
	Mobile__c = TRUE, Monthly_Display_Imps__c = 500000,Monthly_Mobile_Imps__c = 500003, Monthly_Video_Imps__c = 500002);
	database.insert(testAcct1);
    string myAccount=testAcct1.id;
	Opportunity TestOp1 = new Opportunity(Name='TestOp1', StageName = '3 - On Hold',CloseDate = date.parse('3/30/2033'), Pub_Dev_Rep__c ='Tara', AccountId = testAcct1.Id);
	database.insert(TestOp1);
	string qry = 'select id, Name, Vertical__c,Uniques__c, Pageviews__c,Display__c, Video_PubDev__c, Mobile__c, Monthly_Display_Imps__c,Monthly_Mobile_Imps__c, Monthly_Video_Imps__c from Opportunity where id = :myAccount limit 1 '; // AccountId = :myAccount
	List<Opportunity> Results = new List<Opportunity>();
	Results = database.query(qry);
    system.debug(Results);
	Results[0] = (Opportunity)Results[0];
		if(Results[x].Name == 'TestOp1'){
			system.assertEquals(TestOp1.Vertical__c,TestAcct1.Vertical__c );
			system.assertEquals(TestOp1.Uniques__c,TestAcct1.Uniques__c );
			system.assertEquals(TestOp1.Pageviews__c,TestAcct1.Pageviews__c );
			system.assertEquals(TestOp1.Display__c,TestAcct1.Display__c );
			system.assertEquals(TestOp1.Video_PubDev__c,TestAcct1.Video__c );
			system.assertEquals(TestOp1.Mobile__c,TestAcct1.Mobile__c );
			system.assertEquals(TestOp1.Monthly_Display_Impressions__c,TestAcct1.Monthly_Display_Imps__c );
			system.assertEquals(TestOp1.Monthly_Video_Impressions__c,TestAcct1.Monthly_Video_Imps__c);
			system.assertEquals(TestOp1.Monthly_Mobile_Impressions__c,TestAcct1.Monthly_Mobile_Imps__c );
		}else{
            system.debug('One of the assertions failed');
		
		
		}
	}
}

 You need to insert the opportunity with AccountId.