一个简单的动态内表应用实例

这个报表实现的效果是子选择界面中选择要显示的列(此程序为月份),内表会动态的形成需要的结构并输出在ALV中。

*&---------------------------------------------------------------------*
*& Report YN_FIELD_SYMBOLS_TEST01
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT yn_field_symbols_test01.
TYPES:BEGIN OF zsun_icome_01,
        sign     TYPE char1 ,
        option   TYPE char2 ,
        low      TYPE char12 ,
        high     TYPE char12 ,
        zyear    TYPE char6 ,
        company  TYPE char4 ,
        zmonth   TYPE n LENGTH 2 ,
        waers    TYPE char4 ,
        income   TYPE char4 ,
      END OF zsun_icome_01.

DATA:gt_income TYPE TABLE OF zsun_icome_01,
     gs_income TYPE zsun_icome_01.

"FIELDCAT
DATA:gt_fieldcat TYPE lvc_t_fcat,
     gs_fieldcat TYPE lvc_s_fcat.

RANGES r_month FOR gs_income-zmonth .

DATA gv_fieldname   TYPE c LENGTH 20 .
DATA gv_description TYPE c LENGTH 20 .
DATA gv_number      TYPE i .
DATA gv_low         TYPE c LENGTH 2 .

"动态内表字段符号
FIELD-SYMBOLS :<ft_vb>     TYPE STANDARD TABLE,  "内表
               <fs_vb>     TYPE any,             "结构
               <dyn_field> TYPE any.             "字段

" ADD FIELDCAT
DATA gv_pos TYPE i .
DEFINE %%add_fieldcat .
  CLEAR gs_fieldcat.
  gv_pos = gv_pos + 1.
  gs_fieldcat-col_pos    = gv_pos .
  gs_fieldcat-fieldname  = &1 .
  gs_fieldcat-scrtext_m  = &2 .
  gs_fieldcat-cfieldname = &3 .
  gs_fieldcat-outputlen  = 15 .
  APPEND gs_fieldcat TO gt_fieldcat .
END-OF-DEFINITION.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS    :p_year  TYPE zsun_icome_01-zyear OBLIGATORY .                                   "公司代码 1
SELECT-OPTIONS:s_comp  FOR  gs_income-company   OBLIGATORY .                                   "利润中心 1
SELECT-OPTIONS:s_month FOR  gs_income-zmonth     .                                   "利润中心 1
SELECTION-SCREEN END   OF BLOCK b1.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
* 数据获取
FORM get_data .

  SELECT *
    FROM zsun_icome
    INTO CORRESPONDING FIELDS OF TABLE gt_income
   WHERE  zyear   = p_year
     AND  company IN s_comp
     AND  zmonth  IN s_month .

ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCAT_02
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
* 创建 fieldcat_02
FORM build_fieldcat .

  DATA lv_month TYPE n LENGTH 2 .
  "1. 公司
  %%add_fieldcat  'COMPANY' '公司' space .

  "2. 年份
  %%add_fieldcat  'ZYEAR'   '年份' space .

  "3. 月份
  DO 12 TIMES .
    lv_month = sy-index .
    IF lv_month IN s_month .
      CONCATENATE 'MONTH_' lv_month INTO gv_fieldname .
      CONCATENATE  lv_month  '月份' INTO gv_description .
      %%add_fieldcat  gv_fieldname  gv_description   'WAERS' .
    ENDIF.
  ENDDO.

  "4. 货币单位
  %%add_fieldcat  'WAERS' '币别' space .

ENDFORM.                    " BUILD_FIELDCAT_02
*&---------------------------------------------------------------------*
*&      Form  BUILD_DYNMIC_TABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
* 创建动态内表
FORM build_dynamic_table . "调用静态方法 :CREATE_DYNAMIC_TABLE

  DATA lt_new_table TYPE REF TO data .
  DATA ls_new_line  TYPE REF TO data .

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
*     I_STYLE_TABLE             =
      it_fieldcatalog           = gt_fieldcat   "输入FIELDCATALOG 将返回一个动态内表
