BDC中日期数量金额格式转换
在BDC录屏中,数量和日期格式是和su3中的设置相关的,如果格式不一致BDC会报错,
例如:日期格式不一致报错
Tcode:SU3,可以看到小数点,日期格式以及时间格式的设置。
日期:格式 DD.MM.YYYY和中文环境不同,
小数:点好做千分位,逗号做小数点 所以需要转换
- 1,日期&时间格式:方法1 write to ,这是个万金油,可以解决日期,数量,金额格式的问题;
DATA l_datum(10).
WRITE p_budat TO l_datum.
方法2,调用CONVERT_DATE_TO_EXTERNAL将日期转换为外部格式。
-
2数量转换:注意不要忘了单位 UNIT
WRITE <lfs_alv>-romen TO gwa_stpo_r-romen UNIT <lfs_alv>-romei.
- 3金额格式不一致报错:
方法1, Write to
DATA: lv_dmbtr TYPE BDCDATA-FVAL,
WRITE gt_bsik9-wrbtr_1 TO lv_dmbtr.
CONDENSE lv_dmbtr NO-GAPS.
使用WRITE TO 后得到:
WRITE TO 语法说明:
WRITE {source|(source_name)} TO destination [LEFT-JUSTIFIED|CENTERED|RIGHT-JUSTIFIED] { { [EXPONENT exp] [NO-GROUPING] [NO-SIGN] [NO-ZERO] [CURRENCY cur] { {[DECIMALS dec][ROUND scale]}|[UNIT unit]} } | {[ENVIRONMENT TIME FORMAT][TIME ZONE tz]} [STYLE stl] } [USING{ {NO EDIT MASK}|{EDIT MASK mask} }] [ DD/MM/YY|MM/DD/YY|DD/MM/YYYY|MM/DD/YYYY|DDMMYY|MMDDYY|YYMMDD ].
Write具体成什么格式的日期,这与当前用户主数据所设定的格式来显示,用户主数据日期格式可以通过以下方式获取到:
SELECT SINGLE dcpfm INTO l_dcpfm FROM usr01 WHERE bname = sy-uname.
DATA: date_short TYPE c LENGTH 8,
date_long TYPE c LENGTH 10,
date_mask TYPE c LENGTH 8,
date_mask2 TYPE c LENGTH 10.
WRITE sy-datum TO: date_short,
date_long,
date_mask USING EDIT MASK 'DD/MM/YY',
date_mask2 USING EDIT MASK 'DD/MM/YYYY'.
WRITE: sy-datum,
/ date_short,
/ date_long,
/ date_mask ,
/ date_mask2."
方法2, 使用函数转换,函数效果
正数测试
负数测试
输入
输出
函数代码
FUNCTION z_bficonver_amount_format.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(I_STRING)
*" REFERENCE(I_DECIMALS) TYPE I
*" EXPORTING
*" REFERENCE(OUT_STRING)
*"----------------------------------------------------------------------
*======================================================================*
* *
* PROGRAM : Z_BFICONVER_AMOUNT_FORMAT *
* DESCRIPTION : Convert the amount field format *
* *
* *
*======================================================================*
* *
* CREATION DATE : 14/10/2020 *
* AUTHOR : Rainy.cai *
* *
*======================================================================*
* *
* MODIFICATIONS LIST : *
* *
* ----------|----------|----------|--------------------------------- *
* N° MODIF | AUTHOR | DATE | MODIFICATION DESCRIPTION *
* ----------|----------|----------|--------------------------------- *
* XXXDATE |USER |Date |Description text of modification *
* ----------|----------|----------|--------------------------------- *
** 为清账程序转换金额字段格式
DATA:l_dcpfm LIKE usr01-dcpfm,
l_string TYPE char20,
l_reverse TYPE char20,
l_strout TYPE char20,
l_str1 TYPE string,
l_str2 TYPE string,
l_mask TYPE string.
DATA:l_lenth TYPE i.
DATA:l_lenth2 TYPE i.
CLEAR l_mask.
l_str2 = '___'.
CASE i_decimals.
WHEN 2.
l_str1 = '__'.
WHEN 3.
l_str1 = '___'.
WHEN 4.
l_str1 = '____'.
WHEN OTHERS.
ENDCASE.
**处理负数情况
IF i_string < 0.
l_string = abs( i_string ).
ELSE.
l_string = i_string.
ENDIF.
"remove Punctuation by space
REPLACE '.' WITH '' INTO l_string.
CONDENSE l_string NO-GAPS.
l_lenth = strlen( l_string ).
l_lenth2 = l_lenth - i_decimals.
CASE l_lenth2.
WHEN 1 OR 2 OR 3.
WHEN 4 OR 5 OR 6.
WHEN OTHERS.
ENDCASE.
"reverse string
CALL FUNCTION 'STRING_REVERSE'
EXPORTING
string = l_string
lang = sy-langu
IMPORTING
rstring = l_reverse.
SELECT SINGLE dcpfm INTO l_dcpfm FROM usr01 WHERE bname = sy-uname.
CASE l_dcpfm.
WHEN ''.
CASE l_lenth2.
WHEN 1 OR 2 OR 3.
CONCATENATE l_str1 l_str2 INTO l_mask SEPARATED BY ','.
WHEN 4 OR 5 OR 6.
CONCATENATE l_str2 l_str2 INTO l_mask SEPARATED BY '.'.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY ','.
WHEN 7 OR 8 OR 9.
CONCATENATE l_str2 l_str2 l_str2 INTO l_mask SEPARATED BY '.'.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY ','.
WHEN 10 OR 11 OR 12.
CONCATENATE l_str2 l_str2 l_str2 l_str2 INTO l_mask SEPARATED BY '.'.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY ','.
WHEN OTHERS.
ENDCASE.
WHEN 'X'.
CASE l_lenth2.
WHEN 1 OR 2 OR 3.
CONCATENATE l_str1 l_str2 INTO l_mask SEPARATED BY '.'.
WHEN 4 OR 5 OR 6.
CONCATENATE l_str2 l_str2 INTO l_mask SEPARATED BY ','.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY '.'.
WHEN 7 OR 8 OR 9.
CONCATENATE l_str2 l_str2 l_str2 INTO l_mask SEPARATED BY ','.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY '.'.
WHEN 10 OR 11 OR 12.
CONCATENATE l_str2 l_str2 l_str2 l_str2 INTO l_mask SEPARATED BY ','.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY '.'.
WHEN OTHERS.
ENDCASE.
WHEN 'Y'.
CASE l_lenth2.
WHEN 1 OR 2 OR 3.
CONCATENATE l_str1 l_str2 INTO l_mask SEPARATED BY ','.
WHEN 4 OR 5 OR 6.
CONCATENATE l_str2 l_str2 INTO l_mask SEPARATED BY space.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY ','.
WHEN 7 OR 8 OR 9.
CONCATENATE l_str2 l_str2 l_str2 INTO l_mask SEPARATED BY space.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY ','.
WHEN 10 OR 11 OR 12.
CONCATENATE l_str2 l_str2 l_str2 l_str2 INTO l_mask SEPARATED BY space.
CONCATENATE l_str1 l_mask INTO l_mask SEPARATED BY ','.
WHEN OTHERS.
ENDCASE.
ENDCASE.
WRITE l_reverse USING EDIT MASK l_mask TO l_strout.
IF sy-subrc = 0.
"reverse string
CALL FUNCTION 'STRING_REVERSE'
EXPORTING
string = l_strout
lang = sy-langu
IMPORTING
rstring = out_string.
ENDIF.
IF i_string < 0.
CONCATENATE out_string '-' into out_string.
** out_string = out_string * -1.
ENDIF.
ENDFUNCTION.
本人常年接收SAP运维和远程项目,ECC,S/4HANA,CRM,WDA.
远程人天可谈,终身售后,有活请联系V信:18925782767(问问题免费,欢迎交流!)
!!请关注本人技术分享公众号:SAP翔子(可扫头像二维码)
每天分享新知识,博客文章也会陆续整理并迁移至公众号,与您一起共同学习