首页 > 解决方案 > Visualforce:从商机对象访问价格计算

问题描述

我强迫我必须基于 Opportunity 对象构建一个自动发票生成器的问题。

我的代码如下:

    <apex:page standardController="Opportunity" showHeader="false" Language="de" renderAs="pdf" >
<!-- Reference to Style Sheet, saved under Static Resources in Salesforce. -->
<apex:stylesheet value="{!$Resource.InvoiceCSS}" />
<div>
        <!-- Below the optional text paragraph we put the table with all the products selected as Opportunity Line Items. -->
       
        <table class="products" width="100%">
            <tr>
               <td width="100%" style="vertical-align:top;">
                    <apex:dataTable width="100%" value="{!Opportunity.OpportunityLineItems}" var="oli">
                        <apex:column width="200px" headerClass="tableheaderleft" footerClass="tablefooterleft" styleClass="tablebodyleft">
                            <apex:facet name="header">Description</apex:facet>
                            <apex:OutputField value="{!oli.Name}"/>
                            
                            
                         </apex:column>
                        <apex:column width="{!If(oli.Discount!=null,If((oli.Discount>0),"25px","15px"),"15px")}" headerClass="tableheadercenter" footerClass="tablefootercenter" styleClass="tablebodycenter">
                            <apex:facet name="header">Quantity</apex:facet>
                            <apex:OutputField value="{!oli.Quantity}"/>
                            <apex:facet name="footer"></apex:facet>
                        </apex:column>
                        <apex:column width="95px" headerClass="tableheaderright" footerClass="tablefooterright" styleClass="tablebodyright">
                            <apex:facet name="header">Amount</apex:facet>
                            <apex:OutputField value="{!oli.UnitPrice}"/>
                            <apex:facet name="footer"></apex:facet>
                        </apex:column>
                
                    </apex:dataTable>
                </td>
            </tr>
            <tr><td width="50%" headerClass="tableheaderright" footerClass="tablefooterright" styleClass="tablebodyright">Subamount</td><td width="50%">EUR XXXX,XX</td></tr>
            <tr><td>VAT</td><td>EUR XXXX,XX</td></tr>
            <tr><td>Total amount</td><td>XXXX,XX</td></tr>
        </table>
        </div>

由于到目前为止产品列表运行良好,现在我需要添加增值税、小计金额和金额字段,我不知道该怎么做。

我的想法是创建引用 Pricebook 或 Opportunity Products 对象的自定义公式字段,但我无法在公式生成器中访问这些字段。这正是我的问题所在:我不知道这些对象之间的关系是如何工作的,以及我需要参考哪些字段来完成这个计算。是否有可能访问金额、增值税和子金额的标准字段?如果是,我该如何访问它?

非常感谢!!

标签: htmlsalesforceapexvisualforce

解决方案


实体关系图可以提供帮助:https ://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_erd_products.htm 。不过有点蹩脚。

如果您有自定义位,请尝试使用 Setup -> Schema Builder。

机会通过 OpportunityLineItem 与 Product 存在多对多关系。您在 ERD 上看不到它,但绝对有一个OpportunityLineItem.Product2Id查找(外键)。

与 Pricebook 的关系有点混乱。机会 -> 到行项目 -> 到价格手册条目 -> 到价格手册。

对,那么您可以做什么...您可以在商机上创建汇总汇总字段,将总税作为行项目的税总和?然后,您将在 PDF 中显示{!Opportunity.Amount}和/或某些内容。{!Opportunity.TotalTax__c}我不知道你是怎么计算税的,它是 OppLineItem 上的自定义字段吗?谁决定费率?产品?帐户所在的国家/地区?价格手册条目和您有差异条目/产品?还是您只关心 1 个国家/地区,因此您按 1 个统一费率支付并完成工作?如果它是总数的 20%,那么你已经有了Opportunity.Amount,再制定一个关于机会和工作的公式吗?

如果您不想创建一个字段 - 您可以添加一块 Apex 作为控制器扩展,查询数据,在那里进行计算并显示您的值。这可能……不太好。当我制作与会计相关的 PDF 时,我尽量让它们变得简单。没有计算,只是尽职尽责地获取由其他东西计算的值并按原样显示它们,也许还有一些格式。用户在测试期间可能不会总是发现 PDF 中的错误。如果它是一个真实的领域,那么可以报告的东西更有可能被抓住。因此,即使对于公式和汇总而言,税收计算过于混乱,我也可能会使用流/触发器来完成;将值保存到辅助字段,而不是将其隐藏在 PDF 后面。

(也有办法在纯 Visualforce 中做到这一点,没有自定义代码,巧妙地滥用apex:repeatapex:variable tags......但我再次建议不要这样做。在表示层中有舍入错误等太重要了)


推荐阅读