在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货币转换
- 如果某货币的小数位不是2位,则需要通过OY04设置其小数位数。
- 系统中的数据表存放的日元JPY、俄卢布RUR等货币比前台输入的金额小100倍。
系统根据OY04(Talbe: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 函数,就行了。
与之对应的FUNCTION:BAPI_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)里面定义的小数位进行一定计算, (自己未测试,先记录下来)。