SAP ABAP 批导函数(封装版)

EXCEL批导函数相信大家熟悉的不能再熟悉了,但是特殊场景不同函数对工作的影响真的很大。

整理本篇文章是因为公司电脑统一使用了加密系统,通过先前的统一函数无法直接上传,每次都要先另存为TEXT文本后上传,用户体验非常差,使用起来属实不便。后来偶然的发现,函数 ALSM_EXCEL_TO_INTERNAL_TABLE 对 加密的EXCEL 同样可以丝滑读取,所以重新封装了下,在这里做个记录。(同时,新封装函数不但可以输出数据,还可以输出首行列名,在列名变化的需求中常用)。

废话不多说,直接上代码。(如果代码臃肿,自行精简)

FUNCTION zz_excel_to_internal_table.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_FILENAME) TYPE  RLGRAP-FILENAME
*"     REFERENCE(IV_SKIP) TYPE  AS4FLAG DEFAULT 'X'
*"     REFERENCE(IV_SKIP_TO) TYPE  I OPTIONAL
*"     REFERENCE(IV_END_COL) TYPE  I OPTIONAL
*"     REFERENCE(IV_END_ROW) TYPE  I DEFAULT '65000'
*"  TABLES
*"      T_DATA TYPE  STANDARD TABLE
*"      T_TITLE TYPE  STANDARD TABLE OPTIONAL
*"      T_RETURN TYPE  BAPIRET2_T OPTIONAL
*"----------------------------------------------------------------------
*&——————————————————————————————————————
  "注意事项:
  "1、默认跳过第一行,则第一行作为抬头行接收,如果不跳过,则不作为抬头行
  "2、结束列数 作为读取文件的最大列数,如果不设置,默认以传入内表的列数为准
  "3、结束行数 默认值为65000行,数值过大系统本身就无法处理,导致卡顿
  "4、函数逻辑 以通用的顺序作为判断依据,需自行识别接收表和模板字段的匹配顺序,应严格保持一致
