如何将随机生成的数据以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
相关产品推荐
相关产品推荐

