首页 文章

Acumatica:销售订单利润计算错误

提问于
浏览
0

我试图在SOLine级别(文档详细信息网格)和SOOrder级别(订单摘要区域)上进行一些简单的计算 . 感谢另一个stackoverflow用户,我得到了第一个SOLine计算(Field称为Total profit(Ext Price - Ext Cost) . 现在,我试图计算Total利润除以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”)]
我需要做的第二件事是显示(在订单汇总级别)1 . 所有SOLINE TotalProfit和2的总和 . 每行总利润的百分比除以总计费用 . - 对于这个,我知道我必须定义pxparent属性,但我的所有尝试都失败了 . 这是我尝试过的:我创建了两个新字段 - (一个用于货币考虑):(第一个字段):
[PXParent(typeof(选择<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”)]

(第二场):
[PXDBDecimal(4)]
[PXDefault(TypeCode.Decimal,“0.0”)]
当我尝试发布这个时,我得到错误,说类型名称不存在,并且说它是属性但是像类型一样使用 . 这些似乎应该被构建到Acumatica中,但它们不是 . 任何帮助是极大的赞赏 .

更新:

嗨德米特里,非常感谢您的回复 . 我仍然坚持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")]

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

我想知道这是否与行没有任何成本或价格信息有关,但公式试图划分之前我输入任何东西...不知道如何解决 .

1 回答

  • 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中轻松打开自定义:

    • 转到自定义项目

    • 点击你的项目

    • 单击扩展库 - >新建

    • 浏览器将下载* .bat文件,该文件将在visual studio中打开您的自定义 .

    • 您将能够查看并修复编译错误,使用自动完成和语法高亮 .

    更新:

    我想知道这是否与行没有任何成本或价格信息有关,但公式试图在我输入任何东西之前划分...不确定如何修复 .

    看起来你是对的 . 你可以这样解决它:

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

    另外我认为在这种情况下你应该使用SOLINEExt.curyUsrTotalProfit .

相关问题