You need to sign in to do that
Don't have an account?
Help with Opportunity & Contacts
Hi,
I am building a visualforce page.Let me explain the use-case:
I need to create a visualforce page, which will be embedded as a custom link on opportunity record.
I am using standard controller of Opportunity.
Now, salesforce gives us OpportunityContactRole, which gives contacts associated with the opportunity.
But, this does not give all the information related to a contact,Like email address, phoneNo or any other custom fields on the contact.
In the visualforce page i also need to displaythe contact's other information.
I tried extending the standardcontroller and doing a semi join with opportunitycontactrole, but was not able to pull off.
Here is the query: [select Contact.email from Contact where Id in (Select ContactId from OpportunityContactRole where OpportunityId='SomeId')].
How can i accomplish this? any ideas/help on this is greatly appreciated.
Here is the VF code:
<apex:Page standardcontroller="Opportunity">
<apex:pageBlock Title="Contacts" >
<apex:pageblockSection Columns="2" >
<apex:pageBlockTable value="{!Opportunity.OpportunityContactRoles}" var="cts">
<apex:column headerValue="Contact Name">
<apex:outputText value="{!cts.Contact.Name}">
</apex:outputText>
</apex:column>
<apex:column headerValue="Contact Role">
<apex:outputText value="{!cts.Role}">
</apex:outputText>
</apex:column>
</apex:pageBlockTable>
</apex:pageblockSection>
</apex:pageBlock>
</apex:Page>
Thanks in Advance!
Sales4ce
What type of error are you getting?
I tried your page, without an extension controller, and it works fine.
On mine, I added the contact email address as well.
<apex:page standardcontroller="Opportunity"> <apex:pageBlock Title="Contacts" > <apex:pageblockSection Columns="2" > <apex:pageBlockTable value="{!Opportunity.OpportunityContactRoles}" var="cts"> <apex:column headerValue="Contact Name"> <apex:outputText value="{!cts.Contact.Name}"> </apex:outputText> </apex:column> <apex:column headerValue="Contact Role"> <apex:outputText value="{!cts.Role}"> </apex:outputText> </apex:column> <apex:column headerValue="Contact Email"> <apex:outputText value="{!cts.Contact.Email}"> </apex:outputText> </apex:column> </apex:pageBlockTable> </apex:pageblockSection> </apex:pageBlock> </apex:page>
All Answers
What type of error are you getting?
I tried your page, without an extension controller, and it works fine.
On mine, I added the contact email address as well.
<apex:page standardcontroller="Opportunity"> <apex:pageBlock Title="Contacts" > <apex:pageblockSection Columns="2" > <apex:pageBlockTable value="{!Opportunity.OpportunityContactRoles}" var="cts"> <apex:column headerValue="Contact Name"> <apex:outputText value="{!cts.Contact.Name}"> </apex:outputText> </apex:column> <apex:column headerValue="Contact Role"> <apex:outputText value="{!cts.Role}"> </apex:outputText> </apex:column> <apex:column headerValue="Contact Email"> <apex:outputText value="{!cts.Contact.Email}"> </apex:outputText> </apex:column> </apex:pageBlockTable> </apex:pageblockSection> </apex:pageBlock> </apex:page>
Thanks Jim. It worked fine.
I did not know that we could query all the fields on the contact from opportunitycontactrole using "Contact.FieldName".
Thanks,
Sales4ce
Hi Jim,
Is it possible to pull Contact Role information into the Oppty Product page as well? I tried changing the code as follows, but received the following error message:
Error: ; nested exception is: common.exception.ApiQueryException: SELECT id, opportunity.opportunitycontactroles.role ^ ERROR at Row:1:Column:12 Didn't understand relationship 'opportunitycontactroles' in field path. 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.
I have a group of users who needs to see contact info at the oppty product level.
Thanks,
Jennifer
Unfortunately, that is not supported. According to the API documenation,
In each specified relationship, only one level of parent-to-child relationship can be specified in a query. For example, if the FROM clause specified Account, the SELECT clause could only specify the Contact or other objects at that level. It could not specify a child object of Contact.
So you can't go up, then go back down again. Not sure if there is an easy way to accomplish this, you may have to create some custom fields on the OLI and use a trigger to update them.
That's what I thought. Thanks for your response.
Jennifer
I am trying to figure out a solution to send an email out to a contact via timebased workflow rule. Can a visualforce page or visualforce email template work with contact role fields?
Need more information on that. What contact, and based on what type of timeframe? Is this someone that is on the opportunity? what triggers the email to be sent (condition and time)?
We want to follow-up 5 days after creation date to the contact associated (contact role contact) to the opportunity. So whatever contact that is assigned to that opportunity, we need an email sent to that contact.
If the contact was directly on the Opportunity, you could do it with Timebased workflow. Since it isn't, you would need to use either scheduled Apex, or an add in like CronKit.
With Scheduled Apex, you could set up a schedule that runs every day at the same time, and selects all opportunities that were created 5 days earlier. Then, from that list of Opportunities, collects all of the ContactRole contacts and sends each a message.
Look at scheduled Apex and sendmail in the apex documentation for more details.
Does anyone have any sample code I could start with? I am new to apex development.