2012-07-20 33 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