*&——————————————————————————————————————
*Global data declarations
  TYPE-POOLS: truxs.

  DATA: cxroot            TYPE REF TO cx_root,
        lv_file           TYPE rlgrap-filename,
        lv_string         TYPE string, "文件地址
        lv_file_name      TYPE string, "文件名称(含地址)
        lv_file_type      TYPE string, "文件类型(后缀)
        lv_message        TYPE string,
        lt_intern         TYPE TABLE OF zst_mm03_alsmex_tabline WITH HEADER LINE , "alsmex_tabline
        ls_intern         TYPE zst_mm03_alsmex_tabline, "alsmex_tabline,
        lv_skip_to        TYPE i,
        lv_end_col        TYPE i,
        lv_end_row        TYPE i,

        ref_tdescr        TYPE REF TO cl_abap_typedescr,
        ref_tdescr_title  TYPE REF TO cl_abap_typedescr,
        ref_sdescr        TYPE REF TO cl_abap_structdescr,
        ref_sdescr_title  TYPE REF TO cl_abap_structdescr,
        ref_cx            TYPE REF TO cx_root,
        ref_data          TYPE REF TO data,
        ref_data_title    TYPE REF TO data,
        ls_new_line       TYPE REF TO data,
        ls_new_line_title TYPE REF TO data,
        ls_comp           TYPE abap_compdescr,
        ls_fcat           TYPE lvc_s_fcat,
        lt_fcat           TYPE lvc_t_fcat,
        lt_fcat_title     TYPE lvc_t_fcat,
        lt_raw            TYPE truxs_t_text_data,
        lt_file           TYPE STANDARD TABLE OF string.

  FIELD-SYMBOLS: <lfs_table>       TYPE STANDARD TABLE,
                 <lfs_table_title> TYPE STANDARD TABLE,
                 <lfs_struc>       TYPE any,
                 <lfs_struc_title> TYPE any,
                 <lfs_field>       TYPE any,
                 <lfs_value>       TYPE any,
                 <lfs_value_title> TYPE any,
                 <lfs_intern>      TYPE zst_mm03_alsmex_tabline. "alsmex_tabline.

  "检查文件路径
  IF iv_filename IS INITIAL.
    CLEAR: lv_message.
    lv_message = |File path is null,please check!|.
    PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
    RETURN.
  ENDIF.

  "解析数据内表
  CALL METHOD cl_abap_structdescr=>describe_by_data
    EXPORTING
      p_data      = t_data
    RECEIVING
      p_descr_ref = ref_tdescr.

  TRY.
      ref_sdescr ?= ref_tdescr.
    CATCH cx_root INTO ref_cx.
      CLEAR: lv_message.
      lv_message = ref_cx->get_text( ).

      PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
      RETURN.
  ENDTRY.

  "组装字段名,用于生成新的动态内表
  CLEAR:lv_end_col.
  LOOP AT ref_sdescr->components INTO ls_comp.
    CLEAR: ls_fcat.
    ls_fcat-fieldname = ls_comp-name.
    ls_fcat-ref_table = 'DOCS'.
    ls_fcat-ref_field = 'LINES'.
    APPEND ls_fcat TO lt_fcat.

    lv_end_col = lv_end_col + 1.
  ENDLOOP.

  IF iv_end_col IS NOT INITIAL.
    lv_end_col = iv_end_col.
  ENDIF.
  IF iv_end_row IS NOT INITIAL.
    lv_end_row = iv_end_row.
  ELSE.
    lv_end_row = '65000'.
  ENDIF.

  "生成动态内表
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog           = lt_fcat
    IMPORTING
      ep_table                  = ref_data
    EXCEPTIONS
      generate_subpool_dir_full = 1.
  IF sy-subrc <> 0 OR ref_data IS NOT BOUND.
    CLEAR: lv_message.
    lv_message = |Dynamic table creation failed|.
    PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
    RETURN.
  ENDIF.
  ASSIGN ref_data->* TO <lfs_table>.

  IF iv_skip = 'X'."跳过首行,默认将首行作为抬头行输出
    IF t_title IS SUPPLIED.
      "解析数据内表
      CALL METHOD cl_abap_structdescr=>describe_by_data
        EXPORTING
          p_data      = t_title
        RECEIVING
          p_descr_ref = ref_tdescr_title.
      TRY.
          ref_sdescr_title ?= ref_tdescr_title.
        CATCH cx_root INTO ref_cx.
          CLEAR: lv_message.
          lv_message = ref_cx->get_text( ).
          PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
          RETURN.
      ENDTRY.

      LOOP AT ref_sdescr_title->components INTO ls_comp.
        CLEAR: ls_fcat.
        ls_fcat-fieldname = ls_comp-name.
        ls_fcat-ref_table = 'DOCS'.
        ls_fcat-ref_field = 'LINES'.
        APPEND ls_fcat TO lt_fcat_title.
      ENDLOOP.

      CALL METHOD cl_alv_table_create=>create_dynamic_table
        EXPORTING
          it_fieldcatalog           = lt_fcat_title
        IMPORTING
          ep_table                  = ref_data_title
        EXCEPTIONS
          generate_subpool_dir_full = 1.

      IF sy-subrc <> 0 OR ref_data_title IS NOT BOUND.
        CLEAR: lv_message.
        lv_message = |Dynamic table for title creation failed|.
        PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
        RETURN.
      ENDIF.
      ASSIGN ref_data_title->* TO <lfs_table_title>.
    ENDIF.
  ENDIF.

  CLEAR:lv_string,lv_file_name,lv_file_type .
  lv_string = iv_filename.

  "根据文件地址获取文件后缀名,防止文件路径中多次出现文件类型,只取最后一个有效文件类型
  lv_file_type = iv_filename.
  WHILE lv_file_type CS '.'.
    SPLIT lv_file_type AT '.' INTO lv_file_name lv_file_type.
  ENDWHILE.
  TRANSLATE lv_file_type TO LOWER CASE.

  "兼容Excel 和 TXT 文本
  CASE lv_file_type.
    WHEN 'xls' OR 'xlsx'.
      CLEAR:lt_intern[].
      CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE' "'ALSM_EXCEL_TO_INTERNAL_TABLE'
        EXPORTING
          filename                = iv_filename
          i_begin_col             = 1
          i_begin_row             = 1
          i_end_col               = lv_end_col
          i_end_row               = lv_end_row
        TABLES
          intern                  = lt_intern
        EXCEPTIONS
          inconsistent_parameters = 1
          upload_ole              = 2
          OTHERS                  = 3.
      IF sy-subrc <> 0.
        CLEAR: lv_message.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.
        PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .
        RETURN.
      ENDIF.

      CREATE DATA ls_new_line LIKE LINE OF <lfs_table>.
      ASSIGN ls_new_line->* TO <lfs_struc>.

      IF <lfs_table_title> IS ASSIGNED.
        CREATE DATA ls_new_line_title LIKE LINE OF <lfs_table_title>.
        ASSIGN ls_new_line_title->* TO <lfs_struc_title>.
      ENDIF.

      LOOP AT lt_intern ASSIGNING <lfs_intern>.
        IF iv_skip EQ abap_true .
          IF <lfs_intern>-row = 1.
            "首行数据根据顺序依次填入结构中
            IF <lfs_struc_title> IS ASSIGNED.
              UNASSIGN <lfs_value_title>.
              ASSIGN COMPONENT <lfs_intern>-col OF STRUCTURE <lfs_struc_title> TO <lfs_value_title>.
              IF <lfs_value_title> IS ASSIGNED.
                TRY.
                    <lfs_value_title> = <lfs_intern>-value.
                  CATCH cx_root INTO cxroot.
                    CLEAR: lv_message.
                    lv_message = cxroot->get_text( ).
                    PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
                    RETURN.
                ENDTRY.
              ENDIF.
            ELSE.
              CONTINUE.
            ENDIF.
          ELSEIF <lfs_intern>-row = 2.
            "在读取第二行第一列的时候将抬头数据 参入参数中
            IF <lfs_intern>-col = 1 AND <lfs_struc_title> IS ASSIGNED.
              MOVE-CORRESPONDING <lfs_struc_title> TO t_title.
              APPEND t_title.
              CLEAR: <lfs_struc_title>.
            ENDIF.
          ENDIF.
        ENDIF.
        "防止因为要抬头行,没有跳过
        IF iv_skip EQ abap_true  AND <lfs_intern>-row = 1.
          CONTINUE.
        ENDIF.
        "如果需要跳过多行,根据行号判断
        IF iv_skip_to <> 0.
          IF <lfs_intern>-row <= iv_skip_to.
            CONTINUE.
          ENDIF.
        ENDIF.

        ASSIGN COMPONENT <lfs_intern>-col OF STRUCTURE <lfs_struc> TO <lfs_value>.
        IF <lfs_value> IS ASSIGNED.
          CONDENSE <lfs_intern>-value NO-GAPS.
          TRY.
              <lfs_value> = <lfs_intern>-value.
            CATCH cx_root INTO cxroot.
              CLEAR: lv_message.
              lv_message = cxroot->get_text( ).
              PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
              RETURN.
          ENDTRY.
        ENDIF.
        AT END OF row.
          MOVE-CORRESPONDING <lfs_struc> TO t_data.
          APPEND t_data.
          CLEAR: <lfs_struc>.
        ENDAT.
      ENDLOOP.

    WHEN 'txt'.
      CALL METHOD cl_gui_frontend_services=>gui_upload
        EXPORTING
          filename                = lv_string
          filetype                = 'ASC'
          has_field_separator     = cl_abap_char_utilities=>horizontal_tab
        CHANGING
          data_tab                = <lfs_table>
        EXCEPTIONS
          file_open_error         = 1
          file_read_error         = 2
          no_batch                = 3
          gui_refuse_filetransfer = 4
          invalid_type            = 5
          no_authority            = 6
          unknown_error           = 7
          bad_data_format         = 8
          header_not_allowed      = 9
          separator_not_allowed   = 10
          header_too_long         = 11
          unknown_dp_error        = 12
          access_denied           = 13
          dp_out_of_memory        = 14
          disk_full               = 15
          dp_timeout              = 16
          not_supported_by_gui    = 17
          error_no_gui            = 18.
      IF sy-subrc <> 0.
        CLEAR: lv_message.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.
        PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .
        RETURN.
      ENDIF.
      IF iv_skip EQ abap_true.
        IF <lfs_struc_title> IS ASSIGNED.
          READ TABLE <lfs_table> ASSIGNING <lfs_struc> INDEX 1.
          TRY.
              MOVE-CORRESPONDING <lfs_struc> TO t_title.
            CATCH cx_root INTO ref_cx.
              CLEAR: lv_message.
              lv_message = ref_cx->get_text( ).
              PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .

              CLEAR: lv_message.
              MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.
              PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .

              RETURN.
          ENDTRY.
        ENDIF.

        DELETE <lfs_table> INDEX 1.
      ENDIF.
      IF iv_skip_to > 1.
        CLEAR:lv_skip_to.
        IF iv_skip EQ abap_true."因为LV_INDEX = 'X',已经将第一行删除,故少删除一行
          lv_skip_to = iv_skip_to - 1.
        ELSE.
          lv_skip_to = iv_skip_to.
        ENDIF.
        DELETE <lfs_table> FROM 1 TO lv_skip_to .
      ENDIF.

      LOOP AT  <lfs_table> ASSIGNING <lfs_struc>.
        TRY.
            MOVE-CORRESPONDING <lfs_struc> TO t_data.
          CATCH cx_root INTO ref_cx.
            CLEAR: lv_message.
            lv_message = ref_cx->get_text( ).
            PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .

            CLEAR: lv_message.
            MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_message.
            PERFORM frm_append_message TABLES t_return USING sy-msgid sy-msgno sy-msgty lv_message .

            RETURN.
        ENDTRY.
        APPEND t_data.
      ENDLOOP.

    WHEN OTHERS.

      CLEAR: lv_message.
      lv_message = |The file type { lv_file_type } is not supported|.
      PERFORM frm_append_message TABLES t_return USING '00' '001' 'E' lv_message .
      RETURN.
  ENDCASE.
