RFC_READ_TABLE 详细用法

来源:互联网 发布:分销商城源码 编辑:程序博客网 时间:2024/06/06 17:20

*&---------------------------------------------------------------------*
*& Report  ZCME_COPY_DATA
*&
*&---------------------------------------------------------------------*
*& 有一些缺陷,大数据时,表的字段长度大于 512 时的解决方法
*&第一次取结构,不管是什么数据类型的。反正你读出结构,创建动态内表。
*&然后你得到结构之后(内表). loop 这张内表,  累加它的字段长度,

*&小于等于 512 时再执行一次这个function 取数据(带关键字段,执行完了,

*&按照关键字段来合并数据),反复这样的操作。 需要写一个大方法

*&---------------------------------------------------------------------*

REPORT ZCME_COPY_DATA_D.

TABLES RSRD1.
SELECT-OPTIONS S_TAB FOR RSRD1-TBMA_VAL OBLIGATORY.
PARAMETERS P_DES TYPE RSEDR-SYSID.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_DES.

  PERFORM SEARCH_HELP.

START-OF-SELECTION.

  PERFORM GET_TABLE_NAME.
*&---------------------------------------------------------------------*
*&      Form  GET_TABLE_NAME
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM GET_TABLE_NAME .
  DATA LT_DD02L TYPE STANDARD TABLE OF DD02L.
  DATA LS_DD02L TYPE DD02L.
  DATA LT_RFC_DB_OPT TYPE STANDARD TABLE OF RFC_DB_OPT.
  DATA LT_RFC_DB_FLD TYPE STANDARD TABLE OF RFC_DB_FLD.
  DATA LT_TAB512     TYPE STANDARD TABLE OF TAB512.
  DATA LS_TAB512     TYPE TAB512.
  DATA DY_TABLE TYPE REF TO DATA.
  DATA DY_LINE  TYPE REF TO DATA.
  DATA IFC TYPE LVC_T_FCAT.
  DATA REF_TABLE_DES TYPE REF TO CL_ABAP_TYPEDESCR.
  FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
                 <DYN_WA>.


  SELECT * INTO TABLE LT_DD02L
    FROM DD02L
    WHERE TABNAME IN S_TAB
      AND AS4LOCAL = 'A'
      AND TABNAME LIKE 'ZCME_%'.

  LOOP AT LT_DD02L INTO LS_DD02L.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'.

    REFRESH: LT_TAB512,LT_RFC_DB_FLD,LT_RFC_DB_OPT.

    CALL FUNCTION 'RFC_READ_TABLE'
      DESTINATION P_DES
      EXPORTING
        QUERY_TABLE          = LS_DD02L-TABNAME
      TABLES
        OPTIONS              = LT_RFC_DB_OPT
        FIELDS               = LT_RFC_DB_FLD
        DATA                 = LT_TAB512
      EXCEPTIONS
        TABLE_NOT_AVAILABLE  = 1
        TABLE_WITHOUT_DATA   = 2
        OPTION_NOT_VALID     = 3
        FIELD_NOT_VALID      = 4
        NOT_AUTHORIZED       = 5
        DATA_BUFFER_EXCEEDED = 6
        OTHERS               = 7.
    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    CREATE DATA DY_TABLE TYPE TABLE OF (LS_DD02L-TABNAME).
      ASSIGN DY_TABLE->* TO <DYN_TABLE>.
    CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE>.
      ASSIGN DY_LINE->* TO <DYN_WA>.

    LOOP AT LT_TAB512 INTO LS_TAB512.
      ASSIGN LS_TAB512-WA TO <DYN_WA>.
*casting type (ls_dd02l-tabname).
      APPEND <DYN_WA> TO <DYN_TABLE>.
    ENDLOOP.

    LOOP AT LT_TAB512 INTO LS_TAB512.
      ASSIGN LS_TAB512-WA TO <DYN_WA>.
*       casting type (ls_dd02l-tabname).
     MODIFY (LS_DD02L-TABNAME) FROM <DYN_WA> .
     IF SY-SUBRC = 0.
      COMMIT WORK.
     ENDIF.
    ENDLOOP.

*    check <dyn_table> is not initial.
*    delete from (ls_dd02l-tabname).
*    insert (ls_dd02l-tabname) from table <dyn_table>.
*    if sy-subrc = 0.
*      commit work.
*    endif.
    WRITE AT: / LS_DD02L-TABNAME.
  ENDLOOP.

ENDFORM.                    " GET_TABLE_NAME
*&---------------------------------------------------------------------*
*&      Form  SEARCH_HELP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SEARCH_HELP .

  DATA: RFCDEST       TYPE RFCDES-RFCDEST.

  RFCDEST = P_DES.
  CALL FUNCTION 'SCT2_GET_RFC_DESTINATION_F4'
    EXPORTING
      IV_RFC_DEST_TYPE      = '3'
      IV_POPUP_START_X      = 5
      IV_POPUP_START_Y      = 5
    CHANGING
      CV_RFC_DEST           = RFCDEST
    EXCEPTIONS
      RFC_DEST_NOT_FOUND    = 1
      CANCEL_BUTTON_PRESSED = 2
      OTHERS                = 3.

  P_DES = RFCDEST.

ENDFORM.                    " SEARCH_HELP

原创粉丝点击