【问题标题】:Acumatica: Sales Order Profit Calculations errorsAcumatica:销售订单利润计算错误
【发布时间】:2016-10-14 03:59:16
【问题描述】:

我正在尝试在 SOLine 级别上进行一些简单的计算 (文档详细信息网格)和 SOOrder 级别(订单摘要区域)。

感谢另一个 stackoverflow 用户,我得到了第一个 SOLine 计算得出(称为总利润的字段(外部价格 - 外部 成本)。现在,我正在尝试计算总数的百分比 利润除以 Ext 价格(在 SOLine 水平上),但我有 问题。这是可能的吗?好像没有这个功能 认识新领域。所以我这样做了,它给出了一个 “不能除以零”错误……这是错的吗?

这是我第一次尝试使用新的自定义字段(TotalProfit 字段已经定义并且 确认工作 - 但我有这个 GP% 的问题):

    [PXUIField(DisplayName = "GP %", Enabled = false)]
    [PXFormula(typeof(Div<SOLine.curyTotalProfit, SOLine.curyLineAmt>))]
    [PXDefault(TypeCode.Decimal, "0.0")]

这是我尝试的第二个采用总利润公式的方法 并将结果除以 Ext 价格 (curylineamt) 

    [PXUIField(DisplayName = "GP %", Enabled = false)]
    [PXFormula(typeof(Div<Sub<SOLine.curyLineAmt, SOLine.curyExtCost>,SOLine.curyLineAmt>))]
    [PXDefault(TypeCode.Decimal, "0.0")]

我需要做的第二件事是显示(在订单摘要上 level) 1. 所有 SOLines TotalProfit 的总和 2. 百分比 每条生产线的总利润除以总外部成本。 - 对于这个,我知道我必须定义 pxparent 属性,但是我所有的尝试都失败了。这是我尝试过的:

我创建了两个新字段——(一个用于货币考虑):

    **(FIRST FIELD):**
    [PXParent ( typeof(Select<SOOrder,Where<SOLine.OrderNbr, Equal<Current<SOOrder.OrderNbr>>>>))]
    [PXDBCurrency(typeof(SOOrder.curyInfoID), typeof(SOOrder.usrOrderTotalProfit))]
    [PXUIField(DisplayName = "Total Profit", Enabled = false)]
    [PXFormula(null, typeof(SumCalc<SOLine.usrCuryTotalProfit>))]
    [PXDefault(TypeCode.Decimal, "0.0")]

    **(SECOND FIELD):**
    [PXDBDecimal(4)]
    [PXDefault(TypeCode.Decimal, "0.0")]

当我尝试发布此内容时,我收到错误提示类型名称 不存在,并且说它是一个属性,但用作 输入。

这些似乎应该内置到 Acumatica 中,但事实并非如此。 非常感谢任何帮助。

更新:

您好 Dmitry,非常感谢您的回复。我仍然停留在 GP% 上...我正在尝试计算我的自定义字段 (UsrCuryTotalProfit) 除以 curyLineAmt。这是我的 UsrCuryTotalProfit 字段的属性:

    [PXDBCurrency(typeof(SOLine.curyInfoID), typeof(SOLineExt.usrTotalProfit))] 
    [PXUIField(DisplayName = "Total Profit", Enabled = false)]               
    [PXFormula(typeof(Sub<SOLine.curyLineAmt, SOLine.curyExtCost>))]    
    [PXDefault(TypeCode.Decimal, "0.0")] 

所以,我将它用于我的 GP% 字段:

    [PXUIField(DisplayName = "GP %", Enabled = false)] 
    [PXFormula(typeof(Div<SOLineExt.usrTotalProfit, SOLine.curyLineAmt>))] 
    [PXDefault(TypeCode.Decimal, "0.0")] 

它发布得很好,但是当我进入销售订单屏幕并尝试在网格中添加一行时,它给了我一个错误:“尝试除以零”。我还是在这里做错了吗?

我想知道这是否与还没有任何成本或价格信息的行有关,但是在我输入任何内容之前,公式会尝试除以...不知道如何解决。

【问题讨论】:

    标签: acumatica


    【解决方案1】:
    [PXUIField(DisplayName = "GP %", Enabled = false)]
    [PXFormula(typeof(Div<SOLineTotalProfit, SOLine.curyLineAmt>))]
    [PXDefault(TypeCode.Decimal, "0.0")]
    

    这是您尝试发布的实际代码吗? 我认为这段代码中有一个错字。应该是这样的:

    [PXFormula(typeof(Div<SOLine.curyTotalProfit, SOLine.curyLineAmt>))]
    

    您还有一个不正确的父属性。您应该选择与当前记录匹配的父表。像这样:

    [PXParent(typeof(Select<SOOrder,Where<SOOrder.orderNbr, Equal<Current<SOLine.orderNbr>>>>))]
    

    但 SOLine 类中已存在该属性,无需重新放置。

    你的公式

    [PXFormula(null, typeof(SumCalc<SOLine.usrCuryTotalProfit>))]
    

    应该放在 SOLine.usrCuryTotalProfit 字段上。在第二个参数中,您应该指定应该存储结果的父 DAC 的字段。 T200 培训第 7 课很好地涵盖了父属性和公式属性。

    所以您的代码中有几个错误。您还应该更多地注意首字母的大小写。

    以下是 T100 培训的引述:

    抽象类和属性具有相同的名称,但首字母大小写不同。经过 约定,抽象类名以小写字母开头,而属性名以小写字母开头 相同的大写字母。在 BQL 语句中,数据字段由抽象类名引用,

    Visual Studio 是修复拼写错误和字母大小写的好工具。 您可以在 Visual Studio 中轻松打开自定义:

    1. 转到自定义项目
    2. 点击您的项目
    3. 点击扩展库->新建
    4. 浏览器将下载 *.bat 文件,该文件将在 Visual Studio 中打开您的自定义设置。
    5. 您将能够查看和修复编译错误,使用自动完成和语法高亮。

    更新:

    我想知道这是否与还没有任何成本或价格信息的行有关,但是在我输入任何内容之前,公式会尝试除以...不知道如何解决。

    看来你是对的。你可以这样修复它:

     [PXFormula(typeof(Switch<Case<Where<SOLine.curyLineAmt, Equal<decimal0>>, decimal0>, Div<SOLineExt.usrTotalProfit, SOLine.curyLineAmt>>))] 
    

    我认为在这种情况下你应该使用 SOLineExt.curyUsrTotalProfit。

    【讨论】:

    • 德米特里-感谢您的回复。我仍然卡住但更新了我上面的原始帖子。
    • 我试过了:[PXUIField(DisplayName = "GP %", Enabled = false)] Switch>, decimal0>, Div> [PXDefault(TypeCode.Decimal, "0.0")] 但它给了我一个错误“类、结构或接口成员声明中的无效标记'['”
    • 当然。你忘记了 PXFormula。 [PXFormula(typeof(Switch>, decimal0>, Div>))]
    • 这似乎有效,但百分比实际上显示为 0.90,而不是 90。我知道您必须将其乘以 100 才能获得百分比。我尝试了几件事,但在这里也遇到了困难。我知道我需要定义一个常量,然后在公式中使用它。这是我尝试过的(没有用): [PXFormula(typeof(Switch>, decimal0>, Mult
      >,十进制百>))]
    • Acumatica中有decimal100常量。你可以使用它。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签