Axapta 销售线价格字段中的舍入

Axapta 销售线价格字段中的舍入,axapta,dynamics-ax-2012,ax,Axapta,Dynamics Ax 2012,Ax,我需要在sales line、purch line和item master(销售选项卡)的价格字段中显示5位小数。 我创建了带5位小数的新EDT,以替换salesLine.SalesPrice和InventTableModule.Price字段。但一旦销售线建立起来。SalesPrice字段中的值四舍五入为2位小数。对于eg,物料主数据中的值为10.12345,但在销售行中显示为10.12000。最后3个数字不见了 到目前为止,我从各种帖子/博客中听到了多种方法 若要在RealBase EDT上

我需要在sales line、purch line和item master(销售选项卡)的价格字段中显示5位小数。 我创建了带5位小数的新EDT,以替换salesLine.SalesPrice和InventTableModule.Price字段。但一旦销售线建立起来。SalesPrice字段中的值四舍五入为2位小数。对于eg,物料主数据中的值为10.12345,但在销售行中显示为10.12000。最后3个数字不见了

到目前为止,我从各种帖子/博客中听到了多种方法

  • 若要在RealBase EDT上将NoOfDecimals属性更改为5,请在整个应用程序中有效地更改Amount字段。我不想这样做

  • 在总账>设置>货币>舍入规则中更改舍入规则。这些字段不可编辑

  • 我将PriceDiscTable.Amount字段的EDT更改为5位小数。但是没有帮助。我想我的销售价格不是来自贸易协议

  • 我有什么遗漏的吗


    谢谢

    看看PriceDisc.price()方法。即使您更改EDT中的小数或创建新的EDT方法,Dynamics也将按代码对价格进行四舍五入,无论您是从贸易协议还是InventTableModule价格字段获取价格

    PriceDisc.price()方法稍后将调用Currency.priceTypeRound(…)方法,其中它将四舍五入到2位小数:

    private Price priceTyperound(Price          _price,
                             PriceRoundOff  _unit)
    {
    Price   price;
    real    decimals;
    ;
    
    switch (this.RoundOffTypePrice)
    {
        case RoundOffType::Ordinary:
            if (_unit)
                price = round(_price, _unit);
            else
                price = round(_price,0.01);
            break;
            (...)
    
    舍入类型将取决于汇率表中最后一个选项卡(舍入)的值。因此,如果你想让小数正常工作,你必须修改更多的东西


    我希望这会有所帮助。

    看看PriceDisc.price()方法。即使您更改EDT中的小数或创建新的EDT方法,Dynamics也将按代码对价格进行四舍五入,无论您是从贸易协议还是InventTableModule价格字段获取价格

    PriceDisc.price()方法稍后将调用Currency.priceTypeRound(…)方法,其中它将四舍五入到2位小数:

    private Price priceTyperound(Price          _price,
                             PriceRoundOff  _unit)
    {
    Price   price;
    real    decimals;
    ;
    
    switch (this.RoundOffTypePrice)
    {
        case RoundOffType::Ordinary:
            if (_unit)
                price = round(_price, _unit);
            else
                price = round(_price,0.01);
            break;
            (...)
    
    舍入类型将取决于汇率表中最后一个选项卡(舍入)的值。因此,如果你想让小数正常工作,你必须修改更多的东西


    我希望这会有所帮助。

    a我想您指的是AX版本2009,因为Currency.priceTypeRound方法在2012年被弃用。但我确实在Currency表和2012年添加的一个名为CurrencyExchangeHelper的新类中找到了类似的方法。可悲的是,整个定价机制太复杂了,我决定不去管它。2012年的另一个不同之处是,很少有方法在IL中运行,所以在您更改名为“在IL中执行业务操作”的工具中的设置之前,普通调试器无法捕获它们。我现在正在大力推动销售价格,并重新计算价格,而不是凌驾于贸易协议定价逻辑之上。我完全赞成按照David Lawson的建议增加单价,而不是修改代码。谢谢你们两位研究这个问题并提出建议。

    a我想你们指的是AX版本2009,因为Currency.priceTypeRound方法在2012年被弃用。但我确实在Currency表和2012年添加的一个名为CurrencyExchangeHelper的新类中找到了类似的方法。可悲的是,整个定价机制太复杂了,我决定不去管它。2012年的另一个不同之处是,很少有方法在IL中运行,所以在您更改名为“在IL中执行业务操作”的工具中的设置之前,普通调试器无法捕获它们。我现在正在大力推动销售价格,并重新计算价格,而不是凌驾于贸易协议定价逻辑之上。我完全赞成按照David Lawson的建议增加单价,而不是修改代码。谢谢你们两位对这个问题的调查和建议。

    你们能以不同的单位销售吗?例如,如果您当前计划以千克为单位销售,则以克为单位销售。这会消除对修改的需要和aariste指出的问题吗?问题不是我卖东西,我的客户卖:)但好的一点是,我会和我的业务顾问讨论这个问题。你能在不同的单位销售吗?例如,如果您当前计划以千克为单位销售,则以克为单位销售。这会消除对修改的需要和aariste指出的问题吗?问题不在于我是谁,我的客户是:)但一个很好的观点,我将与我的业务顾问讨论这个问题。谢谢你的回复。一件奇怪的事情是,当我创建一个销售行时,它在不点击调试器的情况下初始化值(qty,saleprice)。但当我将光标移动到另一行时,调试器启动。所以我仍然不确定这些值来自哪里。我的断点位于CurrencyExchangeHelper::roundWithRuleType方法。在我的例子中,这个方法中的参数_amount的值为0,代码返回0。所以我不知道这个逻辑是怎么运作的!尝试在DS.AX的ItemId修改方法中设置断点。如果我手动尝试使用SalesLineType类的initFromInventTable方法强制salesPrice字段中的值,这也不起作用。我可以获得inventTableModule的句柄,并将值从Price字段转移到SalesPrice字段。至少我是这么想的。另一件事是因为这个方法在IL中运行,我不得不编译成IL,仍然没有帮助。我想这是因为价格是用货币四舍五入的。priceTyperound方法稍后调用。谢谢你的回复。一件奇怪的事情是,当我创建一个销售行时,它在不点击调试器的情况下初始化值(qty,saleprice)。但当我将光标移动到另一行时,调试器启动。所以我仍然不确定这些值来自哪里。我的断点位于CurrencyExchangeHelper::roundWithRuleType方法。在我的例子中,这个方法中的参数_amount的值为0,代码返回0。所以我不知道这个逻辑是怎么运作的!尝试在DS.AX的ItemId修改方法中设置断点