把所以字符都写在一行上:
做法很简单,就是用一个内表,一个长字段(255),
然后确定每一个字段的长度,及起止,结束位置就行了。
TYPES: BEGIN OF IT_TAB_SQL,
SQL(180) TYPE C,
END OF IT_TAB_SQL.
DATA GI_TAB_SQL TYPE IT_TAB_SQL OCCURS 0 WITH HEADER LINE.
DATA:IT_POS_NEW LIKE RFPOSXEXT OCCURS 0 WITH HEADER LINE,
IT_POS_POSITIVE LIKE RFPOSXEXT OCCURS 0 WITH HEADER LINE,
IT_POS_NEGATIVE LIKE RFPOSXEXT OCCURS 0 WITH HEADER LINE,
GV_NUM TYPE I,
GV_NUMC(6) TYPE C,
GV_AMOUNTC(17) TYPE C,
GV_POSITIVE_NUM TYPE I, " Number of invoice
GV_NEGATIVE_NUM TYPE I,
GV_POSITIVE_BWWRT_SUM LIKE IT_POS_POSITIVE-BWWRT, "Sum of all invoice
GV_NEGATIVE_BWWRT_SUM LIKE IT_POS_POSITIVE-BWWRT,
GV_POSITIVE_NUMC(5) TYPE C, " Number of invoice
GV_NEGATIVE_NUMC(5) TYPE C.
CLEAR:GV_NUM,GV_NUMC,GV_AMOUNTC,GV_POSITIVE_NUM,GV_NEGATIVE_NUM,GV_POSITIVE_BWWRT_SUM,GV_POSITIVE_BWWRT_SUM,
GV_POSITIVE_NUMC,GV_NEGATIVE_NUMC.
REFRESH:IT_POS_NEW.
APPEND LINES OF IT_POS TO IT_POS_NEW.
"SORT IT_POS_NEW BY BELNR UMSKZ BWWRT.
DELETE IT_POS_NEW WHERE BELNR+0(2) <> '71'.
DELETE IT_POS_NEW WHERE UMSKZ IS NOT INITIAL.
APPEND LINES OF IT_POS_NEW TO IT_POS_POSITIVE.
APPEND LINES OF IT_POS_NEW TO IT_POS_NEGATIVE.
DELETE IT_POS_POSITIVE WHERE BWWRT < 0 .
DELETE IT_POS_NEGATIVE WHERE BWWRT >= 0 .
DESCRIBE TABLE IT_POS_POSITIVE LINES GV_POSITIVE_NUM. " Number of invoice
DESCRIBE TABLE IT_POS_NEGATIVE LINES GV_NEGATIVE_NUM.
CLEAR: GV_POSITIVE_BWWRT_SUM,GV_POSITIVE_BWWRT_SUM.
LOOP AT IT_POS_POSITIVE.
GV_POSITIVE_BWWRT_SUM = GV_POSITIVE_BWWRT_SUM + IT_POS_POSITIVE-BWWRT.
ENDLOOP.
LOOP AT IT_POS_NEGATIVE.
GV_NEGATIVE_BWWRT_SUM = GV_NEGATIVE_BWWRT_SUM + IT_POS_NEGATIVE-BWWRT.
ENDLOOP.
* 数值要补空格,金额字段不用补空格,会自动补上去的
* PERFORM. FRM_BLANK_NUM USING GV_POSITIVE_NUM CHANGING GV_POSITIVE_NUMC.
* PERFORM. FRM_BLANK_NUM USING GV_NEGATIVE_NUM CHANGING GV_NEGATIVE_NUMC.
"-------添加 FILE HEADER 数据---------------START----
GI_TAB_SQL-SQL+0(2) = '01'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(30) = 'TERRAILLON SAS'.
GI_TAB_SQL-SQL+40(30) = 'BNP PARIBAS FACTOR'.
GI_TAB_SQL-SQL+70(8) = SY-DATUM.
GI_TAB_SQL-SQL+78(2) = 'AT'.
GI_TAB_SQL-SQL+80(94) = ''.
GI_TAB_SQL-SQL+174(6) = '000001'.
APPEND GI_TAB_SQL.
GV_NUM = 1.
"-------添加 FILE HEADER 数据------------END----
"----开始添加 正数 TABLE ------start-----
"----table head------
GV_NUM = GV_NUM + 1.
CLEAR: GV_NUMC,GV_AMOUNTC.
PERFORM. FRM_ZEROR_NUM USING GV_NUM CHANGING GV_NUMC.
GI_TAB_SQL-SQL+0(2) = '20'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(8) = SY-DATUM.
GI_TAB_SQL-SQL+18(8) = SY-DATUM.
GI_TAB_SQL-SQL+26(2) = 'FR'.
GI_TAB_SQL-SQL+28(3) = 'EUR'.
GI_TAB_SQL-SQL+31(1) = '2'.
GI_TAB_SQL-SQL+32(142) = ''.
GI_TAB_SQL-SQL+174(6) = GV_NUMC.
APPEND GI_TAB_SQL.
LOOP AT IT_POS_POSITIVE.
CLEAR: GV_NUMC,GV_AMOUNTC.
"----table dody---------
GV_NUM = GV_NUM + 1.
CLEAR: GV_NUMC,GV_AMOUNTC.
PERFORM. FRM_ZEROR_NUM USING GV_NUM CHANGING GV_NUMC.
PERFORM. FRM_AMOUNT_0 USING IT_POS_POSITIVE-BWWRT CHANGING GV_AMOUNTC.
"ZBD1T
GI_TAB_SQL-SQL+0(2) = '25'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(8) = SY-DATUM.
GI_TAB_SQL-SQL+18(9) = ''.
GI_TAB_SQL-SQL+27(24) = IT_POS_POSITIVE-KONTO.
GI_TAB_SQL-SQL+51(27) = IT_POS_POSITIVE-VBELN. "XBLNR.
GI_TAB_SQL-SQL+78(17) = GV_AMOUNTC.
GI_TAB_SQL-SQL+95(8) = IT_POS_POSITIVE-BLDAT.
GI_TAB_SQL-SQL+103(8) = IT_POS_POSITIVE-FAEDT.
GI_TAB_SQL-SQL+111(1) = '3'.
GI_TAB_SQL-SQL+112(30) = ''.
GI_TAB_SQL-SQL+142(14) = ''.
GI_TAB_SQL-SQL+156(3) = ''.
GI_TAB_SQL-SQL+159(15) = ''.
GI_TAB_SQL-SQL+174(6) = GV_NUMC.
APPEND GI_TAB_SQL.
CLEAR GV_AMOUNTC.
ENDLOOP.
"--------table end-----
GV_NUM = GV_NUM + 1.
CLEAR: GV_NUMC,GV_AMOUNTC.
PERFORM. FRM_ZEROR_NUM USING GV_NUM CHANGING GV_NUMC.
PERFORM. FRM_ZEROR_NUM5 USING GV_POSITIVE_NUM CHANGING GV_POSITIVE_NUMC.
PERFORM. FRM_AMOUNT_0 USING GV_POSITIVE_BWWRT_SUM CHANGING GV_AMOUNTC.
GI_TAB_SQL-SQL+0(2) = '29'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(8) = SY-DATUM.
GI_TAB_SQL-SQL+18(8) = SY-DATUM.
GI_TAB_SQL-SQL+26(2) = 'FR'.
GI_TAB_SQL-SQL+28(3) = 'EUR'.
GI_TAB_SQL-SQL+31(1) = '2'.
GI_TAB_SQL-SQL+32(9) = ''.
GI_TAB_SQL-SQL+41(5) = GV_POSITIVE_NUMC. "Number of invoice 数值要补空格,金额字段不用补空格,会自动补上去的
GI_TAB_SQL-SQL+46(4) = ''.
GI_TAB_SQL-SQL+50(17) = GV_AMOUNTC. "Sum of all invoice
GI_TAB_SQL-SQL+67(107) = ''.
GI_TAB_SQL-SQL+174(6) = GV_NUMC.
APPEND GI_TAB_SQL.
CLEAR GV_AMOUNTC.
"----开始添加 正数 TABLE ------end-------
"----开始添加 负数 TABLE ------start-----
CLEAR: GV_NUMC,GV_AMOUNTC.
GV_NUM = GV_NUM + 1.
CLEAR: GV_NUMC,GV_AMOUNTC.
PERFORM. FRM_ZEROR_NUM USING GV_NUM CHANGING GV_NUMC.
"----table head------
GI_TAB_SQL-SQL+0(2) = '30'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(8) = SY-DATUM.
GI_TAB_SQL-SQL+18(8) = SY-DATUM.
GI_TAB_SQL-SQL+26(2) = 'FR'.
GI_TAB_SQL-SQL+28(3) = 'EUR'.
GI_TAB_SQL-SQL+31(1) = '2'.
GI_TAB_SQL-SQL+32(142) = ''.
GI_TAB_SQL-SQL+174(6) = GV_NUMC.
APPEND GI_TAB_SQL.
LOOP AT IT_POS_NEGATIVE.
"----table dody---------
GV_NUM = GV_NUM + 1.
CLEAR: GV_NUMC,GV_AMOUNTC.
PERFORM. FRM_ZEROR_NUM USING GV_NUM CHANGING GV_NUMC.
PERFORM. FRM_AMOUNT_0 USING IT_POS_NEGATIVE-BWWRT CHANGING GV_AMOUNTC.
GI_TAB_SQL-SQL+0(2) = '35'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(8) = SY-DATUM.
GI_TAB_SQL-SQL+18(9) = ''.
GI_TAB_SQL-SQL+27(24) = IT_POS_NEGATIVE-KONTO.
GI_TAB_SQL-SQL+51(27) = IT_POS_NEGATIVE-VBELN. "XBLNR.
GI_TAB_SQL-SQL+78(17) = GV_AMOUNTC.
GI_TAB_SQL-SQL+95(8) = IT_POS_NEGATIVE-BLDAT.
GI_TAB_SQL-SQL+103(8) = IT_POS_NEGATIVE-FAEDT.
GI_TAB_SQL-SQL+111(27) = ''.
GI_TAB_SQL-SQL+138(15) = ''.
GI_TAB_SQL-SQL+153(14) = ''.
GI_TAB_SQL-SQL+167(3) = ''.
GI_TAB_SQL-SQL+170(4) = ''.
GI_TAB_SQL-SQL+174(6) = GV_NUMC.
APPEND GI_TAB_SQL.
CLEAR GV_AMOUNTC.
ENDLOOP.
"--------table end-----
GV_NUM = GV_NUM + 1.
CLEAR:GV_NUMC, GV_AMOUNTC.
PERFORM. FRM_ZEROR_NUM USING GV_NUM CHANGING GV_NUMC.
PERFORM. FRM_ZEROR_NUM5 USING GV_NEGATIVE_NUM CHANGING GV_NEGATIVE_NUMC.
PERFORM. FRM_AMOUNT_0 USING GV_NEGATIVE_BWWRT_SUM CHANGING GV_AMOUNTC.
GI_TAB_SQL-SQL+0(2) = '39'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(8) = SY-DATUM.
GI_TAB_SQL-SQL+18(8) = SY-DATUM.
GI_TAB_SQL-SQL+26(2) = 'FR'.
GI_TAB_SQL-SQL+28(3) = 'EUR'.
GI_TAB_SQL-SQL+31(1) = '2'.
GI_TAB_SQL-SQL+32(9) = ''.
GI_TAB_SQL-SQL+41(5) = GV_NEGATIVE_NUMC. "Number of invoice 数值要补空格,金额字段不用补空格,会自动补上去的
GI_TAB_SQL-SQL+46(4) = ''.
GI_TAB_SQL-SQL+50(17) = GV_AMOUNTC. "Sum of all invoice
GI_TAB_SQL-SQL+67(107) = ''.
GI_TAB_SQL-SQL+174(6) = GV_NUMC.
APPEND GI_TAB_SQL.
CLEAR GV_AMOUNTC.
"----开始添加 负数 TABLE ------end------
"-------添加 FILE END 数据---------------START----
CLEAR: GV_NUMC.
GV_NUM = GV_NUM + 1.
PERFORM. FRM_ZEROR_NUM USING GV_NUM CHANGING GV_NUMC.
GI_TAB_SQL-SQL+0(2) = '98'.
GI_TAB_SQL-SQL+2(8) = '00316950'.
GI_TAB_SQL-SQL+10(30) = 'TERRAILLON SAS'.
GI_TAB_SQL-SQL+40(30) = 'BNP PARIBAS FACTOR'.
GI_TAB_SQL-SQL+70(8) = SY-DATUM.
GI_TAB_SQL-SQL+78(96) = ''.
GI_TAB_SQL-SQL+174(6) = GV_NUMC.
APPEND GI_TAB_SQL.
FORM. FRM_ZEROR_NUM USING ZNUM TYPE I CHANGING ZNUMC TYPE CHAR6.
* DATA: NUMC1 TYPE CHAR1,
* NUMC2 TYPE CHAR2,
* NUMC3 TYPE CHAR3,
* NUMC4 TYPE CHAR4,
* NUMC5 TYPE CHAR5.
ZNUMC = ZNUM.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "before the number 0 to fill the field
EXPORTING
INPUT = ZNUMC
IMPORTING
UTPUT = ZNUMC.
* CLEAR:NUMC1,NUMC2,NUMC3,NUMC4,NUMC5.
* IF ZNUM < 10.
* NUMC1 = ZNUM.
* CONCATENATE '00000' NUMC1 INTO ZNUMC.
* ELSEIF ZNUM >= 10 AND ZNUM < 100.
* NUMC2 = ZNUM.
* CONCATENATE '0000' NUMC2 INTO ZNUMC.
* ELSEIF ZNUM >= 100 AND ZNUM < 1000.
* NUMC3 = ZNUM.
* CONCATENATE '000' NUMC3 INTO ZNUMC.
* ELSEIF ZNUM >= 1000 AND ZNUM < 10000.
* NUMC4 = ZNUM.
* CONCATENATE '00' NUMC4 INTO ZNUMC.
* ELSEIF ZNUM >= 10000 AND ZNUM < 100000.
* NUMC1 = ZNUM.
* CONCATENATE '0' NUMC5 INTO ZNUMC.
* ELSEIF ZNUM >= 100000.
* ZNUMC = ZNUM.
* ENDIF.
ENDFORM. "FRM_ZEROR_NUM
FORM. FRM_ZEROR_NUM5 USING ZNUM TYPE I CHANGING ZNUMC TYPE CHAR5.
ZNUMC = ZNUM.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "before the number 0 to fill the field
EXPORTING
INPUT = ZNUMC
IMPORTING
UTPUT = ZNUMC.
ENDFORM. "FRM_ZEROR_NUM
*&---------------------------------------------------------------------*
*& Form FRM_AMOUNT_0
*&---------------------------------------------------------------------*
* 在数值前补0
*----------------------------------------------------------------------*
* -->GVBWWRT text
* -->AMOUNTC text
*----------------------------------------------------------------------*
FORM. FRM_AMOUNT_0 USING GVBWWRT LIKE RFPOSXEXT-BWWRT CHANGING AMOUNTC TYPE CHAR17.
DATA: GV_AMOUNT(17) TYPE C.
DATA: HEADER_STR1 TYPE STRING,
HEADER_STR2 TYPE STRING.
CLEAR: AMOUNTC,HEADER_STR1,HEADER_STR2.
AMOUNTC = GVBWWRT.
"no sign
SEARCH AMOUNTC FOR '-' .
IF SY-SUBRC = 0.
REPLACE '-' WITH '' INTO AMOUNTC.
ENDIF.
"no decimal separator
SEARCH AMOUNTC FOR '...' .
IF SY-SUBRC = 0.
REPLACE '.' WITH '' INTO AMOUNTC.
CONDENSE AMOUNTC.
SPLIT AMOUNTC AT '' INTO HEADER_STR1 HEADER_STR2.
CONCATENATE HEADER_STR1 HEADER_STR2 INTO AMOUNTC.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "before the number 0 to fill the field
EXPORTING
INPUT = AMOUNTC
IMPORTING
UTPUT = AMOUNTC.
ENDIF.
ENDFORM. "FRM_AMOUNT_0
*&---------------------------------------------------------------------*
*& Form FRM_ZEROR_NUM
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->ZNUM text
* -->ZNUMC text
*----------------------------------------------------------------------*
FORM. FRM_BLANK_NUM USING ZNUM TYPE I CHANGING ZNUMC TYPE CHAR5.
DATA: NUMC1 TYPE CHAR1,
NUMC2 TYPE CHAR2,
NUMC3 TYPE CHAR3,
NUMC4 TYPE CHAR4,
NUMC5 TYPE CHAR5,
ZLEN TYPE I.
NUMC5 = ZNUM.
CONDENSE NUMC5.
ZLEN = STRLEN( NUMC5 ).
CLEAR NUMC5.
CLEAR:NUMC1,NUMC2,NUMC3,NUMC4,NUMC5.
IF ZLEN = 1.
NUMC1 = ZNUM.
CONCATENATE ' ' NUMC1 INTO ZNUMC SEPARATED BY ' '.
ELSEIF ZLEN = 2.
NUMC2 = ZNUM.
CONCATENATE ' ' NUMC2 INTO ZNUMC SEPARATED BY ' '.
ELSEIF ZLEN = 3 .
NUMC3 = ZNUM.
CONCATENATE ' ' NUMC3 INTO ZNUMC SEPARATED BY ' '.
ELSEIF ZLEN = 4.
NUMC4 = ZNUM.
CONCATENATE ' ' NUMC4 INTO ZNUMC SEPARATED BY ' '.
ELSEIF ZNUM = 5 .
ZNUMC = ZNUM.
ENDIF.
ENDFORM. "FRM_ZEROR_NUM
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10339719/viewspace-629189/ ,如需转载,请注明出处,否则将追究法律责任。