I've created a list containing Contact ID values. I'm trying to add these values to a Contact Map which I will use to update Contact records.

I'm getting the error: "Initial term of field expression must be a concrete SObject: LIST on this line:" contacts.put(ocr.id, new contact(id=ocr.id, Major_Gift_Prospect_Contact__c=true));

I think I understand the message after researching it. How do I modify my code so I can add list items to the map.



public with sharing class AdvancementOpportunity {

    public void UpdateMajorGiftProspectContacts(){

        // Update Contact Major_Gift_Prospect_Contact__c to True if appropriate Opportunity exists.
        // Conditions: Account.Name = 'Major Gift Opportunity' and DEPARTMENT_TYPE__C = 'Advancement' and DEPARTMENT_SUB_TYPE__C = 'Major Gifts'
        // Need to create this as a Bulk update.

        // Create Map to hold Contact records to update
        map< id, contact > contacts = new map< id, contact >();

        // Create a list of Contacts to update:
        for(List<OpportunityContactRole> ocr: [Select contact.id from OpportunityContactRole 
                                                WHERE Opportunity.DEPARTMENT_TYPE__C = 'Advancement' 
                                                and Opportunity.DEPARTMENT_Sub_Type__C = 'Major Gifts' 
                                                and Contact.Major_Gift_Prospect_Contact__c = false ])

                // Add list of contacts to add to the Contact map
                contacts.put(ocr.id, new contact(id=ocr.id, Major_Gift_Prospect_Contact__c=true));


            // Update Contact records
            update contacts.values(); 


1 Answer 1


Your loop variable is a List<OpportunityContactRole> when I think what you actually want it to be is just an OpportunityContactRole so that you are iterating through each of the results from your SOQL query.

Change this line:

for(List<OpportunityContactRole> ocr: ... )


for(OpportunityContactRole ocr: ...)
  • Thanks Koen and Alex that did the trick. Having said that, the reason I was trying to use the list in the for loop, I heard that: "The SOQL For Loop is good. In the for loop, it breaks records down into 200 records per operation." I was making this more robust if I happened to have a large number of records. Thanks! Jan 6, 2015 at 20:47
  • Line of working code: contacts.put(ocr.contact.id, new contact(id=ocr.contact.id, Major_Gift_Prospect_Contact__c=true)); Jan 6, 2015 at 21:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.