You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将随机生成的数据以ALV报表展示并呈现字段信息?

ABAP随机数据生成程序优化方案

现有ABAP程序用于生成指定Z/Y表的随机数据,但输出格式杂乱,需优化为以下效果:

  • 以ALV表格展示目标表的字段名称与对应数据类型
  • 以ALV表格展示生成的随机测试数据

实现代码

*&---------------------------------------------------------------------*
*& Report Z_RANDOM_DATA_GENERATOR
*&---------------------------------------------------------------------*
REPORT Z_RANDOM_DATA_GENERATOR.

PARAMETERS: p_tabname TYPE dd02l-tabname OBLIGATORY,
            p_records TYPE I DEFAULT 5 OBLIGATORY.

DATA: gt_dfies TYPE STANDARD TABLE OF dfies,
      gt_field_info TYPE STANDARD TABLE OF zs_field_info, " 自定义结构:FIELDNAME(30), DATATYPE(4)
      go_table_descr TYPE REF TO cl_abap_tabledescr,
      go_struct_descr TYPE REF TO cl_abap_structdescr,
      gt_random_data TYPE REF TO data,
      gs_random_data TYPE REF TO data,
      gt_fieldcat TYPE slis_t_fieldcat_alv,
      gs_fieldcat TYPE slis_fieldcat_alv.

* 1. 获取目标表字段信息
CALL FUNCTION 'DDIF_FIELDINFO_GET'
  EXPORTING
    tabname = p_tabname
    langu   = sy-langu
  TABLES
    dfies_tab = gt_dfies
  EXCEPTIONS
    not_found      = 1
    internal_error = 2
    others         = 3.

IF sy-subrc <> 0.
  MESSAGE '目标表不存在或无权限访问' TYPE 'E'.
ENDIF.

* 2. 准备字段信息展示数据
LOOP AT gt_dfies INTO DATA(gs_dfies).
  APPEND INITIAL LINE TO gt_field_info ASSIGNING FIELD-SYMBOL(<fs_field_info>).
  <fs_field_info>-fieldname = gs_dfies-fieldname.
  <fs_field_info>-datatype = gs_dfies-datatype.
ENDLOOP.

* 3. 展示字段信息ALV
PERFORM display_field_info_alv USING gt_field_info.

* 4. 动态创建随机数据内表
PERFORM create_dynamic_table USING gt_dfies CHANGING gt_random_data gs_random_data.

* 5. 生成随机数据并填充内表
PERFORM generate_random_data USING gt_dfies p_records CHANGING gt_random_data gs_random_data.

* 6. 展示随机数据ALV
PERFORM display_random_data_alv USING gt_dfies gt_random_data.

*&---------------------------------------------------------------------*
*& Form DISPLAY_FIELD_INFO_ALV
*&---------------------------------------------------------------------*
FORM display_field_info_alv USING pt_field_info TYPE STANDARD TABLE OF zs_field_info.
  gs_fieldcat-fieldname = 'FIELDNAME'.
  gs_fieldcat-seltext_m = '字段名称'.
  gs_fieldcat-col_pos = 1.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  gs_fieldcat-fieldname = 'DATATYPE'.
  gs_fieldcat-seltext_m = '数据类型'.
  gs_fieldcat-col_pos = 2.
  APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat = gt_fieldcat
      i_title     = '目标表字段信息'
    TABLES
      t_outtab    = pt_field_info
    EXCEPTIONS
      program_error = 1
      others        = 2.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form CREATE_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
