SAP ABAP 读取事务码变式内容

需求描述:根据事务码,读取指定变式中指定屏幕字段名的全部内容。

自己简单记录了一个可使用程序,复制粘贴可用。

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

最后看一下执行效果:
选择界面
在这里插入图片描述程序执行结束导出数据文件在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值