SAP 使用数据表动态生成选择屏幕执行报表程序

报文log都是存在自建表里,每次接口都会做个报表去展示存在表里的报文,
就想到做了个通用程序,就不需要二次开发报表,直接选择画面输入log表名,
就可以展示表里的数据,双击你的报文字段可以以json的形式展开查看。
其他用途功能还未想到,后期有变化会补充

*&----------------------------------------------------------------V1003-
*& DESCRIPTION:
*&
*&
*&
*&
*&
*&
*&   Requestor......:
*&   Country........:
*&   Requirement No.:
*&----------------------------------------------------------------------
*& STATUS:
*&   Development.: [X] in process      [ ] finished
*&   Test........: [ ] function test
*&----------------------------------------------------------------------
*& TECHNICAL INFORMATION:
*&   Interface     [ ]
*&   Interface RFC [ ]
*&   Migration     [ ]
*&   Repair report [ ] (single usage reports)
*&   Updates on DB [ ]
*-----------------------------------------------------------------------
* CHANGE HISTORY:
* SqN Date.      Author       Description
* --- ---------- ------------ ------------------------------------------
* 001 2011-mm-dd sap-username Creation
*-----------------------------------------------------------------------

REPORT  ztest_log.

DATA: where_clauses           TYPE rsds_twhere,
      expressions             TYPE rsds_texpr,
      field_ranges            TYPE rsds_trange,
      number_of_active_fields TYPE sy-tfill,
      tables_tab              TYPE STANDARD TABLE OF rsdstabs,
      tabfields_not_display   TYPE STANDARD TABLE OF rsdsfields,
      fields_tab              TYPE STANDARD TABLE OF rsdsfields,
      field_desc              TYPE STANDARD TABLE OF fldconvert,
      field_texts             TYPE STANDARD TABLE OF rsdstexts,
      events                  TYPE STANDARD TABLE OF rsdsevents,
      event_fields            TYPE STANDARD TABLE OF rsdsevflds,
      fields_not_selected     TYPE STANDARD TABLE OF rsdsfields,
      no_int_check            TYPE STANDARD TABLE OF rsdstabs,
      alv_qinfo               TYPE STANDARD TABLE OF lvc_s_qinf,
      selection_id            TYPE rsdynsel-selid.


DATA:  dref TYPE REF TO data.


FIELD-SYMBOLS: <table> TYPE STANDARD TABLE,
               <where> LIKE LINE OF where_clauses.

PARAMETERS: p_tab LIKE dd03l-tabname . "Earlier Table name

AT SELECTION-SCREEN.

  TRANSLATE p_tab TO UPPER CASE.

  SELECT COUNT(*)
    FROM dd03l
   WHERE tabname EQ @p_tab.
  IF sy-subrc = 0.
  ELSE.
    MESSAGE 'Database table not found' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
  ENDIF.

  tables_tab = VALUE #( ( prim_tab = p_tab ) ).

  CALL FUNCTION 'FREE_SELECTIONS_INIT'
    EXPORTING
      kind                     = 'T'
*     FIELD_RANGES_INT         = " 选择屏幕初始值
    IMPORTING
      selection_id             = selection_id
    TABLES
      tables_tab               = tables_tab "如果kind为T,则定义选择屏幕字段来源表
      tabfields_not_display    = tabfields_not_display
      fields_tab               = fields_tab "如果kind为T,则为默认选择字段,为F则为可选选择字段清单
      field_desc               = field_desc
      field_texts              = field_texts
      events                   = events " 选择屏幕事件进行逻辑处理
      event_fields             = event_fields
      fields_not_selected      = fields_not_selected
      no_int_check             = no_int_check
      alv_qinfo                = alv_qinfo
    EXCEPTIONS
      fields_incomplete        = 1
      fields_no_join           = 2
      field_not_found          = 3
      no_tables                = 4
      table_not_found          = 5
      expression_not_supported = 6
      incorrect_expression     = 7
      illegal_kind             = 8
      area_not_found           = 9
      inconsistent_area        = 10
      kind_f_no_fields_left    = 11
      kind_f_no_fields         = 12
      too_many_fields          = 13
      dup_field                = 14
      field_no_type            = 15
      field_ill_type           = 16
      dup_event_field          = 17
      node_not_in_ldb          = 18
      area_no_field            = 19
      OTHERS                   = 20.
  IF sy-subrc <> 0.
    MESSAGE 'Error in initialization' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
  ENDIF.

  CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
    EXPORTING
      selection_id    = selection_id
      title           = 'Free Selection'
      status          = '1' "选择屏幕状态
      as_window       = ' ' " 是否弹窗
      tree_visible    = ' ' "选择树是否可见
    IMPORTING
      where_clauses   = where_clauses "选择屏幕返回的选择条件,自动处理的where条件表,可直接使用
    TABLES
      fields_tab      = fields_tab
    EXCEPTIONS
      internal_error  = 1
      no_action       = 2
      selid_not_found = 3
      illegal_status  = 4
      OTHERS          = 5.
  IF sy-subrc <> 0.
    MESSAGE 'No free selection created' TYPE 'I'.
    LEAVE PROGRAM.
  ENDIF.

  CREATE DATA dref TYPE TABLE OF (p_tab).
  ASSIGN dref->* TO <table>.