ENDFUNCTION.

补上消息处理的子例程.

*&---------------------------------------------------------------------*
*& Form frm_append_message
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> T_RETURN
*&      --> LV_MSG_ID
*&      --> LV_MSG_NUM
*&      --> LV_MSG_TYPE
*&      --> LV_MSG
*&---------------------------------------------------------------------*
FORM frm_append_message  TABLES   pt_return STRUCTURE bapiret2
                         USING    pv_msg_id
                                  pv_msg_num
                                  pv_msg_type
                                  pv_msg.
  DATA: ls_msg TYPE bapiret2.

  CLEAR: ls_msg.
  ls_msg-id         = '00'.
  ls_msg-type       = 'E'.
  ls_msg-number     = 001.
  ls_msg-message    = pv_msg.
  APPEND ls_msg to pt_return.
ENDFORM.

另外,由于函数 ALSM_EXCEL_TO_INTERNAL_TABLE 中 接收数据的 VALUE字段只有50个字符,完全无法满足通用场景,故复制一版,使用ZST_ALSMEX_TABLINE 替换了原先的 ALSMEX_TABLINE,除了结构替换(包括子例程用到该结构的都要替换),其他代码保持一致即可。

当然,原先的封装逻辑也是很好的,同时支持excel,csv,text等,不分好坏,只是场景适不适合而已。

