2012-08-16 102 views
2

我在看顯示在Visualforce頁面的子查詢SOQL查詢。這是我的SOQL表達式。頂點SOQL子查詢中Visualforce

public ApexPages.StandardSetController setCon { 
     get { 
      if(setCon == null) { 
       setCon = new ApexPages.StandardSetController(Database.getQueryLocator(
        [SELECT Contact.Id, Opportunity.Id, Contact.FirstName, Contact.LastName, Contact.Phone,Contact.Account.Name, Contact.Email,Contact.Last_Contacted__c,Contact.Membership_Type__c,Opportunity.Call_Disposition__c, Opportunity.Sales_Stage__c,Opportunity.Name, Opportunity.CloseDate, Opportunity.StageName, Opportunity.CreatedDate FROM OpportunityContactRole where Opportunity.OwnerId=:Userinfo.getUserId()])); 
      } 
      return setCon; 
     } 
     set; 
    } 

它得到一條消息'StandardSetController不支持OpportunityContactRole'。所以,我試圖讓從賬戶機遇和聯繫信息...

所以我SOQL查詢更改爲:

SELECT Name, (SELECT Name, Phone, Email, Last_Contacted__c, Contact.Membership_Type__c FROM Account.Contacts) , (SELECT Call_Disposition__c, StageName, CreatedDate, CloseDate FROM Account.Opportunities) FROM Account where Id=:UserInfo.getUserId()]) 

,但現在在我的Visualforce頁,我無法訪問子查詢字段:

<apex:page controller="SalesRepPageControllerV3" tabstyle="contact" sidebar="false" showChat="true" > 
    <apex:form id="theForm"> 
    <apex:sectionHeader title="Sales Rep Page for {!$User.FirstName}"/> 
     <apex:pageBlock id="innerblock" mode="edit"> 
     <apex:pageMessages /> 

     <apex:pageBlock id="innerblock"> 
     <apex:pageBlockSection id="pagesection"> 
      <apex:pageBlockTable value="{!ContactOpportunity}" var="co" id="pageblocktable"> 
       <apex:column headerValue="Created Date" value="{!co.Opportunity.CreatedDate}"/> 
       <apex:column headerValue="First Name" value="{!co.Contact.FirstName}"/> 
       <apex:column headerValue="First Name" value="{!co.Contact.LastName}"/> 
       <apex:column headerValue="Phone" value="{!co.Contact.Phone}"/> 
       <apex:column headerValue="Account Name" value="{!co.Contact.Account.Name}"/> 
       <apex:column headerValue="Email" value="{!co.Contact.Email}"/> 
       <apex:column headerValue="Last Contacted" value="{!co.Contact.Last_Contacted__c}"> 
       </apex:column> 

       <apex:column headerValue="Membership Type" value="{!co.Contact.Membership_Type__c}"/> 
       <apex:column headerValue="Call Disposition"> 
        <apex:inputField value="{!co.Opportunity.Call_Disposition__c}"/> 
       </apex:column> 
       <apex:column headerValue="Sales Stage"> 
        <apex:inputField value="{!co.Opportunity.Sales_Stage__c}"/> 
       </apex:column>   
      </apex:pageBlockTable> 
      </apex:pageBlockSection> 

     </apex:pageBlock> 
     <apex:pageBlockButtons > 
      <apex:commandButton value="Save" action="{!save}" reRender="pageblocktable"/> 
      <apex:commandButton value="Cancel" action="{!cancel}" reRender="pageblocktable"/> 
     </apex:pageBlockButtons> 
    </apex:pageBlock> 
    <apex:panelGrid columns="2"> 
       <apex:commandLink action="{!previous}">Previous</apex:commandlink> 
       <apex:commandLink action="{!next}">Next</apex:commandlink> 
    </apex:panelGrid> 
    </apex:form> 
</apex:page> 

它不明白co.Opportunity和co.Contact,因爲它不是一個帳戶。如果我將它改爲co.Opportunities或co.Contacts它是一個只能通過重複訪問的Arraylist。

先端的問題:重複是沒有,我需要排序的列標頭值。請如果有人能幫助,請讓我知道如何。

回答

2

大量編輯...

我不認爲你可以使用一組標準的控制器此。使用自定義控制器我能得到機會接觸的合併列表爲當前用戶:

enter image description here

頁:

