美文网首页
SAP ABAP动态内表

SAP ABAP动态内表

作者: 赵大宝宝 | 来源:发表于2019-11-13 09:49 被阅读0次

    动态内表的创建和使用主要有以下几点,其中方法三最简单。:

    1.动态内表的创建,首先要定义动态结构,然后再根据定义的动态结构利用系统一个标准的method:”cl_ALV_table_create=>create_dynamic_table“生成动态内表。
    2.动态内表的赋值,遍历动态结构,获取指定的字段,然后给指定的字段赋值。
    3.动态内表的读取显示,与赋值相似,遍历动态结构,获取指定的字段,然后读取对应字段的值。

    2.代码如下

    TYPE-POOLS:ABAP.
    
    PARAMETERS P_NAME TYPE TABNAME.
    
    DATA LT_TABLE TYPE TABLE OF DFIES. "字段结构表
    DATA LS_TABLE TYPE DFIES.
    
    DATA LR_STRUC TYPE REF TO CL_ABAP_STRUCTDESCR.
    DATA LR_TABLE TYPE REF TO CL_ABAP_TABLEDESCR.
    
    DATA LR_TYPE TYPE REF TO CL_ABAP_TYPEDESCR.
    DATA LR_DATA  TYPE REF TO CL_ABAP_DATADESCR.
    
    DATA LT_COMP TYPE  ABAP_COMPONENT_TAB.
    DATA LS_COMP LIKE LINE OF  LT_COMP.
    
    DATA DYN_WA TYPE REF TO DATA.
    DATA DYN_TABLE TYPE REF TO DATA.
    
    DATA L_STRING TYPE STRING.
    
    FIELD-SYMBOLS: <DYN_TABLE> TYPE STANDARD TABLE,
                   <DYN_WA>    TYPE ANY.
    
    *1.获取表中的字段结构
    CALL FUNCTION 'DDIF_NAMETAB_GET'
      EXPORTING
        TABNAME   = P_NAME
      TABLES
        DFIES_TAB = LT_TABLE
      EXCEPTIONS
        NOT_FOUND = 1
        OTHERS    = 2.
    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    
    
    LOOP AT LT_TABLE INTO LS_TABLE.
    
      CONCATENATE LS_TABLE-TABNAME '-' LS_TABLE-FIELDNAME INTO L_STRING.
    
      LS_COMP-NAME = LS_TABLE-FIELDNAME.
    *读取字段类型
      CALL METHOD CL_ABAP_DATADESCR=>DESCRIBE_BY_NAME
        EXPORTING
          P_NAME         = L_STRING
        RECEIVING
          P_DESCR_REF    = LR_TYPE
        EXCEPTIONS
          TYPE_NOT_FOUND = 1
          OTHERS         = 2.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                   WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
    
      LS_COMP-TYPE ?= LR_TYPE.
      APPEND LS_COMP TO LT_COMP.
      CLEAR LS_COMP.
    ENDLOOP.
    
    *根据字段目录创建动态结构类型
    CALL METHOD CL_ABAP_STRUCTDESCR=>CREATE
      EXPORTING
        P_COMPONENTS = LT_COMP
      RECEIVING
        P_RESULT     = LR_STRUC.
    
    *根据动态结构创建动态内表类型
    CALL METHOD CL_ABAP_TABLEDESCR=>CREATE
      EXPORTING
        P_LINE_TYPE = LR_STRUC
      RECEIVING
        P_RESULT    = LR_TABLE.
    
    *参照动态结构类型和动态内表类型创建内表与工作区
    CREATE DATA DYN_WA    TYPE HANDLE LR_STRUC.
    CREATE DATA DYN_TABLE TYPE HANDLE LR_TABLE.
    
    *指定内表与工作区到字段符号
    ASSIGN DYN_WA->* TO <DYN_WA>.
    ASSIGN DYN_TABLE->* TO <DYN_TABLE>.
    
    
    *从动态表中取数到动态内表中
    SELECT * INTO CORRESPONDING FIELDS OF TABLE <DYN_TABLE> UP TO 100
    
    ROWS FROM (P_NAME).
    
    *显示内表中的数据
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_STRUCTURE_NAME = P_NAME
      TABLES
        T_OUTTAB         = <DYN_TABLE>
      EXCEPTIONS
        PROGRAM_ERROR    = 1
        OTHERS           = 2.
    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    

    3.代码如下

    这种方式得确简单,但是对日项目中因为过分谨慎,any table这种定义方式是不可以的

    PARAMETERS P_NAME TYPE TABNAME.
    
    
    DATA: DYN_TABLE TYPE REF TO DATA.
    DATA: DYN_WA TYPE REF TO DATA.
    
    
    FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE,
                   <DYN_WA>    TYPE ANY.
    
    
    *创建动态表结构
    CREATE DATA DYN_TABLE TYPE TABLE OF (P_NAME).
    
    *创建动态内表
    ASSIGN DYN_TABLE->* TO <DYN_TABLE>.
    
    *创建动态工作区结构
    CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE>.
    
    *创建动态工作区
    ASSIGN DYN_WA->* TO <DYN_WA>.
    
    
    *从动态表中取数到动态内表中
    SELECT * INTO CORRESPONDING FIELDS OF TABLE <DYN_TABLE> UP TO 100
    
    ROWS FROM (P_NAME).
    
    *对取出数据进行处理
    LOOP AT <DYN_TABLE> ASSIGNING <DYN_WA>.
      "内表数据处理
    ENDLOOP.
    
    *显示内表中的数据
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
      EXPORTING
        I_STRUCTURE_NAME = P_NAME
      TABLES
        T_OUTTAB         = <DYN_TABLE>
      EXCEPTIONS
        PROGRAM_ERROR    = 1
        OTHERS           = 2.
    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
    

    相关文章

      网友评论

          本文标题:SAP ABAP动态内表

          本文链接:https://www.haomeiwen.com/subject/kpxhictx.html