需求描述:根据事务码,读取指定变式中指定屏幕字段名的全部内容。
自己简单记录了一个可使用程序,复制粘贴可用。
*&---------------------------------------------------------------------*
*& Report ZSD_RPT_262
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zsd_rpt_262.
TYPES:BEGIN OF ty_output,
sign TYPE tvarv_sign,
option TYPE tvarv_opti,
low TYPE rvari_val,
high TYPE rvari_val,
END OF ty_output.
DATA:gt_output TYPE STANDARD TABLE OF ty_output.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_tcode TYPE tstc-tcode OBLIGATORY,
p_vari TYPE rsvar-variant OBLIGATORY,
p_text TYPE sychar30 OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
CLEAR:gt_output.
START-OF-SELECTION.
PERFORM frm_main.
*&---------------------------------------------------------------------*
*& Form frm_main
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_main .
DATA:lv_pgmna TYPE tstc-pgmna,
lv_msg TYPE string,
lt_params TYPE STANDARD TABLE OF vanz,
lt_params_n TYPE STANDARD TABLE OF vanz,
lt_selop TYPE STANDARD TABLE OF vanz,
lt_selop_n TYPE STANDARD TABLE OF vanz,
lt_valutab TYPE STANDARD TABLE OF rsparams,
lt_valutab1 TYPE STANDARD TABLE OF rsparamsl,
lt_objects TYPE STANDARD TABLE OF vanz,
lt_desc TYPE STANDARD TABLE OF rsdynbrepi,
lt_value TYPE STANDARD TABLE OF rsseldyn,
lt_obj TYPE STANDARD TABLE OF rsvaridyn,
lv_key TYPE string VALUE 'D_SREPOVARI-EXTDREPORT=', "固定关键字
lv_pos TYPE i,
lv_end TYPE i,
lv_tcode TYPE tcode.
"拉取事务码对应程序ID
SELECT SINGLE pgmna FROM tstc WHERE tcode = @p_tcode INTO @lv_pgmna.
IF sy-subrc <> 0.
MESSAGE '事务码无效,请检查!' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ELSE.
"若pgmna为空则去查 TSTCP(参数事务)
IF lv_pgmna IS INITIAL.
SELECT SINGLE param FROM tstcp WHERE tcode = @p_tcode INTO @DATA(lv_param).
IF sy-subrc = 0.
"解析参数里的目标事务码
lv_pos = strlen( lv_key ).
FIND lv_key IN lv_param MATCH OFFSET lv_pos.
IF sy-subrc = 0.
" 3. 从 = 号后开始截取,直到 ; 结束
lv_pos += 23.
lv_param = lv_param+lv_pos.
FIND ';' IN lv_param MATCH OFFSET lv_end.
IF sy-subrc = 0.
lv_tcode = lv_param(lv_end).
SELECT SINGLE pgmna FROM tstc WHERE tcode = @lv_tcode INTO @lv_pgmna.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
IF lv_pgmna IS INITIAL.
MESSAGE '未找到事务码对应的程序名!' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
"读取事务码下变式的内容
CALL FUNCTION 'RS_VARIANT_CONTENTS'
EXPORTING
report = lv_pgmna
variant = p_vari
* MOVE_OR_WRITE = 'W'
* NO_IMPORT = ' '
* EXECUTE_DIRECT = ' '
* IMPORTING
* SP =
TABLES
l_params = lt_params
l_params_nonv = lt_params_n
l_selop = lt_selop "选择项目
l_selop_nonv = lt_selop_n
valutab = lt_valutab "变式全部内容
valutabl = lt_valutab1
objects = lt_objects
free_selections_desc = lt_desc
free_selections_value = lt_value
free_selections_obj = lt_obj
EXCEPTIONS
variant_non_existent = 1
variant_obsolete = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO lv_msg WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
"根据选择项目描述读取对应SELNAME
READ TABLE lt_selop ASSIGNING FIELD-SYMBOL(<lfs_selop>) WITH KEY text = p_text.
IF sy-subrc = 0.
"仅保留需要读取的内容
DELETE lt_valutab WHERE selname <> <lfs_selop>-name.
IF lt_valutab IS NOT INITIAL.
MOVE-CORRESPONDING lt_valutab TO gt_output.
PERFORM frm_output.
ELSE.
MESSAGE '变式的选择项目下无内容输入!' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ELSE.
MESSAGE '事务码下选择项目不存在,请检查!' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_output
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_output .
DATA:lt_fieldcat TYPE lvc_t_fcat.
DATA:lo_table TYPE REF TO data.
DATA:lv_xstr TYPE xstring.
DATA:lt_rawdata TYPE solix_tab.
DATA:lo_result_data_table TYPE REF TO cl_salv_ex_result_data_table.
DATA:lo_bs_ex_office2007 TYPE REF TO cl_salv_bs_ex_office2007.
DATA:lv_version TYPE string.
DATA:lv_flavour TYPE string.
*获取数据
GET REFERENCE OF gt_output INTO lo_table.
*构造列字段
PERFORM frm_create_fieldcat CHANGING lt_fieldcat.
*获取cl_salv_ex_result_data_table类对象
lo_result_data_table = cl_salv_ex_util=>factory_result_data_table(
r_data = lo_table
t_fieldcatalog = lt_fieldcat ).
"获取xml版本信息
lv_version = cl_salv_bs_a_xml_base=>get_version( ).
IF lv_version = if_salv_bs_xml=>version_25.
lv_version = if_salv_bs_xml=>version_25.
ELSEIF lv_version = if_salv_bs_xml=>version_26.
lv_version = if_salv_bs_xml=>version_26.
ENDIF.
lv_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export.
*转换xstring
cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform(
EXPORTING
xml_version = lv_version
r_result_data = lo_result_data_table
xml_type = if_salv_bs_xml=>c_type_xlsx " XML Type as SALV Constant
xml_flavour = lv_flavour
gui_type = if_salv_bs_xml=>c_gui_type_gui " Constant
IMPORTING
xml = lv_xstr
).
PERFORM frm_dialog_xml USING lv_xstr.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_create_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_create_fieldcat CHANGING it_fieldcat TYPE lvc_t_fcat.
DATA:ls_fieldcat TYPE lvc_s_fcat.
DEFINE def_field.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = &1. "column position
ls_fieldcat-fieldname = &2.
ls_fieldcat-reptext = &3.
APPEND ls_fieldcat TO it_fieldcat.
END-OF-DEFINITION.
def_field 1 'SIGN' '标识'.
def_field 2 'OPTION' '选项'.
def_field 3 'LOW' '最小值'.
def_field 4 'HIGH' '最大值'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_dialog_xml
*&---------------------------------------------------------------------*
*& 下载弹窗
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_dialog_xml USING iv_xml TYPE xstring.
DATA:lv_extension TYPE string VALUE 'XLSX'.
DATA:lv_directory TYPE string VALUE 'D:/'.
DATA:lv_filename TYPE string.
DATA:lv_mask TYPE string VALUE 'Excel (*.XLSX)|*.XLSX'.
lv_filename = p_tcode && '_' && p_vari && '_' && p_text.
CALL FUNCTION 'XML_EXPORT_DIALOG'
EXPORTING
i_xml = iv_xml
i_default_extension = lv_extension
i_initial_directory = lv_directory
i_default_file_name = lv_filename
i_mask = lv_mask
* I_APPLICATION =
EXCEPTIONS
application_not_executable = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
最后看一下执行效果:
选择界面
程序执行结束导出数据文件

3130

被折叠的 条评论
为什么被折叠?



