各位SCN成员,大家好,
晚上好。
今天我想解释一个简单而非常重要的问题,特别是关于发送给公司总裁或副总裁的报告。
我被要求根据用户设置更改报告。为了您的理解,我给出的屏幕截图如下:
SAP菜单->系统->用户配置文件-->自己的数据,点击默认选项卡。
上面的十进制符号有3种数字格式,即空格、X和Y。
空格。"1.234.567,89
‘X’。"1234567.89
‘Y’。"1234567,89
不同的国家根据他们的居住环境或方便程度使用不同的十进制符号。
考虑到我搜索的太多了,人们在下面的功能模块中使用了货币甚至数量字段。
HRCM\U字符串\U到金额\U的转换。
但是上面的功能模块并不是适用于所有的情况。
所以,我使用了更改如下:
报表ZTEST\u数量转换
数据:SS\u USR01类型USR01
数据:LP\u数据类型REF TO DATA,360大数据,
L\u千位类型C长度1,
L\u十进制类型C长度1,
L\u翻译类型C长度2。
数据:LT\u结果类型MATCH\u结果选项卡,
LS\u结果类型MATCH\u结果,
L\u匹配类型字符串值`^\s*-?\s*(?:\d{1,3}(?)?:(T?)\d{3})?(?:\1\d{3})*(d\d*)?|D\D+)\s*$`.
数据:L\U INT TYPE STRING,
L\U DEC TYPE STRING,
INPUT TYPE STRING,
OUTPUT TYPE STRING.
参数:P\U QTY TYPE CHAR17.
断点。
字段符号:键入ANY.
创建数据LP\U DATA LIKE INPUT.
将LP\U DATA->*分配给.
=P\U QTY.
从用户记录中获取分隔符
如果SS\U USR01是初始值。
选择单*从USR01进入SS注USR01,其中BNAME EQ SY–UNAME.
ENDIF.
CASE SS注USR01–DCPFM.
WHEN SPACE."1.234.567,89
L注u milk='。
L注u DECIMAL=','。
WHEN'X."1234567.89
L注u milk=','。
L注u DECIMAL='。
WHEN'Y."1 234.567,89
L注u milk=',".
ENDCASE.
如果SS\u USR01–DCPFM"Y"。
*修改regex以处理用户选择的符号
用L\u-MATCH替换L\u-MATCH中所有出现的'T'。
else.
用""替换L\u-MATCH中所有出现的'T'。"(此语句没有出现)
*因此,我做了如下操作,
清除:L\U匹配。
*L\U匹配=`^\s*-?\s*(?:\d{1,3}(?)?:(T?)\d{3})?(?:\1\d{3})*(d\d*)?|D\D+)\s*$`."删除了带空格的T.
L\u MATCH=`^\s*-?\s*(?:\d{1,3}(?)?:( ?)\d{3})?(?:\1\d{3})*(d\d*)?|D\D+)\s*$`.
ENDIF.
IF L\u DECIMAL EQ'.
将L\u MATCH中出现的所有D替换为'\..
ELSE.
将L\u MATCH中出现的所有D替换为L\u DECIMAL.
ENDIF.
IF SS\u USR01-DCPFM'Y.
压缩NO–GAPS.
检查数字是否有效
在中查找REGEX L\u MATCH.
ENDIF.
IFSY–SUBRC不是首字母。
消息"Invalid"类型"E"。
引发异常类型CX\u SY\u CONVERSION\u NO\u NUMBER.
ENDIF.
将千位分隔符转换为"space"
将L\u千位空格连接为L\u Translate.
使用L\u Translate转换。
将十进制转换为。
将L\u十进制连接为L\u TRANSLATE.
TRANSLATE使用L\u TRANSLATE.
*删除空格
压缩无间隙
OUTPUT=.
*在所有计算后获取用户配置文件格式
数据:数量类型STPO–MENGE.
数量=输出
write:OUTPUT,/'进行计算并打印用户配置文件设置中的值:',数量
注意:当您更改用户配置文件时,如果您想查看QUAN(通常为13位和3位小数)等值的结果,您需要注销并登录一次。然后只应用用户设置。
问候,
湿婆库马尔。D
不错!!
您好,
我建议您尝试功能模块RS\ U CONV\ U EX\ U 2\ IN\ U NO\ U DD和/或RS\ U CONV\ U EX\ U 2\ IN。它们被记录下来并且做同样的工作。
亲切的问候
嗨,
你可以用ABAP命令写来实现同样的效果。。。到
这些情况是什么?
您能添加一组输入/输出来演示程序的功能吗?
旅行中阅读博客的人不太可能访问SAP服务器。
您好,Manish,
以上情况是指,当用户设置为空格时,或"X"或"Y"的情况。(我是指usr01表中的dcpfm字段。
它会转储,因此我已根据博客上提到的代码进行了更改。
您好,
siva kumar.
你能给出一些例子,说明你的程序的实际能力吗?
嗨,曼尼什,
我们的价值观如下如下:1.234.567,89,1234567.89,1234567,89,物联网模块,2.5,2,5,2 5类似于这样。
将dcpfm改为空格一次,将dcpfm改为x,将dcpfm改为y。(不同的情况)。
问候,
siva kumar。
据我所知,您编写代码是为了避免偶尔的转储,并获得正确的十进制表示法。正如Shai Sinai所指出的,WRITE..TO语句可用于根据用户配置文件获得正确的十进制表示法。
您的代码有一个注释行RAISE EXCEPTION TYPE CX\u SY\u CONVERSION\u NO\u NUMBER,这可能意味着您试图在非数字输入的情况下处理转储。
请尝试在代码段下面运行。输入1234567.89和1234567.89将给出相同的输出,而输入a1234567.89将给出错误消息而不是转储。
数据权类型stpo menge值"1234567.89"。
数据输出类型char20。
参数输入类型char17默认值"1234567.89"。
压缩输入无间隙。
尝试。
权=输入。
捕获cx\u sy\u conversion\u no\u number.
消息"Invalid"TYPE"E"。
ENDTRY.
WRITE:/input,hadoop大数据,
/quan小数2,
quan DECIMALS 2 TO output LEFT-JUSTIFIED.
WRITE:/output.
如果上面的代码没有包含任何场景,请告诉我。
我的观点是大部分REGEX和TRANSLATE部分是不需要的。
/
我唯一要更改的是捕捉cx\u sy\u转换错误(也处理溢出)。
干杯
Jānis
嗨Manish,
正是,我的团队领导强调了转储部分(不应该出现)。所以,我这样做了更改,问题就结束了。
问候,
湿婆库马尔。
如果您的ABAP版本支持字符串格式选项,那么我会说-"无事生非"。