0

我是一名开发人员,但我之前没有接触过销售人员。

我得到了这个:

<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 的徽标,而应该放入 Parent 的徽标,但如果 Parent 的 LogoURL 属性为空,我应该放入其父级的 LogoURL,依此类推,直到找到logo 或者没有更多的父母,在这种情况下,我应该将 OwnerCompany LogoURL 放入。

我在搜索销售人员使用的语言时遇到问题。有谁知道我该如何解决这个问题?对带有循环的方法的某种函数调用?

编辑:

显然它需要这样做:

Invoice > Account > LogoURL

Invoice > Account > ParentAccount > LogoURL

Invoice > Account > ParentAccount > ParentAccount > LogoURL

等等

其中 Invoice 是relatedToType。

所以我想我需要检查 LogoURL,如果是空白检查 ParentAccount,如果是空白,检查 ParentAccount.ParentAccount 等,如果最后一个是空白,使用

发票 > OwnerCompany > LogoURL

4

1 回答 1

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 页面简化为与您开始时类似的内容。当页面通过控制器中的调用加载时,该logoUrl变量将自动填充:getLogoUrl

<td class="textAlignRight">
    <apex:outputPanel rendered="{!AND(NOT(ISNULL(logoUrl)), logoUrl<>'')}">
        <img src="{!logoUrl}"/>
    </apex:outputPanel>
</td>
于 2012-07-20T14:37:57.417 回答