FORM create_dynamic_table USING pt_dfies TYPE STANDARD TABLE OF dfies
                          CHANGING pt_random_data TYPE REF TO data
                                   ps_random_data TYPE REF TO data.
  DATA: lt_components TYPE cl_abap_structdescr=>component_table,
        ls_component TYPE cl_abap_structdescr=>component.

  LOOP AT pt_dfies INTO gs_dfies.
    ls_component-name = gs_dfies-fieldname.
    ls_component-type = cl_abap_elemdescr=>get_by_name( gs_dfies-datatype ).
    ls_component-length = gs_dfies-length.
    ls_component-decimals = gs_dfies-decimals.
    APPEND ls_component TO lt_components.
  ENDLOOP.

  go_struct_descr = cl_abap_structdescr=>create( lt_components ).
  go_table_descr = cl_abap_tabledescr=>create( go_struct_descr ).
  CREATE DATA pt_random_data TYPE HANDLE go_table_descr.
  CREATE DATA ps_random_data TYPE HANDLE go_struct_descr.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form GENERATE_RANDOM_DATA
*&---------------------------------------------------------------------*
FORM generate_random_data USING pt_dfies TYPE STANDARD TABLE OF dfies
                                p_records TYPE I
                          CHANGING pt_random_data TYPE REF TO data
                                   ps_random_data TYPE REF TO data.
  FIELD-SYMBOLS: <fs_table> TYPE STANDARD TABLE,
                 <fs_struct> TYPE ANY,
                 <fs_field> TYPE ANY.

  ASSIGN pt_random_data->* TO <fs_table>.
  ASSIGN ps_random_data->* TO <fs_struct>.

  DO p_records TIMES.
    CLEAR <fs_struct>.
    LOOP AT pt_dfies INTO gs_dfies.
      ASSIGN COMPONENT gs_dfies-fieldname OF STRUCTURE <fs_struct> TO <fs_field>.
      CASE gs_dfies-datatype.
        WHEN 'CHAR'.
          <fs_field> = |{ gs_dfies-fieldname }_{ sy-index }_{ cl_abap_random=>create( )->get_string( length = gs_dfies-length - strlen( |{ gs_dfies-fieldname }_{ sy-index }| ) ) }|.
        WHEN 'NUMC'.
          <fs_field> = cl_abap_random=>create( )->get_int( min = 0 max = 10 ** gs_dfies-length - 1 ).
        WHEN 'DATS'.
          <fs_field> = cl_abap_random=>create( )->get_date( min = '20200101' max = sy-datum ).
        WHEN 'TIMS'.
          <fs_field> = cl_abap_random=>create( )->get_time( ).
        WHEN 'INT4'.
          <fs_field> = cl_abap_random=>create( )->get_int( min = -100000 max = 100000 ).
        WHEN OTHERS.
          <fs_field> = |TEST_{ sy-index }|.
      ENDCASE.
    ENDLOOP.
    APPEND <fs_struct> TO <fs_table>.
  ENDDO.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form DISPLAY_RANDOM_DATA_ALV
*&---------------------------------------------------------------------*
FORM display_random_data_alv USING pt_dfies TYPE STANDARD TABLE OF dfies
                                   pt_random_data TYPE REF TO data.
  CLEAR gt_fieldcat.
  LOOP AT pt_dfies INTO gs_dfies.
    gs_fieldcat-fieldname = gs_dfies-fieldname.
    gs_fieldcat-seltext_m = gs_dfies-scrtext_m.
    gs_fieldcat-col_pos = sy-tabix.
    APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat.
  ENDLOOP.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat = gt_fieldcat
      i_title     = |生成的随机测试数据(共{ p_records }条)|
    TABLES
      t_outtab    = pt_random_data->*
    EXCEPTIONS
      program_error = 1
      others        = 2.
ENDFORM.

关键说明

  • 字段信息展示:需提前创建自定义结构ZS_FIELD_INFO,包含FIELDNAME(30)和DATATYPE(4)两个字段,通过ALV函数将字段信息规整展示。
  • 动态数据生成:利用ABAP动态对象创建与目标表结构一致的内表,针对不同数据类型生成匹配的随机值(字符、数字、日期等),最终通过ALV输出。
  • 扩展提示:可根据需求在CASE分支中补充特殊数据类型(如货币、数量)的随机值生成逻辑,确保数据格式合规。

内容的提问来源于stack exchange,提问作者Mahmood Hammood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 09:17:37