zoukankan      html  css  js  c++  java
  • 动态内表的一种实现方式

    一个例子:

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

    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>.

  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/aurora-cj/p/9354130.html
Copyright © 2011-2022 走看看