• 动态内表的一种实现方式


    一个例子:

    这里加入的是一列日期,大体的结构就是这样。

    FORM frm_create_dyntable TABLES it_table .

      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 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 lr_type TYPE REF TO cl_abap_typedescr.

      DATA:   l_tabledescr_ref TYPE REF TO cl_abap_tabledescr,
              l_descr_ref      TYPE REF TO cl_abap_structdescr.
      FIELD-SYMBOLS: <fs_wa> ,
                     <fs_comp_wa> TYPE abap_compdescr.
      DATA: l_sta_date TYPE zpp_moldsche-sdate ,
            l_end_date TYPE zpp_moldsche-sdate .

      FIELD-SYMBOLS : <field> .
      DATA:l_mng01 TYPE mng01 .

      DATA:l_it_output TYPE ty_output.

      l_tabledescr_ref ?= cl_abap_typedescr=>describe_by_data( it_table[] ).
      l_descr_ref      ?= l_tabledescr_ref->get_table_line_type).

      "循环表头的每一个字段
      LOOP AT l_descr_ref->components ASSIGNING <fs_comp_wa>.
        ls_comp-name = <fs_comp_wa>-name .

        ASSIGN COMPONENT <fs_comp_wa>-name OF STRUCTURE l_it_output TO <field> .

        CALL METHOD cl_abap_datadescr=>describe_by_data
          EXPORTING
            p_data      = <field>
          RECEIVING
            p_descr_ref = lr_type
          EXCEPTIONS
            OTHERS      2.

        ls_comp-type ?= lr_type.
        APPEND ls_comp TO lt_comp.
      ENDLOOP.
     "这里如果只有月份字段,可以这样处理,
    CONCATENATE s_month-low+0(4) s_month-low+4(2'01' INTO l_month_c.l_month = l_month_c.传l_month到FM.


      l_sta_date = g_sta_date.
      l_end_date = g_end_date.
      "创建日期字段
      WHILE l_sta_date <= l_end_date .
        CONCATENATE zprefix l_sta_date INTO ls_comp-name.
        ASSIGN l_mng01 TO <field> .
        CALL METHOD cl_abap_datadescr=>describe_by_data
          EXPORTING
            p_data      = <field>
          RECEIVING
            p_descr_ref = lr_type
          EXCEPTIONS
            OTHERS      2.

        ls_comp-type ?= lr_type.
        APPEND ls_comp TO lt_comp.

        CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
          EXPORTING
            date      = l_sta_date
            days      1
            months    0
            signum    '+'
            years     0
          IMPORTING
            calc_date = l_sta_date
          EXCEPTIONS
            OTHERS    2.
      ENDWHILE .

    *根据字段目录创建动态结构类型
      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>.
    ENDFORM.                    "frm_create_dyntable

    这里将动态内表放到了<dyn_table>里,再在以下代码中填充<dyn_table>,Move_corresponding之后应该放到内层循环之外,这里自己坑了自己一晚上。

    LOOP AT g_it_output ASSIGNING <fs_alv>.
        LOOP AT l_it_moldsche ASSIGNING <fs_moldsche> WHERE aufnr = <wa_output>-aufnr AND sdate >= g_start_date AND sdate <= g_end_date.
          CONCATENATE zprefix <fs_moldsche>-sdate INTO l_field.
          ASSIGN COMPONENT l_field OF STRUCTURE <dyn_wa> TO <fieldvalue>.
          IF sy-subrc EQ 0.
            CHECK <fs_alv>-opqty ne 0.
            <fieldvalue> ( <fs_alv>-rqqty / <fs_alv>-opqty ) * <fs_moldsche>-bdmng.
            UNASSIGN <fieldvalue>.
          ENDIF.
        ENDLOOP.
        CLEAR l_it_moldsche.
        MOVE-CORRESPONDING <fs_alv> TO <dyn_wa>.
        APPEND <dyn_wa> TO <dyn_table>.
        CLEAR <dyn_wa>.
      ENDLOOP.

    *  LOOP AT g_it_output ASSIGNING <fs_alv>.
    *    LOOP AT l_it_moldsche ASSIGNING <fs_moldsche> WHERE aufnr = <wa_output>-aufnr AND sdate >= g_start_date AND sdate <= g_end_date.
    *      CONCATENATE zprefix <fs_moldsche>-sdate INTO l_field.
    *      ASSIGN COMPONENT l_field OF STRUCTURE <dyn_wa> TO <fieldvalue>.
    *      IF sy-subrc EQ 0.
    *        <fieldvalue> = ( <fs_alv>-rqqty / <fs_alv>-opqty ) * <fs_moldsche>-bdmng.
    *        UNASSIGN <fieldvalue>.
    *      ENDIF.
    **      "错误的代码,以下代码要放到内层循环之外,动态内表要比想象中灵活,没必要像普通内表那样遍历然后modify
    *      MOVE-CORRESPONDING <fs_alv> TO <dyn_wa>.
    *      APPEND <dyn_wa> TO <dyn_table>.
    *      CLEAR <dyn_wa>.
    **      **************************************
    *    ENDLOOP.
    *  ENDLOOP.

    最后实现用alv输出<dyn_table>

    PERFORM frm_display_alv TABLES <dyn_table>.

  • 相关阅读:
    SpringCloud搭建
    java类锁,对象锁
    mongodb4.x 集群搭建
    常见的止血草
    线性地址物理地址逻辑地址转换mmu
    hbase开发中方法技巧问题
    Hbase开发hbase连接查询插入表数据统计orm
    SpringBoot 之Spring Boot Starter依赖包及作用
    大数据 phoenix 搭建
    go调试工具,协程调试
  • 原文地址:https://www.cnblogs.com/aurora-cj/p/9354130.html
Copyright © 2020-2023  润新知