ABAP 转换内表为CSV函数

FUNCTION ZKJ_SAP_CONVERT_TO_CSV_FORMAT1.
*"----------------------------------------------------------------------
*"*"ローカルインタフェース:
*"  IMPORTING
*"     VALUE(I_FIELD_SEPERATOR) TYPE  CHAR03 OPTIONAL
*"     VALUE(I_LINE_HEADER) TYPE  CHAR01 OPTIONAL
*"     VALUE(I_FILENAME) LIKE  RLGRAP-FILENAME OPTIONAL
*"     VALUE(I_APPL_KEEP) TYPE  CHAR01 DEFAULT SPACE
*"  TABLES
*"      I_TAB_SAP_DATA TYPE  STANDARD TABLE
*"  CHANGING
*"     VALUE(I_TAB_CONVERTED_DATA) TYPE  TRUXS_T_TEXT_DATA OPTIONAL
*"  EXCEPTIONS
*"      CONVERSION_FAILED
*"----------------------------------------------------------------------
  "  CONSTANTS: C_FIELD_SEPARATOR VALUE ';'.
  DATA:c_field_separator(003.
  IF i_field_seperator IS INITIAL .
    c_field_separator '","'.
  ELSE.
    c_field_separator =  i_field_seperator.
  ENDIF.
  DATA:
        l_start_string LIKE sy-fdpos,
        l_end_string LIKE sy-fdpos,
        l_len_string(6TYPE n,
        l_eol_string LIKE sy-fdpos,
        l_start_target_string LIKE sy-fdpos,
        l_end_target_string LIKE sy-fdpos,
        l_len_target_string(6TYPE n,
        l_eol_target_string LIKE sy-fdpos,
        l_conv_data TYPE LINE OF truxs_t_text_data,
        l_csv_data TYPE LINE OF truxs_t_text_data.

  CALL FUNCTION 'ZKJ_SAP_CONVERT_TO_TEX_FORMAT'
    EXPORTING
      i_field_seperator    c_field_separator
      i_line_header        i_line_header
      i_filename           i_filename
    TABLES
      i_tab_sap_data       i_tab_sap_data
    CHANGING
      i_tab_converted_data i_tab_converted_data
    EXCEPTIONS
      conversion_failed    4.

  CHECK sy-subrc <> 0.
*  if sy-subrc <> c_rc0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
          RAISING conversion_failed.
*  endif.

  DESCRIBE FIELD l_csv_data LENGTH l_len_target_string
                                     IN CHARACTER MODE.
  DESCRIBE FIELD l_conv_data LENGTH l_eol_string
                                     IN CHARACTER MODE.
  LOOP AT i_tab_converted_data INTO l_conv_data.
    l_start_string 1.
    CLEARl_csv_data,
           l_start_target_string,
           l_end_target_string.
    DO.
      SEARCH l_conv_data FOR c_field_separator STARTING AT
                                                  l_start_string
                                                  ENDING AT
                                                  l_eol_string.
      IF sy-subrc <> 0.
        EXIT.
      ENDIF.
      IF sy-subrc 0.
        l_end_string l_start_string + sy-fdpos.
        l_len_string l_end_string l_start_string + 1.
        l_start_string l_start_string 1.
        l_end_target_string l_end_target_string + l_len_string + 4.
        IF l_end_target_string < l_len_target_string.
          l_csv_data+l_start_target_string(3'"""'.
          l_start_target_string l_start_target_string + 3.
          l_csv_data+l_start_target_string(l_len_string=
                                      l_conv_data+l_start_string.
          l_start_target_string l_start_target_string + l_len_string
                                                        1.
          l_csv_data+l_start_target_string(1'"'.
          l_start_target_string l_start_target_string + 1.
          l_csv_data+l_start_target_string(1';'.
          l_end_target_string strlenl_csv_data ).
          l_start_target_string l_end_target_string.
          l_start_string l_end_string + 1.
        ELSE.
          EXIT.
        ENDIF.
      ENDIF.
    ENDDO.
    MODIFY i_tab_converted_data FROM l_csv_data.
  ENDLOOP.
ENDFUNCTION.


附属函数:ZKJ_SAP_CONVERT_TO_TEX_FORMAT

FUNCTION ZKJ_SAP_CONVERT_TO_TEX_FORMAT.
*"----------------------------------------------------------------------
*"*"ローカルインタフェース:
*"  IMPORTING
*"     VALUE(I_FIELD_SEPERATOR) TYPE  CHAR03
*"     VALUE(I_LINE_HEADER) TYPE  CHAR01 OPTIONAL
*"     VALUE(I_FILENAME) LIKE  RLGRAP-FILENAME OPTIONAL
*"     VALUE(I_APPL_KEEP) TYPE  CHAR01 DEFAULT SPACE
*"  TABLES
*"      I_TAB_SAP_DATA TYPE  STANDARD TABLE
*"  CHANGING
*"     VALUE(I_TAB_CONVERTED_DATA) TYPE  TRUXS_T_TEXT_DATA OPTIONAL
*"  EXCEPTIONS
*"      CONVERSION_FAILED
*"----------------------------------------------------------------------
  FIELD-SYMBOLS<F_SOURCE>.

  DATA:
        L_PERCENTAGE(4)  TYPE C,
        L_TEXT80(80),
        L_TEXT6(6),
        L_ITAB_ENTRIES LIKE SY-TABIX,
        L_TABIX LIKE SY-TABIX,
        L_HELP_ID LIKE TLINE-TDLINE,
        L_STRUC_RAW_DATA LIKE LINE OF I_TAB_CONVERTED_DATA,
        L_STRUC_COL_NAMES LIKE LINE OF I_TAB_CONVERTED_DATA,
        L_MAX_FIELD LIKE L_STRUC_RAW_DATA,
        L_DATE_EXTERN(30TYPE C,
        L_TYPE,
        L_EDIT_MASK(10TYPE C,
        L_LEN_STRING  TYPE I,
        L_LEN_COL_STRING  TYPE I,
        L_LEN_FIELD_SEP TYPE I,
        L_START_STRING TYPE I,
        L_START_COL_STRING TYPE I,
        L_END_STRING TYPE I,
        L_END_COL_STRING TYPE I,
        L_EOL_STRING TYPE I,
        L_STRUC_INDEX LIKE SY-INDEX.

  CLEAR I_LINE_HEADER.                 " is not supported yet.

  CLEARI_TAB_CONVERTED_DATA.
  REFRESHI_TAB_CONVERTED_DATA.

  DESCRIBE FIELD L_STRUC_RAW_DATA LENGTH L_EOL_STRING
                                    in character mode.
  L_LEN_FIELD_SEP STRLENI_FIELD_SEPERATOR ).

  DESCRIBE TABLE I_TAB_SAP_DATA LINES L_ITAB_ENTRIES.
  LOOP AT I_TAB_SAP_DATA.
    L_TABIX SY-TABIX.
    CLEARL_STRUC_INDEXL_STRUC_RAW_DATAL_START_STRING,
           L_START_COL_STRING.
    IF SY-BATCH IS INITIAL.
      L_PERCENTAGE L_TABIX / L_ITAB_ENTRIES * 100.
      L_TEXT6 L_TABIX.
      CONDENSE L_TEXT6 NO-GAPS.
      L_TEXT80 TEXT-KON.
      REPLACE '&&&&&&' WITH L_TEXT6 INTO L_TEXT80.
      L_TEXT6 L_ITAB_ENTRIES.
      REPLACE '&&&&&&' WITH L_TEXT6 INTO L_TEXT80.
      CONDENSE L_TEXT80.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
           EXPORTING
                PERCENTAGE L_PERCENTAGE
                TEXT       L_TEXT80.
    ENDIF.
    DO.
      L_STRUC_INDEX L_STRUC_INDEX + 1.
      CLEAR L_LEN_STRING.
      ASSIGN COMPONENT L_STRUC_INDEX OF
               STRUCTURE I_TAB_SAP_DATA TO <F_SOURCE>.
      IF SY-SUBRC <> 0.
        EXIT.
      ELSE.
*       header line versorgen
        IF L_TABIX AND NOT I_LINE_HEADER IS INITIAL.
          ASSIGN COMPONENT L_STRUC_INDEX OF
                   STRUCTURE I_TAB_SAP_DATA TO <F_SOURCE>.
          DESCRIBE FIELD <F_SOURCE>  HELP-ID L_HELP_ID.
          CONDENSE L_HELP_ID.
          L_LEN_COL_STRING STRLENL_HELP_ID ).
          IF L_LEN_COL_STRING <> 0.
            IF L_STRUC_INDEX <> 1.
              L_STRUC_COL_NAMES+L_START_COL_STRING(L_LEN_COL_STRING=
                                                   I_FIELD_SEPERATOR.
              L_LEN_COL_STRING L_LEN_FIELD_SEP.
            ENDIF.
            L_END_COL_STRING L_START_COL_STRING + L_LEN_COL_STRING.
            IF L_END_COL_STRING > L_EOL_STRING.
              MESSAGE ID 'UX' TYPE 'E' NUMBER 898
                         WITH L_TABIX L_STRUC_INDEX
                              RAISING CONVERSION_FAILED.
            ENDIF.
            L_STRUC_COL_NAMES+L_START_COL_STRING(L_LEN_COL_STRING=
                                           L_HELP_ID.
            L_START_COL_STRING L_START_COL_STRING + L_LEN_COL_STRING.
          ENDIF.
        ENDIF.
*       Special processing when field is type DATA
        DESCRIBE FIELD <F_SOURCE> TYPE L_TYPE.
        CASE L_TYPE.
          WHEN 'P'.
            WRITE <F_SOURCE> TO L_DATE_EXTERN.
            CATCH SYSTEM-EXCEPTIONS CONVERSION_ERRORS  4.
              IF SY-SUBRC <> 0.
                MESSAGE E899(UXWITH L_TYPE <F_SOURCE> L_HELP_ID
                                      L_TABIX RAISING CONVERSION_FAILED.
              ENDIF.
            ENDCATCH.
            ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
          WHEN 'X'.
            ASSIGN COMPONENT L_STRUC_INDEX OF
                    STRUCTURE I_TAB_SAP_DATA TO <F_SOURCE> TYPE 'C'.
            WRITE <F_SOURCE> TO L_DATE_EXTERN.
            ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
          WHEN 'T'.
            CLEAR L_DATE_EXTERN.
            L_DATE_EXTERN(2<F_SOURCE>(2).
            L_DATE_EXTERN+2(1':'.
            L_DATE_EXTERN+3(2<F_SOURCE>+2(2).
            L_DATE_EXTERN+5(1':'.
            L_DATE_EXTERN+6(2<F_SOURCE>+4(2).
            ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
          WHEN 'D'.
            CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
                 EXPORTING
                      DATE_INTERNAL <F_SOURCE>
                 IMPORTING
                      DATE_EXTERNAL L_DATE_EXTERN
                 EXCEPTIONS
                      OTHERS        4.
            IF SY-SUBRC <> 0.
              MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
                    RAISING CONVERSION_FAILED.
            ELSE.
              ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
            ENDIF.
          WHEN 'F'.
            CALL FUNCTION 'FLTP_CHAR_CONVERSION'
                 EXPORTING
                      INPUT  <F_SOURCE>
                 IMPORTING
                      FLSTR  L_DATE_EXTERN
                 EXCEPTIONS
                      OTHERS 4.
            IF SY-SUBRC <> 0.
              MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                    WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4
                    RAISING CONVERSION_FAILED.
            ELSE.
              ASSIGN L_DATE_EXTERN TO <F_SOURCE>.
            ENDIF.
          WHEN OTHERS.
        ENDCASE.
*       remember der seperation character!
        IF L_STRUC_INDEX <> 1.
          L_MAX_FIELD+L_LEN_STRING(L_LEN_FIELD_SEPI_FIELD_SEPERATOR.
          L_LEN_STRING L_LEN_FIELD_SEP.
        ENDIF.
        IF <F_SOURCE> CO '1234567890'.
          CONDENSE <F_SOURCE> NO-GAPS.
        ELSE.
          CONDENSE <F_SOURCE>.
        ENDIF.
        L_MAX_FIELD+L_LEN_STRING <F_SOURCE>.
*       check the remaining space of target structure
        L_LEN_STRING STRLENL_MAX_FIELD ).
        CHECK L_LEN_STRING <> 0.
        L_END_STRING L_START_STRING + L_LEN_STRING.
        IF L_END_STRING > L_EOL_STRING.
          MESSAGE ID 'UX' TYPE 'E' NUMBER 898
                     WITH L_TABIX L_STRUC_INDEX
                          RAISING CONVERSION_FAILED.
        ENDIF.
        L_STRUC_RAW_DATA+L_START_STRING(L_LEN_STRINGL_MAX_FIELD.
        L_START_STRING L_START_STRING + L_LEN_STRING.
      ENDIF.
    ENDDO.
    IF L_TABIX AND NOT L_STRUC_COL_NAMES IS INITIAL.
      APPEND L_STRUC_COL_NAMES TO I_TAB_CONVERTED_DATA.
      CLEAR L_STRUC_COL_NAMES.
    ENDIF.
    IF NOT L_STRUC_RAW_DATA IS INITIAL.
      APPEND L_STRUC_RAW_DATA TO I_TAB_CONVERTED_DATA.
    ENDIF.
  ENDLOOP.
ENDFUNCTION.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值