*     I_LENGTH_IN_BYTE          =
    IMPORTING
      ep_table                  = lt_new_table  "获取返回的动态内表 (类)
*     E_STYLE_FNAME             =
    EXCEPTIONS
      generate_subpool_dir_full = 1
      OTHERS                    = 2.

  IF sy-subrc <> 0.
    EXIT.
* Implement suitable error handling here
  ENDIF.

  ASSIGN lt_new_table->* TO <ft_vb> .     "LT_NEW_TABLE 中的所有都被指向<FT_VB>(动态内表)

  CREATE DATA ls_new_line LIKE LINE OF <ft_vb> .
  ASSIGN ls_new_line->* TO <fs_vb> .      "LS_NEW_LINE 中的所有都被指向<FS_VB> (动态内表结构)


ENDFORM.                    " BUILD_DYNMIC_TABLE
*&---------------------------------------------------------------------*
*&      Form  ADD_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
* 向动态内表增加数据
FORM add_data .

  DATA ls_income TYPE zsun_icome_01 .

  " 首先根据年份,公司 排序
  SORT gt_income BY zyear company .
  LOOP AT gt_income INTO ls_income .
    MOVE-CORRESPONDING ls_income TO gs_income . "AT事件后被loop字段为*需要从 LS_INCOME 转存到 GS_INCOME

    AT NEW company .                  " 当公司变更时 先录入 公司 ,年份 ,货币

      "<FS_VB>-COMPANY = GS_INCOME-COMPANY
      ASSIGN COMPONENT 'COMPANY' OF STRUCTURE <fs_vb> TO <dyn_field> .
      IF sy-subrc = 0 .
        <dyn_field> = gs_income-company .
      ENDIF .

      "<FS_VB>-ZYEAR = GS_INCOME-ZYEAR
      ASSIGN COMPONENT 'ZYEAR'   OF STRUCTURE <fs_vb> TO <dyn_field> .
      IF sy-subrc = 0 .
        <dyn_field> = gs_income-zyear .
      ENDIF.

      "<FS_VB>-WAERS = GS_INCOME-WAERS
      ASSIGN COMPONENT 'WAERS'   OF STRUCTURE <fs_vb> TO <dyn_field> .
      IF sy-subrc = 0 .
        <dyn_field> = gs_income-waers .
      ENDIF .

    ENDAT .

    " 再根据月份的值,把收入写入对应字段(每一行都执行)
    " <FS_VB>-MONTH_XX = GS_INCOME-INCOME
    CONCATENATE 'MONTH_'gs_income-zmonth INTO gv_fieldname .
    ASSIGN COMPONENT gv_fieldname OF STRUCTURE <fs_vb> TO <dyn_field> .
    IF sy-subrc = 0 .
      <dyn_field> = gs_income-income .
    ENDIF .

    AT END OF company .
      " 当公司的值到达最后一行时
      APPEND <fs_vb> TO <ft_vb> .
      CLEAR  <fs_vb> .
    ENDAT .
  ENDLOOP .

ENDFORM.                    " ADD_DATA
*&---------------------------------------------------------------------*
*&      Form  DISPLAY_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
* DISPLAY
FORM display_data .

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      it_fieldcat_lvc = gt_fieldcat
    TABLES
      t_outtab        = <ft_vb>
    EXCEPTIONS
      program_error   = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
    EXIT .
* Implement suitable error handling here
  ENDIF.


ENDFORM.                    " DISPLAY_DATA

INITIALIZATION.

START-OF-SELECTION.
  PERFORM get_data.             "数据获取
  PERFORM build_fieldcat.       "创建 fieldcat_02
  PERFORM build_dynamic_table.  "创建动态内表
  PERFORM add_data.             "向动态内表增加数据

END-OF-SELECTION.
  PERFORM display_data.       "DISPLAY

 

实现的效果为:

 

前台选择1~7月

 

 

 

ALV输出对应的1-7月的数据(表数据是乱建的)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值