2012-07-20 66 views
0

我是一名開發人員,但以前我沒有碰過salesforce。在salesforce模板中,我如何遞歸檢查父屬性?

我一直在考慮這個:

<td class="textAlignRight"> 
<apex:outputPanel rendered="{!relatedTo.c2g__OwnerCompany__r.c2g__LogoURL__c<>''}"><img src="{!relatedTo.c2g__OwnerCompany__r.c2g__LogoURL__c}"/> 
</apex:outputPanel> 
</td> 

,並告知,而不是把在OwnerCompany的標誌,我應該在家長的標誌推杆,但如果家長的LogoURL屬性是空白,我應該把它的父母的LogoURL,等等,直到我找到一個標誌或沒有更多的父母,在這種情況下,我應該把OwnerCompany LogoURL英寸

我很難用谷歌搜索語言salesforce使用。有沒有人有任何想法,我可以解決這個問題?某種函數調用帶有循環的方法?

編輯:

顯然,它需要做的是:

Invoice > Account > LogoURL 

Invoice > Account > ParentAccount > LogoURL 

Invoice > Account > ParentAccount > ParentAccount > LogoURL 

其中發票是relatedToType。

所以我想我需要檢查LogoURL,如果它是一張空白支票ParentAccount,如果是空白,檢查ParentAccount.ParentAccount等,如果這些最後一個空白,使用

發票> OwnerCompany> LogoURL

+0

是「父」的API名稱字段你指的是類似「c2g__Parent__c」? – JCD 2012-07-20 13:21:55

+0

好的,我找到了屬性列表,這些字段都是以上面的名字命名的,還有一個Owner字段,這是我可以看到的最接近Parent的字段。如果我們假設有一個父字段... – NibblyPig 2012-07-20 13:25:58

+0

字段名稱的'c2g__'部分引用字段的名稱空間 - 聽起來像字段已添加託管程序包(可能來自Salesforce.com AppExchange)。 '__c'表示這是一個自定義字段。 「所有者」字段是對擁有該特定記錄的用戶的引用;我非常懷疑用戶對象上會有一個LogoURL字段。在這種情況下,「relatedTo」變量的數據類型是什麼? – JCD 2012-07-20 13:45:55

回答

1

我會對此進行一次刺激...此代碼假設c2g__OwnerCompany__r字段指向一個帳戶記錄,該帳戶記錄又有自己的c2g_OwnerCompany__r字段指向一個父帳戶(如果它有一個)。 VisualForce是不是真的在建造這種這種類型的遞歸的,我想你會明白爲什麼:

<apex:variable var="parentLogo" value="{!relatedTo.c2g__OwnerCompany__r.c2g__LogoURL__c}" /> 
<apex:variable var="parentLogo2" value="{!relatedTo.c2g__OwnerCompany__r.c2g__OwnerCompany__r.c2g__LogoURL__c}" /> 
<apex:variable var="parentLogo3" value="{!relatedTo.c2g__OwnerCompany__r.c2g__OwnerCompany__r.c2g__OwnerCompany__r.c2g__LogoURL__c}" /> 
<td class="textAlignRight"> 
    <apex:outputPanel rendered="{!parentLogo<>''}"> 
     <img src="{!parentLogo}"/> 
    </apex:outputPanel> 
    <apex:outputPanel rendered="{!AND(NOT(parentLogo<>''), parentLogo2<>'')}"> 
     <img src="{!parentLogo2}"/> 
    </apex:outputPanel> 
    <apex:outputPanel rendered="{!AND(NOT(parentLogo<>''), NOT(parentLogo2<>'') parentLogo3<>'')}"> 
     <img src="{!parentLogo3}"/> 
    </apex:outputPanel> 
</td> 

我真的不會推薦這種方法,因爲它很快使一個爛攤子你的VF頁,並且還的限制您可以開始的級別有多少。

另一種解決方案是在你的控制器類中處理這個問題,在那裏對遞歸進行更多的控制。值得注意的是,Salesforce對單次調用上下文數據庫的次數施加了嚴格的限制,因此您需要找出限制這種查詢數量的方法。我可能會只使用這個,如果你能保證你只有父母賬戶的一對夫婦的水平,不存在循環引用:

public String getLogoUrl() { 
    String logo; 
    Account acc= [select Id, c2g__OwnerCompany__c, c2g__LogoURL__c from Account where Id = :relatedTo.c2g__OwnerCompany__c]; 
    // running SOQL queries inside of loops is most certainly NOT a Salesforce best practice 
    while (true) { 
     logo = acc.c2g__LogoURL__c; 
     if (acc.c2g__OwnerCompany__c != null) 
      acc = [select Id, c2g__OwnerCompany__c, c2g__LogoURL__c from Account where Id = :acc.c2g__OwnerCompany__c]; 
     else 
      break; 
    } 
    return logo; 
} 

這反過來又簡化了您的VF頁面類似於你開始出什麼東西用。當頁面加載由控制器getLogoUrl呼叫時logoUrl變量將自動填充:

<td class="textAlignRight"> 
    <apex:outputPanel rendered="{!AND(NOT(ISNULL(logoUrl)), logoUrl<>'')}"> 
     <img src="{!logoUrl}"/> 
    </apex:outputPanel> 
</td> 
+0

謝謝你的全面回覆!我不知道銷售人員是如何工作的,但是這給了我一個很好的起點,即使不是解決方案。我剛剛被給了編輯模板頁面,並告訴看看。我確信我可以完成這項工作。感謝您花時間拿出答案:) – NibblyPig 2012-07-20 14:53:11

+0

只是一個更新,這段代碼工作得很好,非常感謝:)唯一奇怪的是我不得不使用'c2g__OwnerCompany__r'而不是'c2g__OwnerCompany__c',我沒有知道r的含義,但在代碼的其他地方用於呈現其他細節。找不到任何參考。神祕!不過謝謝你! – NibblyPig 2012-07-24 11:18:37