Quantcast
Channel: SCN : Document List - ABAP Development
Viewing all articles
Browse latest Browse all 935

ST03N - A custom solution

$
0
0

Hi all.

 

This is a simple program I developed years ago to show Users's activity on programs and transactions.

 

It's a simpler solution, to use instead of ST03N standard. (Nugg file attached if you need)

 

To implement the solution, you'll have to create a custom DYNPRO 100.

 

Create a structure named ZWORKLOAD with these fields:

 

MANDTMANDTCLNT3
PERIODSPMONNUMC6
ACCOUNTZWKACCOUNTCHAR12
NMACCOUNTZWKNMACCCHAR80
ZTCODEZSWLTCODECHAR40
DDTEXTZWKDTEXTCHAR70
TYPELEMZTYPELEMCHAR1
ZLNCHTZWKZLNCHTCHAR10
ZREPNMZWKDREPBNCHAR40
ZDESREPNMZWKDESREPNMCHAR70
DEVCLASSZWKCLASSCHAR30
DESCLASSZWKDESCLCHAR80
COMPIDZWKCOMPIDCHAR24
CNAMZWKCNAMCHAR12
CDATZWKCDATDATS8
CNAMODZWKCNAMODCHAR12
CDATMODZWKCDATMODDATS8
DESTASKTYPEZWKTSKTYPCHAR16
ZSTEPSZWKSTEPSINT410

 

 

 

*&---------------------------------------------------------------------*
*& Report  Z_ST03N
*&
*&---------------------------------------------------------------------*
*&  Statistic report and transaction consume
*&
*&---------------------------------------------------------------------*
REPORT  Z_ST03N.
* Table Declaration
TABLES: ZWORKLOAD, V_USR_NAME, TSTCP, TRDIRT, TSTCT,        TADIR, TDEVC, DF14L, TSTC, TRDIR, TDEVCT.
* Global data
*DATA: t_output TYPE TABLE OF SWNCAGGUSERTCODE, "SWNCHITLIST,  ""Final output table
DATA: t_work    TYPE TABLE OF SWNCAGGUSERTCODE "SWNCHITLIST                WITH HEADER LINE,            "Tabella temporanea      t_dirmoni TYPE TABLE OF SWNCMONIKEY                WITH HEADER LINE.          "Workload component
DATA: t_output TYPE TABLE OF ZWORKLOAD WITH HEADER LINE.
DATA: itsktp TYPE SWNCTASKTYPERAW.
DATA: BEGIN OF t_elcod OCCURS 0,          ztcode TYPE ZWORKLOAD-ztcode,      END OF t_elcod.
DATA: BEGIN OF it_tstcp OCCURS 0,        tcode TYPE tstcp-tcode,        zrepnm TYPE ZWORKLOAD-zrepnm,        zdesrepnm TYPE ZWORKLOAD-zdesrepnm,      END OF it_tstcp.
CONSTANTS: ZNAMESTRUC TYPE DD02L-TABNAME VALUE 'ZWORKLOAD'.
*-----------------------------------------------------------------------
* ALV specific Declarations...........................................
*-----------------------------------------------------------------------
* ALV specific Internal table declarations.............................
DATA: i_field_cat TYPE lvc_t_fcat, " Field catalogue      i_alv_sort TYPE lvc_t_sort. " Sort table
* ALV variables........................................................
DATA: w_alv_layout TYPE lvc_s_layo, " ALV Layout      w_alv_save TYPE c, " ALV save      w_alv_variant TYPE disvariant. " ALV Variant
* Selection parameters
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS: s_period FOR ZWORKLOAD-PERIOD DEFAULT sy-datum,                s_tcode FOR ZWORKLOAD-ZTCODE,                s_user FOR ZWORKLOAD-ACCOUNT,                s_reptr FOR ZWORKLOAD-TYPELEM.
SELECTION-SCREEN END OF BLOCK b1.
* ALV Class definitions................................................
*-----------------------------------------------------------------------
CLASS lcl_event_handler DEFINITION.
*-----------------------------------------------------------------------  PUBLIC SECTION.    METHODS:    handle_double_click FOR EVENT double_click OF cl_gui_alv_grid        IMPORTING e_row e_column,    handle_hotspot FOR EVENT hotspot_click OF cl_gui_alv_grid        IMPORTING e_row_id e_column_id.
ENDCLASS. " CLASS LCL_EVENT_HANDLER DEF..
* ALV Class implementation............................................
* In the Event of a Double Click drill down to the corresponding CHANGE REQUEST
*-----------------------------------------------------------------------
CLASS lcl_event_handler IMPLEMENTATION.
*-----------------------------------------------------------------------  METHOD handle_double_click.  ENDMETHOD. " HANDLE_DOUBLE_CLICK
* not working yet - hotspot seems to stay in the gui!!  METHOD handle_hotspot.  ENDMETHOD. " HANDLE_DOUBLE_CLICK
ENDCLASS. " CLASS LCL_EVENT_HANDLER IMPL...
* ALV Grid Control definitions........................................
DATA:
* ALV Grid Control itself
o_grid TYPE REF TO cl_gui_alv_grid,
* Container to hold the ALV Grid Control
o_custom_container TYPE REF TO cl_gui_custom_container,
* Event handler (defined in the class above)
o_event_handler TYPE REF TO lcl_event_handler.
*&----------------------------------------------------------------------*
INITIALIZATION.
*&----------------------------------------------------------------------*  PERFORM create_field_catalogue USING ZNAMESTRUC                                  CHANGING i_field_cat. " Create ALV Field Catalog
START-OF-SELECTION.
* Carica dati di output  PERFORM get_data_workload.  IF NOT t_output[] IS INITIAL.    PERFORM list_output_to_alv. " Perform ALV Output operations  ENDIF.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*----------------------------------------------------------------------*
* FORM LIST_OUTPUT_TO_ALV *
*----------------------------------------------------------------------*
* This subroutine is used to call the screen for ALV Output. *
*----------------------------------------------------------------------*
* There are no interface parameters to be passed to this subroutine. *
*----------------------------------------------------------------------*
FORM list_output_to_alv.  CALL SCREEN 100.
*
ENDFORM. " LIST_OUTPUT_TO_ALV
*----------------------------------------------------------------------*
* Module STATUS_0100 OUTPUT *
*----------------------------------------------------------------------*
* This is the PBO module which will be processed befor displaying the *
* ALV Output. *
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.  SET PF-STATUS '0100'. " PF Status for ALV Output Screen  SET TITLEBAR 'STD'.  CREATE OBJECT: o_grid  EXPORTING i_parent = cl_gui_container=>screen0. "o_custom_container.  PERFORM define_alv_layout. " ALV Layout options definitions  PERFORM save_alv_layout_options. " save ALV layout options  PERFORM call_alv_grid. " Call ALV Grid Control
ENDMODULE. " STATUS_0100 OUTPUT
*----------------------------------------------------------------------*
* Module USER_COMMAND_0100 INPUT *
*----------------------------------------------------------------------*
* This is the PAI module which will be processed when the user performs*
* any operation from the ALV output. *
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.  CASE sy-ucomm.    WHEN 'EXIT' OR 'BACK' OR 'CANC'.
* may need to do this so display is refreshed if other report selected
*      CALL METHOD o_custom_container->free.       SET SCREEN 0.  ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*----------------------------------------------------------------------*
* FORM DEFINE_ALV_LAYOUT *
*----------------------------------------------------------------------*
* This subroutine is used to Define the ALV layout. *
*----------------------------------------------------------------------*
FORM define_alv_layout .
*  w_alv_layout-numc_total = 'X'. " Numc total line  w_alv_layout-cwidth_opt = 'X'. " Optimal column width
*  w_alv_layout-detailinit = 'X'. " Show values that are initial in  " detail list.  w_alv_layout-sel_mode = 'A'. " Column selection mode  w_alv_layout-no_merging = 'X'. " No merging while sorting columns
*  w_alv_layout-keyhot = 'X'.
ENDFORM. " DEFINE_ALV_LAYOUT
*----------------------------------------------------------------------*
* FORM SAVE_ALV_LAYOUT_OPTIONS *
*----------------------------------------------------------------------*
* This subroutine is used to Save the ALV layout options. *
*----------------------------------------------------------------------*
FORM save_alv_layout_options.
* See the ALV grid control documentation for full list of options  w_alv_save = 'A'.  w_alv_variant-report = sy-repid.
ENDFORM. " SAVE_ALV_LAYOUT_OPTIONS
*----------------------------------------------------------------------*
* FORM CALL_ALV_GRID *
*----------------------------------------------------------------------*
* This subroutine is used to call ALV Grid control for processing. *
*----------------------------------------------------------------------*
FORM call_alv_grid.  CALL METHOD o_grid->set_table_for_first_display    EXPORTING      is_layout      = w_alv_layout      i_save          = w_alv_save      is_variant      = w_alv_variant    CHANGING      it_outtab      = t_output[]      it_sort        = i_alv_sort      it_fieldcatalog = i_field_cat.
* Link used Events and Event Handler Methods  CREATE OBJECT o_event_handler.
* Set handler  SET HANDLER o_event_handler->handle_double_click FOR o_grid.
ENDFORM. " CALL_ALV_GRID
*&---------------------------------------------------------------------*
*& Form create_field_catalogue
*&---------------------------------------------------------------------*
* set up field catalogue
*&---------------------------------------------------------------------*
FORM create_field_catalogue USING tb_name LIKE DD02L-TABNAME                            CHANGING pt_fieldcat TYPE lvc_t_fcat..  DATA: ls_fcat type lvc_s_fcat.  FIELD-SYMBOLS: <lf1> TYPE lvc_s_fcat.  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'    EXPORTING      i_structure_name      = tb_name    CHANGING      ct_fieldcat            = pt_fieldcat[]    EXCEPTIONS      inconsistent_interface = 1      program_error          = 2      OTHERS                = 3.  IF sy-subrc <> 0.
* Exceptions handling  ENDIF.  LOOP AT pt_fieldcat ASSIGNING <lf1>.    CASE <lf1>-fieldname.
*      WHEN 'TERMINALID'.
*        <lf1>-SCRTEXT_S = text-f01.
*        <lf1>-SCRTEXT_M = text-f01.
*        <lf1>-SCRTEXT_L = text-f01.
*      WHEN 'TCODE'.
*        <lf1>-SCRTEXT_S = text-f02.
*        <lf1>-SCRTEXT_M = text-f02.
*        <lf1>-SCRTEXT_L = text-f02.      WHEN OTHERS.        <lf1>-KEY = 'X'.    ENDCASE.  ENDLOOP.
ENDFORM. " create_field_catalogue
*&---------------------------------------------------------------------*
*&      Form  get_data_workload
*&---------------------------------------------------------------------*
*      text
*----------------------------------------------------------------------*
FORM get_data_workload.  DATA: i_valido TYPE c.  DATA: i_entry(40),        i_account TYPE ZWORKLOAD-account.  TYPES: BEGIN OF t_steps,          period TYPE ZWORKLOAD-period,          account TYPE ZWORKLOAD-account,          entry_id(40),          count TYPE ZWORKLOAD-zsteps,        END OF t_steps.  DATA: it_steps TYPE HASHED TABLE OF t_steps WITH UNIQUE KEY period account entry_id.  DATA: h_steps TYPE t_steps.  REFRESH: t_dirmoni, t_output, it_steps, it_tstcp, t_elcod.
* Lettura carichi di lavoro  CALL FUNCTION 'SWNC_COLLECTOR_GET_DIRECTORY'    EXPORTING      GET_DIR_FROM_CLUSTER = ' '      EXCLUDE_SUMMARY      = ' '    TABLES      DIRECTORY_KEYS      = t_dirmoni    EXCEPTIONS      NO_DATA_FOUND        = 1      OTHERS              = 2.  IF SY-SUBRC <> 0.  ENDIF.
" Application servers WORKLOAD
* with month registration period  LOOP AT t_dirmoni WHERE COMPONENT NE 'TOTAL' OR                          PERIODTYPE NE 'M'.    DELETE t_dirmoni.  ENDLOOP.  LOOP AT t_dirmoni.    REFRESH t_work.
" Read aggregated activity    CHECK t_dirmoni-periodstrt(6) IN s_period.    CALL FUNCTION 'SWNC_COLLECTOR_GET_AGGREGATES'      EXPORTING        component        = t_dirmoni-COMPONENT        periodtype      = t_dirmoni-PERIODTYPE        periodstrt      = t_dirmoni-PERIODSTRT      TABLES          USERTCODE      = t_work
*          HITLIST_DATABASE = t_work      EXCEPTIONS        no_data_found    = 1        OTHERS          = 2.    SORT t_work BY account entry_id.    CLEAR: i_entry, i_account.    LOOP AT t_work.
* Step Counter for each report/transaction      CLEAR h_steps.      MOVE t_work-account TO h_steps-account.      MOVE t_work-entry_id(40) TO h_steps-entry_id.      MOVE t_dirmoni-periodstrt(6) TO h_steps-period.      MOVE t_work-count TO h_steps-count. "numero di steps      READ TABLE it_steps WITH KEY account  = h_steps-account                                  entry_id = h_steps-entry_id                                  period  = h_steps-period                                TRANSPORTING NO FIELDS.      IF sy-subrc EQ 0. "If already exists
" Collect data steps        COLLECT h_steps INTO it_steps.        DELETE t_work.        CONTINUE.      ELSE.
" Collectdata steps        COLLECT h_steps INTO it_steps.      ENDIF.
"Filter to verify selection conditions      CLEAR t_output.      MOVE t_work-account TO t_output-account.      MOVE t_work-entry_id+72(1) TO t_output-typelem.      MOVE t_work-entry_id(40) TO t_output-ztcode. "Save transaction code or report      CONDENSE t_output-ztcode NO-GAPS.      IF NOT t_work-entry_id+40(32) IS INITIAL. "If name defined = JOB        MOVE 'B' TO t_output-zlncht.      ENDIF.      MOVE t_dirmoni-periodstrt(6) TO t_output-period.      MOVE t_work-tasktype TO t_output-destasktype. "To convert      PERFORM verifica_selezioni USING t_output                                  CHANGING i_valido.      IF i_valido EQ 'X'.        PERFORM add_info CHANGING t_output.        append t_output.      ENDIF.    ENDLOOP.  ENDLOOP.  IF t_output[] IS INITIAL.    MESSAGE i000(fb) WITH text-e01.  ENDIF.  SORT t_output BY period account ztcode zrepnm.  DELETE ADJACENT DUPLICATES FROM t_output COMPARING period account ztcode zrepnm.  LOOP AT t_output.    CLEAR: h_steps.    READ TABLE it_steps INTO h_steps WITH KEY entry_id = t_output-ztcode                                                period = t_output-period                                                account = t_output-account.    IF sy-subrc EQ 0.
"Assign step value calculated      t_output-zsteps = h_steps-count.    ENDIF.    IF sy-subrc EQ 0.      MODIFY t_output.    ENDIF.  ENDLOOP.
ENDFORM.                    "get_data_workload
*&---------------------------------------------------------------------*
*&      Form  add_info
*&---------------------------------------------------------------------*
*      Info details
*----------------------------------------------------------------------*
*      -->T_OUTPUT  output table
*----------------------------------------------------------------------*
FORM add_info CHANGING t_output TYPE ZWORKLOAD.  DATA: ipgmna TYPE tstc-pgmna,        ifctr_id TYPE tdevc-component.  DATA: iconta TYPE i.  DATA: search_trsn TYPE string.
" Conversion task type description  CLEAR itsktp.  MOVE t_output-destasktype TO itsktp.  CLEAR t_output-destasktype.  CALL METHOD CL_SWNC_COLLECTOR_INFO=>TRANSLATE_TASKTYPE    EXPORTING      TASKTYPERAW = itsktp    RECEIVING      TASKTYPE    = t_output-destasktype.
" Set extend name account  CLEAR t_output-NMACCOUNT.  SELECT SINGLE name_text FROM V_USR_NAME INTO t_output-NMACCOUNT      WHERE BNAME eq t_output-account.  IF t_output-typelem EQ 'T'.
****************** DATA on transaction*****************************    CLEAR t_output-DDTEXT.    SELECT SINGLE ttext FROM TSTCT INTO t_output-DDTEXT        WHERE tcode EQ t_output-ztcode AND              sprsl EQ sy-langu.
* Development class
*  Component
* Creator
* Creation Data
* Modification author
* Modification date    CLEAR: t_output-devclass.    SELECT SINGLE devclass        FROM TADIR INTO t_output-devclass      WHERE obj_name EQ t_output-ztcode AND            object EQ 'TRAN' AND            pgmid EQ 'R3TR'.
" Search application component    CLEAR: t_output-COMPID, ifctr_id.    IF NOT t_output-devclass IS INITIAL.      SELECT SINGLE component FROM TDEVC INTO ifctr_id        WHERE devclass EQ t_output-devclass.      IF sy-subrc EQ 0.        SELECT SINGLE ps_posid FROM DF14L INTO t_output-COMPID          WHERE fctr_id EQ ifctr_id.      ENDIF.    ENDIF.    CLEAR: ipgmna.    SELECT SINGLE pgmna FROM TSTC INTO ipgmna      WHERE tcode EQ t_output-ztcode.    CLEAR: t_output-cnam, t_output-cdat, t_output-cnamod, t_output-cdatmod.    SELECT SINGLE cnam cdat unam udat        FROM TRDIR INTO (t_output-cnam,t_output-cdat,t_output-cnamod,t_output-cdatmod)      WHERE name EQ ipgmna.
* Development class description    CLEAR t_output-DESCLASS.    SELECT SINGLE ctext FROM TDEVCT INTO t_output-DESCLASS      WHERE devclass EQ t_output-devclass AND                spras EQ sy-langu.  ELSEIF t_output-typelem EQ 'R'.
****************** DATA on REPORT *****************************
* Object description    CLEAR t_output-DDTEXT.    SELECT SINGLE text FROM TRDIRT INTO t_output-DDTEXT        WHERE name EQ t_output-ztcode AND              sprsl EQ sy-langu.
* Development Class
* Component
* Creator
* Creation data
* Modification author
* Modification date    CLEAR: t_output-devclass.    SELECT SINGLE devclass      FROM TADIR INTO t_output-devclass      WHERE obj_name EQ t_output-ztcode AND            object EQ 'PROG' AND            pgmid EQ 'R3TR'.
" Search application component    CLEAR: t_output-COMPID, ifctr_id.    IF NOT t_output-devclass IS INITIAL.      SELECT SINGLE component FROM TDEVC INTO ifctr_id        WHERE devclass EQ t_output-devclass.      IF sy-subrc EQ 0.        SELECT SINGLE ps_posid FROM DF14L INTO t_output-COMPID          WHERE fctr_id EQ ifctr_id.      ENDIF.    ENDIF.    CLEAR: t_output-cnam, t_output-cdat, t_output-cnamod, t_output-cdatmod.    SELECT SINGLE cnam cdat unam udat        FROM TRDIR INTO (t_output-cnam,t_output-cdat,t_output-cnamod,t_output-cdatmod)      WHERE name EQ t_output-ztcode.
* Development class description    CLEAR t_output-DESCLASS.    SELECT SINGLE ctext FROM TDEVCT INTO t_output-DESCLASS      WHERE devclass EQ t_output-devclass AND            spras EQ sy-langu.
* For report search transactions code related    CLEAR: iconta, search_trsn. ", it_tstcp,.    CONCATENATE '%D_SREPOVARI-REPORT=' t_output-ztcode '%' INTO search_trsn.    CONDENSE search_trsn NO-GAPS.    CLEAR: tstcp, t_output-zrepnm, t_output-ZDESREPNM, it_tstcp.    READ TABLE t_elcod WITH KEY ztcode = t_output-ztcode.    CHECK sy-subrc NE 0. ""If object code founded, it's a report with no association    READ TABLE it_tstcp WITH KEY tcode = t_output-ztcode.    IF sy-subrc EQ 0.      t_output-zrepnm = it_tstcp-zrepnm.      t_output-zdesrepnm = it_tstcp-zdesrepnm.    ELSE.      SELECT SINGLE * FROM tstcp WHERE param LIKE search_trsn.      IF sy-subrc EQ 0.        t_output-zrepnm = tstcp-tcode.        CLEAR t_output-ZDESREPNM.        SELECT SINGLE ttext FROM TSTCT INTO t_output-ZDESREPNM            WHERE tcode EQ t_output-zrepnm AND                  sprsl EQ sy-langu.        SELECT SINGLE * FROM tstcp WHERE param LIKE search_trsn AND                                          tcode NE tstcp-tcode.        IF sy-subrc EQ 0.          t_output-zrepnm = text-i01.          t_output-ZDESREPNM = text-i02.          it_tstcp-tcode = t_output-ztcode.        ELSE.          it_tstcp-tcode = tstcp-tcode.        ENDIF.        it_tstcp-zrepnm = t_output-zrepnm.        it_tstcp-zdesrepnm = t_output-zdesrepnm.        APPEND it_tstcp.      ELSE.        t_elcod-ztcode = t_output-ztcode.        APPEND t_elcod.      ENDIF.    ENDIF.  ENDIF.
ENDFORM.                    "add_info
*&---------------------------------------------------------------------*
*&      Form  verifica_selezioni
*&---------------------------------------------------------------------*
*      text
*----------------------------------------------------------------------*
*      -->F_LINE    text
*      -->F_VALIDO  text
*----------------------------------------------------------------------*
FORM verifica_selezioni USING f_line TYPE ZWORKLOAD "SWNCHITLIST                        CHANGING f_valido.  CLEAR f_valido.
* Report or Transaction?  CHECK f_line-typelem IN s_reptr.
* Check report and transaction Filter Selection  CHECK NOT f_line-ztcode IS INITIAL AND f_line-ztcode IN s_tcode.
* Check Username Filter Selection  CHECK NOT f_line-account IS INITIAL AND f_line-account IN s_user.  f_valido = 'X'.
ENDFORM.                    "verifica_selezioni

 

That's all folks. I hope you enjoy.

 

Probably this utility will be useful, or probably not. It's all part of the game

 

Bye!

 

 

Text Definition

 

E01No data available
F01Terminal
F02Transaction
F03User
F04Object name
I01****
I02Found many transactions
T01Selection parameters

Viewing all articles
Browse latest Browse all 935

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>