FUNCTION ZZZZ_UPLOAD_FILE.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IV_FILENAME) TYPE  RLGRAP-FILENAME
*"     REFERENCE(IV_SKIP) TYPE  AS4FLAG DEFAULT 'X'
*"     REFERENCE(IV_INDEX) TYPE  I OPTIONAL
*"  TABLES
*"      T_DATA TYPE  STANDARD TABLE
*"      T_RETURN TYPE  BAPIRET2_T OPTIONAL
*"----------------------------------------------------------------------

*Global data declarations
  TYPE-POOLS: truxs.

  DATA: lv_seqno   TYPE n LENGTH 5,
        lv_str1    TYPE string,
        lv_str2    TYPE string,
        lv_file    TYPE rlgrap-filename,
        lv_count   TYPE i,

        ref_tdescr TYPE REF TO cl_abap_typedescr,
        ref_sdescr TYPE REF TO cl_abap_structdescr,
        ref_cx     TYPE REF TO cx_root,
        ref_data   TYPE REF TO data,

        ls_comp    TYPE abap_compdescr,
        ls_fcat    TYPE lvc_s_fcat,

        lt_fcat    TYPE lvc_t_fcat,
        lt_raw     TYPE truxs_t_text_data,
        lt_file    TYPE STANDARD TABLE OF string.

  FIELD-SYMBOLS: <lfs_table> TYPE STANDARD TABLE,
                 <lfs_struc> TYPE any,
                 <lfs_field> TYPE any.

  CALL METHOD cl_abap_structdescr=>describe_by_data
    EXPORTING
      p_data      = t_data
    RECEIVING
      p_descr_ref = ref_tdescr.

  TRY.
      ref_sdescr ?= ref_tdescr.
    CATCH cx_root INTO ref_cx.
      lv_str1 = ref_cx->get_text( ).
      "###¡§#######¨®#¡ì¡ã###& & & &
      CLEAR: t_return.
      t_return-id         = '00'.
      t_return-type       = 'E'.
      t_return-number     = 001.
      t_return-message_v1 = TEXT-001.
      REPLACE FIRST OCCURRENCE OF '&' IN t_return-message_v1 WITH 'T_DATA'.
      t_return-message_v2 = lv_str1.
      MESSAGE ID t_return-id
         TYPE t_return-type
       NUMBER t_return-number
         INTO t_return-message
         WITH t_return-message_v1 t_return-message_v2.
      APPEND t_return.
      RETURN.
  ENDTRY.

  lv_seqno = 1.
  LOOP AT ref_sdescr->components INTO ls_comp.
    CLEAR: ls_fcat.
    ls_fcat-fieldname = ls_comp-name.
    ls_fcat-ref_table = 'DOCS'.
    ls_fcat-ref_field = 'LINES'.
    APPEND ls_fcat TO lt_fcat.
    ADD 1 TO lv_seqno.
  ENDLOOP.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog           = lt_fcat
    IMPORTING
      ep_table                  = ref_data
    EXCEPTIONS
      generate_subpool_dir_full = 1.
  IF sy-subrc <> 0 OR ref_data IS NOT BOUND.
    "处理消息
    CLEAR: t_return.
    t_return-id         = '00'.
    t_return-type       = 'E'.
    t_return-number     = 001.
    t_return-message_v1 = TEXT-002.
    REPLACE FIRST OCCURRENCE OF '&' IN t_return-message_v1
       WITH ref_sdescr->absolute_name.
    MESSAGE ID t_return-id
       TYPE t_return-type
     NUMBER t_return-number
       INTO t_return-message
       WITH t_return-message_v1.
    APPEND t_return.
    RETURN.
  ENDIF.

  ASSIGN ref_data->* TO <lfs_table>.
  "获取最终的文件类型
  lv_str2 = iv_filename.
  WHILE lv_str2 CS '.'.
    SPLIT lv_str2 AT '.' INTO lv_str1 lv_str2.
  ENDWHILE.
  TRANSLATE lv_str2 TO LOWER CASE.

  "根据文件类型分别读取
  CASE lv_str2.
    WHEN 'xls' OR 'xlsx'.
      CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
        EXPORTING
          i_tab_raw_data       = lt_raw
          i_filename           = iv_filename
        TABLES
          i_tab_converted_data = <lfs_table>
        EXCEPTIONS
          conversion_failed    = 1.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid
           TYPE sy-msgty
         NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
        RAISING file_convert_failed.
      ENDIF.
    WHEN 'csv'.
      lv_str1 = iv_filename.
      CALL METHOD cl_gui_frontend_services=>gui_upload
        EXPORTING
          filename                = lv_str1
          filetype                = 'DAT'
        CHANGING
          data_tab                = lt_file
        EXCEPTIONS
          file_open_error         = 1
          file_read_error         = 2
          no_batch                = 3
          gui_refuse_filetransfer = 4
          invalid_type            = 5
          no_authority            = 6
          unknown_error           = 7
          bad_data_format         = 8
          header_not_allowed      = 9
          separator_not_allowed   = 10
          header_too_long         = 11
          unknown_dp_error        = 12
          access_denied           = 13
          dp_out_of_memory        = 14
          disk_full               = 15
          dp_timeout              = 16
          not_supported_by_gui    = 17
          error_no_gui            = 18.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid
           TYPE sy-msgty
         NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
        RAISING file_convert_failed.
      ENDIF.

      LOOP AT lt_file INTO lv_str1.
        APPEND INITIAL LINE TO <lfs_table> ASSIGNING <lfs_struc>.

        lv_count = 1.
        WHILE lv_str1 CS ','.
          ADD 1 TO lv_count.
          SPLIT lv_str1 AT ',' INTO lv_str2 lv_str1.
          ASSIGN COMPONENT sy-index OF STRUCTURE <lfs_struc> TO <lfs_field>.
          IF sy-subrc EQ 0.
            MOVE lv_str2 TO <lfs_field>.
          ELSE.
            EXIT.
          ENDIF.
        ENDWHILE.
        ADD 1 TO lv_count.
        IF lv_str1 IS NOT INITIAL.
          ASSIGN COMPONENT lv_count OF STRUCTURE <lfs_struc> TO <lfs_field>.
          IF sy-subrc EQ 0.
            MOVE lv_str1 TO <lfs_field>.
          ELSE.
          ENDIF.
        ENDIF.
      ENDLOOP.
    WHEN 'txt'.
      lv_str1 = iv_filename.
      CALL METHOD cl_gui_frontend_services=>gui_upload
        EXPORTING
          filename                = lv_str1
          filetype                = 'ASC'
          has_field_separator     = cl_abap_char_utilities=>horizontal_tab
        CHANGING
          data_tab                = <lfs_table>
        EXCEPTIONS
          file_open_error         = 1
          file_read_error         = 2
          no_batch                = 3
          gui_refuse_filetransfer = 4
          invalid_type            = 5
          no_authority            = 6
          unknown_error           = 7
          bad_data_format         = 8
          header_not_allowed      = 9
          separator_not_allowed   = 10
          header_too_long         = 11
          unknown_dp_error        = 12
          access_denied           = 13
          dp_out_of_memory        = 14
          disk_full               = 15
          dp_timeout              = 16
          not_supported_by_gui    = 17
          error_no_gui            = 18.
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid
           TYPE sy-msgty
         NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
        RAISING file_convert_failed.
      ENDIF.
    WHEN OTHERS.
      CLEAR: t_return.
      t_return-id         = '00'.
      t_return-type       = 'E'.
      t_return-number     = 001.
      t_return-message_v1 = TEXT-003.
      t_return-message_v2 = lv_str2.

      MESSAGE ID t_return-id
         TYPE t_return-type
       NUMBER t_return-number
         INTO t_return-message
         WITH t_return-message_v1.
      APPEND t_return.
  ENDCASE.

  IF iv_skip EQ abap_true.
    IF iv_index = ''.
      DELETE <lfs_table> INDEX 1.
    ELSE.
      DELETE <lfs_table> FROM 1 TO iv_index .
    ENDIF.
  ENDIF.
  LOOP AT <lfs_table> ASSIGNING <lfs_struc>.
    TRY.
        MOVE-CORRESPONDING <lfs_struc> TO t_data.
      CATCH cx_root INTO ref_cx.
        "¡Á#####&#¡ì¡ã###&
        CLEAR: t_return.
        t_return-id         = '00'.
        t_return-type       = 'E'.
        t_return-number     = 001.
        t_return-message_v1 = TEXT-004.
        t_return-message_v2 = sy-tabix.
        CONDENSE t_return-message_v2 NO-GAPS.
        REPLACE FIRST OCCURRENCE OF '&' IN t_return-message_v1
           WITH t_return-message_v2.
        t_return-message_v2 = ref_cx->get_text( ).

        MESSAGE ID t_return-id
           TYPE t_return-type
         NUMBER t_return-number
           INTO t_return-message
           WITH t_return-message_v1
                t_return-message_v2.
        APPEND t_return.
        RETURN.
    ENDTRY.
    APPEND t_data.
  ENDLOOP.

  READ TABLE t_return WITH KEY type = 'E' TRANSPORTING NO FIELDS.
  IF sy-subrc EQ 0.
    CLEAR: t_data.
  ENDIF.


ENDFUNCTION.

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值