START-OF-SELECTION.
  ASSIGN where_clauses[ tablename = p_tab ] TO <where>.

  TRY.
      IF <where> IS ASSIGNED AND <where>-where_tab IS NOT INITIAL.
        SELECT *
          FROM (p_tab)
          WHERE (<where>-where_tab)
          INTO TABLE @<table>.
      ELSE.
        SELECT *
          FROM (p_tab)
          INTO TABLE @<table>.
      ENDIF.
    CATCH cx_sy_dynamic_osql_error.
      MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
      LEAVE PROGRAM.
  ENDTRY.

*------这段代码可以直接显示alv
*  TRY.
*      cl_salv_table=>factory(
*        IMPORTING r_salv_table = DATA(alv)
*        CHANGING  t_table      = <table> ).
*      alv->display( ).
*    CATCH cx_salv_msg.
*      MESSAGE 'Error in ALV display' TYPE 'I' DISPLAY LIKE 'E'.
*  ENDTRY.

*----这段我是为了能实现双击查看json报文
  DATA: gt_fieldcat TYPE slis_t_fieldcat_alv,
        gw_fieldcat TYPE slis_fieldcat_alv,
        gw_layout   TYPE slis_layout_alv.

  gw_layout-colwidth_optimize = 'X'.
  gw_layout-zebra             = 'X'.


  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
*     I_PROGRAM_NAME         =
*     I_INTERNAL_TABNAME     =
      i_structure_name       = p_tab
*     I_CLIENT_NEVER_DISPLAY = 'X'
*     I_INCLNAME             =
*     I_BYPASSING_BUFFER     =
*     I_BUFFER_ACTIVE        =
    CHANGING
      ct_fieldcat            = gt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program      = sy-repid
      is_layout               = gw_layout
      it_fieldcat             = gt_fieldcat
      i_callback_user_command = 'FRM_USER_COMMAND'
      i_default               = 'X'
      i_save                  = 'A'
    TABLES
      t_outtab                = <table>
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.


*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->I_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_user_command USING i_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.

  DATA: lr_alv_grid TYPE REF TO cl_gui_alv_grid.
  DATA: ls_stbl  TYPE lvc_s_stbl.

  CASE i_ucomm.
    WHEN 'REFRESH'.
*      PERFORM FRM_GET_DATA.
    WHEN '&IC1'.
      PERFORM frm_click USING rs_selfield.
  ENDCASE.

  IF lr_alv_grid IS INITIAL.
    CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
      IMPORTING
        e_grid = lr_alv_grid.
  ENDIF.

  ls_stbl-row = 'X'.
  ls_stbl-col = 'X'.

  CALL METHOD lr_alv_grid->refresh_table_display
    EXPORTING
      is_stable = ls_stbl.

ENDFORM. "FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*&      Form  FRM_CLICK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_click  USING is_selfield TYPE slis_selfield.
  DATA:l_temp TYPE char80.
  FIELD-SYMBOLS <lfs_temp> TYPE any.

  SELECT *
    FROM dd03l
    INTO TABLE @DATA(it_dd03l)
   WHERE tabname EQ @p_tab.

  LOOP AT it_dd03l INTO DATA(ls_dd031)
    WHERE datatype = 'STRG'.

    l_temp = '<LS_LIST>-' && ls_dd031-fieldname.

    CASE is_selfield-fieldname.
      WHEN ls_dd031-fieldname.
        TRY.
            READ TABLE <table> ASSIGNING FIELD-SYMBOL(<ls_list>) INDEX is_selfield-tabindex.
            ASSIGN (l_temp) TO <lfs_temp>.
            cl_demo_output=>display_json( <lfs_temp> ).
          CATCH cx_sy_dynamic_osql_error.
            MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
            LEAVE PROGRAM.
        ENDTRY.

      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.
ENDFORM.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值