cl_wdr_conversion_utils=>from_string

发布时间 2023-08-15 10:03:37作者: 客于溟

在sap中,每种货币单位都可以维护对应的小数位数(如果未维护,则使用默认两位小数),该信息保存在表tcurx中。

在使用TCode:OY04更改该数据时,会有如下提示:
在您继续之前,请仔细阅读以下内容。
如果不留意此注释,您可能会用事务对系统造成不可挽回的损坏。
在 R/3 系统表中,货币字段作为小数存储,其小数位可以改变。小数位不存储在
数据库的字段中。每个货币字段对应一个货币码字段。在此事务中,您分配唯一的
小数位数给货币码。
样例: 如果您已设置货币 USD 为两个小数位并过帐 100 USD 的金额,10000 USD
的数额存储在数据库的货币字段中。除非此数量被进一步处理或输出,系统将使用
参考字段的货币码通过此表来决定小数位数。用这种方法,表的容量梢员徽返
解释,以进行进一步的处理或格式化带标点的输出。
如果在过帐后更改 USD 的小数位数,例如,改为 3,现有字段内容 10000 将在进
一步处理或输出时被解释为 10 USD (10.000)。这使系统中表的容量对于所有包含
USD 数量的货币字段,被错误解释为原来的 10%。您必须转换系统中所有包含货
币字段的表以保持数据完整性。但是,这样不能在生产系统中同时用于组织原因和
运行时方面。
如果在生产系统中进行更改或并将其传输到生产系统中,TCURX 表的以下更改可能
导致数据完整性的损失:
o 对现有货币的小数位进行更改
o 从 TCURX 表中删除条目 (相应地将小数位更改为两位小数的标准值)
o 在 TCURX 中插入条目(相应地将两位小数标准值改为另一个值),此条目是现有的
货币代码
在定制新的安装,甚至插入 TCURX 的操作期间,可以对此表进行任意的修改,
如果货币代码已使用事务 0Y03 输入到 TCURC 表中,表示对这些货币代码尚未过
帐。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

可用如下代码,检查输入值是否正确(比如小数位数是否过多等)

 1 FORM test_check_decimal.
 2 
 3   DATA: lv_input  TYPE dmbtr VALUE '1.23',
 4         lv_output TYPE dmbtr.
 5   DATA: lv_reference_value TYPE waers VALUE 'JPY'.
 6 
 7   DATA: ls_attribute_info TYPE wdr_context_attribute_info.
 8   ls_attribute_info-rtti ?= cl_abap_typedescr=>describe_by_data( lv_input ).
 9   TRY.
10       cl_wdr_conversion_utils=>from_string( EXPORTING in              = |{ lv_input }|
11                                                       num_decimals    = 0
12                                                       attribute_info  = ls_attribute_info
13                                                       reference_type  = 'c'
14                                                       reference_value = lv_reference_value
15                                             CHANGING data = lv_output ).
16     CATCH cx_wdr_conversion_exception INTO DATA(lcx_exception).
17       DATA(lv_message) = lcx_exception->get_text( ).
18 *      lcx_exception->maxdigits
19   ENDTRY.
20 
21 ENDFORM.