Visualforce:仅当值不为 null 时才渲染抛出异常

Visualforce: Render only if value is not null throws exception

我正在构建一个 visualforce 页面,其中有一个包含多个列的 apex:datatable。

现在我希望“折扣”列仅在其值不为空且 >0 时显示。

我的代码如下:

<apex:dataTable width="100%" value="{!Opportunity.OpportunityLineItems}" var="oli">
                            <apex:column width="50%" headerClass="tableheaderleft"  styleClass="tablebodyleft">
                                <apex:facet name="header">Bezeichnung</apex:facet>
                                <apex:OutputField value="{!oli.Name}"/>
                             </apex:column>
                            <apex:column width="{!If(oli.Discount!=null,If((oli.Discount>0),"10%","10%"),"10%")}" headerClass="tableheadercenter" footerClass="tablefootercenter" styleClass="tablebodycenter">
                                <apex:facet name="header">Anzahl</apex:facet>
                                <apex:OutputField value="{!oli.Quantity}"/>
                                <apex:facet name="footer"></apex:facet>
                            </apex:column>
                            <apex:column width="20%" headerClass="tableheaderright"  styleClass="tablebodyright">
                                <apex:facet name="header">Einzelbetrag</apex:facet>
                                <apex:OutputField value="{!oli.UnitPrice}"/>
                                <apex:facet name="footer"></apex:facet>
                            </apex:column>
                            
                         
                           <apex:column  rendered="{!If(oli.Discount!=null,(oli.Discount>0),false)}" headerClass="tableheadercenter" footerClass="tablefootercenter" styleClass="tablebodycenter">
                                <apex:facet name="header">Rabatt</apex:facet>
                                <apex:OutputField value="{!oli.Discount}"/>
                                <apex:facet name="footer"></apex:facet>
                            </apex:column>  
                            
                            <apex:column width="20%" headerClass="tableheaderright"  styleClass="tablebodyright">
                                <apex:facet name="header">Gesamtbetrag</apex:facet>
                                <apex:OutputField value="{!oli.TotalPrice}"/>
                                <apex:facet name="footer"></apex:facet>
                            </apex:column>                                                                                            
                        </apex:dataTable>

但我总是遇到以下异常:

javax.faces.FacesException: core.apexpages.exceptions.ApexPagesDeveloperException: 运算符“>”的参数类型不正确。

有人知道为什么会出现这个异常吗?会不会是因为折扣 returns 一个百分比值?

非常感谢!

双引号内有双引号 quotes.You 可以改用单引号。

例如

<apex:column width="{!If(oli.Discount!=null,If((oli.Discount>0),'10%','10%'),'10%')}" headerClass="tableheadercenter" footerClass="tablefootercenter" styleClass="tablebodycenter">
    <apex:facet name="header">Anzahl</apex:facet>
    <apex:OutputField value="{!oli.Quantity}"/>
    <apex:facet name="footer"></apex:facet>
</apex:column>

独立例子-

<apex:page>    
<canvas id="myCanvas" width="{! if(true == true, '300%', '200%') }" height="300" style="border:1px solid">
Your browser does not support the HTML5 canvas tag.
</canvas>
</apex:page>

您在评论中阐明了“只有在至少一行有一个值时才想显示整列”。

您是否有从 Opp 行项目到 Opp 的 Discount-related rollup summary 字段?你可以做类似 rendered="{!Opportunity.DiscountLinesCount__c > 0}"{!Opportunity.TotalDiscount__c > 0}.

的事情

如果你有 apex 控制器(或扩展),你可以检查线条并设置一些布尔标志,然后基于它进行渲染。那是正式的方式。

非官方的,您可以在数据表之前循环遍历订单项,滥用 <apex:variable> 标记。这有点hack,但它可以在没有任何顶点的情况下工作。检查我对这个问题的回答:https://salesforce.stackexchange.com/q/193169/799

像这样。没有尝试 运行 但应该会给你一些想法。

<apex:variable var="hasDiscountLines" value="{!false}" />
<apex:repeat value="{!Opportunity.OpportunityLineItems}" var="oli">
    <apex:variable var="hasDiscountLines" value="{!hasDiscountLines || oli.Discount != null}" />
</apex:repeat>

(...)
<apex:dataTable width="100%" value="{!Opportunity.OpportunityLineItems}" var="oli">
    <apex:column  rendered="{!hasDiscountLines}">
    (...)
</apex:dataTable>