【MM 小数位】SAP系统中的小数位

在SAP系统中,所有的数据系统默认是2位小数,但是针对不同的业务需求,对小数位有不同要求:

一、Currencies 

 T-code:OY04  Path:Global settings-->currencies-->set decimal places for currencies 

 这个操作时跨client的,会影响到这个服务器上的整个Client,系统会给提示:

“在您继续之前,请仔细阅读以下内容。
如果不留意此注释,您可能会用事务对系统造成不可挽回的损坏。
在 R/3 系统表中,货币字段作为小数存储,其小数位可以改变。小数位不存储在
数据库的字段中。每个货币字段对应一个货币码字段。在此事务中,您分配唯一的
小数位数给货币码。
样例: 如果您已设置货币 USD 为两个小数位并过帐 100 USD 的金额,10000 USD
的数额存储在数据库的货币字段中。除非此数量被进一步处理或输出,系统将使用
参考字段的货币码通过此表来决定小数位数。用这种方法,表的容量梢员徽返
解释,以进行进一步的处理或格式化带标点的输出。
如果在过帐后更改 USD 的小数位数,例如,改为 3,现有字段内容 10000 将在进
一步处理或输出时被解释为 10 USD (10.000)。这使系统中表的容量对于所有包含
USD 数量的货币字段,被错误解释为原来的 10%。您必须转换系统中所有包含货
币字段的表以保持数据完整性。但是,这样不能在生产系统中同时用于组织原因和
运行时方面。”

系统进入后为:

需要新增的,可以点击新增,然后指定小数位即可。USD是有2位小数的货币单位,显示的金额和表中存储的值是一样的。而像JPY这样的货币单位是没有小数的,1000 JPY保存在表中的值是10(比如系统下单:1000个 150JPY,MIGO收货了8251个,自动产生的会计凭证会自动取整)。若系统中已经存在了小数位设置,再改动小数位,会造成数据大大的差异。保存数值与显示的金额之间的关系是:

保存数值=显示金额*10^(x-2) 其中x是该货币单位的小数位数。

 SAP货币转换

  1. 如果某货币的小数位不是2位,则需要通过OY04设置其小数位数。
  1. 系统中的数据表存放的日元JPY、俄卢布RUR等货币比前台输入的金额小100倍。

系统根据OY04Talbe:TCURX)中定义的货币小数位将原金额转换成含小位小数的金额后存储(据说根据ISO的什么标准),如日元为0位小数,120日元转换后变成1.20,缩小100.如为TJLP5位小数,12.01230则转换成12012.30,扩大1000倍。

SAP在数据存储时必须要有小数位,再次查资料,发现SAP有所谓的external及internal的数据格式,不是存透明表取出的数都是external的,所以要解决此问题应在调用CONVERT_TO_LOCAL_CURRENCY 函数前,先调用一个 BAPI_CURRENCY_CONV_TO_INTERNAL 函数,就行了。

与之对应的FUNCTIONBAPI_CURRENCY_CONV_TO_EXTERNAL

二、定义度量单位小数

T-code:CUNI   path: Global settings-->check unit of measurement(decimal pl.rounding)

三、汇率的改动 

T-code:OB08 

一般记帐exchange rate type 是M . 比如local currency本位币是USD  M :  8.70000             CNY = 1 USD CNYdocument currency . 
Cny 1000    local cur.(USD)  114.94 更改汇率: 
M:8.72560  CNY = 1USD .  CNY document currency 记帐 
CNY 1000 :  local cur. (USD) 114.61 
更该汇率是系统是可行的,我想这样在使用外币记帐时,如果currencies的小数定为两位,楼上的混淆了这两概念, 产生汇兑损益易的机会会少些.  JPY的小数问题. 
写一个关于税务的报表,就是从material doc, FI doc和PO抓些字段. material doc.和FI doc的对应如下: 
mat doc tables :Mkpf( header), MSeg(item) FI doc  tables :Bkpf( Header), BSeg( Item) 
BKPF-AWKEY(Mat. doc no+公司+fiscal year或mat. no+fiscal year) 

对应到MSEG-mblnr(mat. doc. no) 
MSEG-ZEILE(itemno)*2-1对应到FI doc item的bseg-buzei(item no) 需要从BSEG带出bseg-waers document curerncy.  bseg-wrbtr (doc currency amount) bseg-dmbtr (local currency amount) 比如JPY为doc currency. Dr:12345 Cr:12345 
可bseg-wrbtr为123.45, 这样出来的报表就发生错误. 
Why?我想SAP默认的所有的currencies的小数都是2位, 这样在record一document时, 不管三七二一,一定将你输入的数字弄两个小数点. 1.USD 2位或OY04没任何动作 Dr: 12345 Cr: 12345    
在SAP中bseg-wrbtr为12345.00 Dr: 123.45 Cr:123.45 
在SAP中bseg-wrbtr为123.45 显示出来不做任何动作 
2. JPY ,OY04定义小数0表示无小数 Dr : 12345   JPY Cr : 12345   JPY 
在SAP中bseg-wrbtr为123.45 Dr : 123.45   JPY Cr : 123.45   JPY  
你不可能做出这样的document 显示出来的数据*100 
3.比如TND OY04定义小数为3. Dr 123456 cr 123456 
在SAP中bseg-wrbtr为1234560.00 Dr:123.456 Cr:123.456 
在SAP中bseg-wrbtr为1234.56 显示出来的数据/10 .  
就是所SAP保存数据和显示数据是不同的,保存在数据库中总保留两位小数,所以在做report时间要小心, 
显示数据时根据TCURX(就是OY04)里面定义的小数位进行一定计算, (自己未测试,先记录下来)。

原文地址:https://www.cnblogs.com/potatoo/p/6898232.html