<apex:page controller="TestQueryController"> 
    <apex:form > 
    <apex:pageBlock > 
     <apex:pageBlockTable value="{!opportunities}" var="co"> 
      <apex:column value="{!co.Opportunity.CreatedDate}"/> 
      <apex:column value="{!co.Contact.FirstName}"/> 
      <apex:column value="{!co.Contact.LastName}"/> 
      <apex:column headerValue="Stage"> 
       <apex:inputField value="{!co.Opportunity.StageName}"/> 
      </apex:column> 
     </apex:pageBlockTable> 
    </apex:pageBlock> 
    </Apex:form> 
</apex:page> 

控制器:

public with sharing class TestQueryController { 
    List<OpportunityContactRole> myOCR; 

    public List<OpportunityContactRole> getOpportunities() { 
     if (myOCR == null) { 
      myOCR = [SELECT Contact.Id, Opportunity.Id, Contact.FirstName, Contact.LastName, Contact.Phone, 
       Contact.Account.Name, Contact.Email, Opportunity.Name, 
       Opportunity.CloseDate, Opportunity.StageName, Opportunity.CreatedDate 
       FROM OpportunityContactRole where Opportunity.OwnerId=:Userinfo.getUserId()]; 
     } 
     return myOCR; 
    } 
} 

您需要在您的自定義字段中替換。如果你需要排序,this blog post給出了一種方法,儘管你可以避免使用包裝類和Apex Comparable接口重複訪問數據庫。最後,你需要實現你自己的保存邏輯。祝你好運!

+0

感謝metadaddy !!! :) – 2012-08-18 01:09:41

+0

不客氣...如果它適合你,請註冊並將其標記爲答案。 – metadaddy 2012-08-18 01:31:19

+0

它的工作原理,但我希望將聯繫人和機會都放在一個pageBlockTable中,然後我可以對其進行排序。這有可能嗎?還有其他的替代辦法嗎? – 2012-08-18 03:51:16

0

你有什麼是每個嵌套查詢內部表。 pageblocktable只能遍歷一個表。

按照下面的代碼示例。在賬戶列表中選擇您的賬戶,然後用一個pageblocktable和兩個嵌套的pageblocktables遍歷列表。

控制器

public List<Account> _accounts; 
public list<Account> Accounts { 
    get { 
     if (_accounts == null) { 
      _accounts = [SELECT Name, (SELECT Name, Phone, Email, Last_Contacted__c, Contact.Membership_Type__c FROM Account.Contacts) , (SELECT Call_Disposition__c, StageName, CreatedDate, CloseDate FROM Account.Opportunities) FROM Account where Id=:UserInfo.getUserId()]; 
     } 
     return _accounts; 
    } 
} 

Visualforce

<apex:pageBlockTable value="{!Accounts}" var="acc" id="pageblocktable"> 

    <apex:column headerValue="Account Name" value="{!acc.Name}"/> 

    <apex:pageBlockTable value="{!acc.Opportunities}" var="ops" id="opportunities"> 
     <apex:column headerValue="Created Date" value="{!ops.CreatedDate}"/>   
     <apex:column headerValue="Call Disposition"> 
      <apex:inputField value="{!ops.Call_Disposition__c}"/> 
     </apex:column> 
     <apex:column headerValue="Sales Stage"> 
      <apex:inputField value="{!ops.Sales_Stage__c}"/> 
     </apex:column>   
    </apex:pageBlockTable> 
    <apex:pageBlockTable value="{!acc.Contacts}" var="con" id="contacts"> 
     <apex:column headerValue="First Name" value="{!con.FirstName}"/> 
     <apex:column headerValue="First Name" value="{!con.LastName}"/> 
     <apex:column headerValue="Phone" value="{!con.Phone}"/> 
     <apex:column headerValue="Account Name" value="{!con.Account.Name}"/> 
     <apex:column headerValue="Email" value="{!con.Email}"/> 
     <apex:column headerValue="Last Contacted" value="{!con.Last_Contacted__c}" />  
     <apex:column headerValue="Membership Type" value="{!con.Membership_Type__c}"/> 
    </apex:pageBlockTable> 

</apex:pageBlockTable> 
+0

萬分感謝傑拉德!我會嘗試和回覆,如果我仍然有問題。 – 2012-08-17 03:25:39

+0

嗨傑拉德出於某種原因,它只是顯示我的帳戶名稱字段和其他人。你也許知道爲什麼? – 2012-08-17 07:59:16