云网站服务器_国内数据云存储_移动云数据库服务器主机-搜集站云

轻量服务器_http文件服务器_哪家好

小七 141 0

在谈到了数量显示的奇怪之处(更准确地说,是选择性地执行CUNI设置)之后,我是时候讲述SAP的一个更奇怪、更古怪的行为了。

当我浏览下面的屏幕截图(左侧:TM UI,右侧:调试器)

时,你可能会很想"什么…??"。

事实上,"457,-EUR"的金额内部存储为0045700是基于两个规则:

数据类型CURR中的基数位置无关紧要相反,该值以压缩格式写入,右对齐,贵州大数据,使用表TCURX中指定的小数位数(如果为受影响的货币维护),否则使用两个小数(这就是为什么开发人员总是强制为数据字典中的货币指定引用字段,以及使用涉及金额字段的写语句时)。

基础负责显示,并应用货币自定义。您也可以在SE16中看到预期值。

与许多其他SAP奇怪的东西一样,这一点在很长时间内都没有被注意到,因为R/3数据元素使用一个带两个小数的域,而且全球绝大多数货币也有两个小数。因此,这些值碰巧以与在UI上看到的完全相同的方式被持久化。好吧,除了日元(众所周知日元没有小数)和其他几个。在R/3表中,100日元的值被保留为1,00,这在过去引起了一些关注,快速的SCN搜索应该会发现这一点。

但是SAP TM使用了一个域,/SCMTMS/AMOUNT,它有六个小数。显然,永久免费的云服务器,设计和创建这个域的人忘记了这个行为。六个小数是无用的,不要添加任何"精度",数据元素也可以定义得很好,没有小数,没有任何明显的影响。

最终用户看不到这一切,甚至有经验的开发人员有时也会感到困惑,因为基础很好地隐藏了内部。

但是,物联网大会,有有三个方面值得一提:

当上述货币从欧元变为日元时会发生什么?如果只更改了货币(并且0045700的值在后端保持不变),那么在触发往返之后,UI中的值会突然转换为45700,00日元!!

这正是六年前发布的SAP Note 1538380之前在Web Dynpro屏幕上发生的事情。大多数用户天真的期望是,价值保持不变,并作为投诉的结果,最终作出纠正。之后,货币的变化也可能导致持久量的变化(为了保持显示稳定,DB值必须补偿小数点的差异–0045700应该变成0000457)。

持久值的变化可能会引发不必要的副作用,这就是为什么Web Dynpro引入了一个应用程序参数,wdreffieldbehavior,允许任何客户影响在这种情况下发生的事情。默认值是"常识"值–值在屏幕上保持稳定(并在DB上修改)。无论谁喜欢原始行为,都必须明确设置其他参数值。

这种情况很少发生,因为只有很少的货币偏离了"两个小数"的常见行为。

到现在为止,每个人都应该意识到,在一个系统中,小数的数量永远不应该在TCURX中改变,在这个系统中,一些金额已经与受影响的货币保持一致!!

这样做会影响持久值的解释。虽然可以编写类似XPRA的调整报告,但是没有简单的方法(除非记录所有内容)来检测哪些值发生了更改,哪些值没有发生更改,以防异常报告终止。

现在变得很有趣。sapbasis负责在ui上显示正确的值,但是内核将该值视为普通的压缩数。在两个变量之间移动数据时,会考虑小数点。

让我们假设一个TM特定变量LV_TM作为金额,如果您注意的话,它有六个小数,另一个变量LV_ERP-一个像经典商务套件中那样有两个小数的金额。

LV_TM的值为15.000,武汉大数据,-欧元,因此内部格式为1500000(您需要)可能已经注意到我一直使用欧洲数字符号:逗号作为基数字符,句号作为数字组分隔符)。在执行报表

时,结果将显示LV泷U ERP的内部值为1,50,代表1,50欧元。同样,LV泷U ERP中的3,14欧元将变成LV泷U TM中的3140000欧元,这当然意味着31.400欧元,购物返现,

这种错误经常发生在SAP系统和"外部"世界之间的代码中–B2B、A2A接口受到影响。甚至SAP TM和SAP ERP之间的集成也会受到影响。在这种情况下,不能使用MOVE语句,而应使用合适的中心例程,如函数组ISOC中的函数模块(如CURRENCY\u AMOUNT\u BAPI\u TO\u SAP)或类CL\u GDT\u转换中与金额相关的方法,有些程序员只是简单地将这些数字相乘或除(小数点的差为/除以10),而不是使用上述函数。您可能会遇到–例如,在与结算文件传输到ERP相关的TM代码中–像

这样的语句当然有效,而且非常安全(任何头脑正常的人都不会更改TM和ERP中金额域的定义),但我个人更喜欢使用中心方法,因为它使情况更加透明。一个初学者看了上面的语句,几乎没有机会弄明白为什么这个值必须乘以一万。在另一种情况下,技术上的解释也不简单,但中心方法至少给出了一个提示,说明需要进行某种特殊处理。

-

PS:您可以在CL\u GDT\u CONVERSION=>AMOUNT\u INBOUND的源代码中看到,没有在TCURX中维护的货币是如何默认为两位小数: