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:
MANDT | MANDT | CLNT | 3 |
PERIOD | SPMON | NUMC | 6 |
ACCOUNT | ZWKACCOUNT | CHAR | 12 |
NMACCOUNT | ZWKNMACC | CHAR | 80 |
ZTCODE | ZSWLTCODE | CHAR | 40 |
DDTEXT | ZWKDTEXT | CHAR | 70 |
TYPELEM | ZTYPELEM | CHAR | 1 |
ZLNCHT | ZWKZLNCHT | CHAR | 10 |
ZREPNM | ZWKDREPBN | CHAR | 40 |
ZDESREPNM | ZWKDESREPNM | CHAR | 70 |
DEVCLASS | ZWKCLASS | CHAR | 30 |
DESCLASS | ZWKDESCL | CHAR | 80 |
COMPID | ZWKCOMPID | CHAR | 24 |
CNAM | ZWKCNAM | CHAR | 12 |
CDAT | ZWKCDAT | DATS | 8 |
CNAMOD | ZWKCNAMOD | CHAR | 12 |
CDATMOD | ZWKCDATMOD | DATS | 8 |
DESTASKTYPE | ZWKTSKTYP | CHAR | 16 |
ZSTEPS | ZWKSTEPS | INT4 | 10 |
*&---------------------------------------------------------------------*
*& 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 :smile:
Bye!
Text Definition
E01 | No data available |
F01 | Terminal |
F02 | Transaction |
F03 | User |
F04 | Object name |
I01 | **** |
I02 | Found many transactions |
T01 | Selection parameters |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
6 | |
5 | |
3 | |
3 | |
2 | |
2 | |
2 | |
1 | |
1 | |
1 |