*&---------------------------------------------------------------------* *& Report ZZ_PROCESS_CHAIN_WATCHDOG *& *&---------------------------------------------------------------------* *& Documentation: * This is a watchdog (Sentinel) program that reports all * errors in process chains. * * Selection-screen help: * 1) Test Run (No email, Just Rpt) * If you choose this option, you will see the list of process * chains in error on the screen / spool. However, no email * will be sent out. * 2) Process Chain (ID) * Enter the name of process chain to analyze. * If you leave this field blank, all the process chains will * be picked up. * 3) Number of days to consider * How far back you want to check process chain run? * Enter the number of days here. * 4) Send email? * Mark this checkbox, if you want to send email notification * 5) Email receipients * The list of people to be notified is entered here. * * How to use this program? * Schedule this program using a job (sm36/sm37) at regular frequency. * The frequency should closely follow the data load frequency. * *&---------------------------------------------------------------------* * Author : Jeevan Kumar Ravindran * email : Jeevan.Ravindran@tli-usa.com * Dates : Dec/2007 * Description : *----------------------------------------------------------------------* * Change History (Latest Change First ) * ------------------------------------- * Changed By : Jeevan.Ravindran@tli-usa.com / Jeevan@infoelixir.com * Company : Tek-Link / InfoElxir * Date(s) of Change : Mar/2008 * Change Id : * Requested By : * Description : Support for all error scenarios * ************************************************************************ REPORT ZZ_PROCESS_CHAIN_WATCHDOG NO STANDARD PAGE HEADING MESSAGE-ID 00 LINE-SIZE 255 LINE-COUNT 55. *----------------------------------------------------------------------* * Constants *----------------------------------------------------------------------* CONSTANTS: gc_false TYPE rs_bool VALUE ' ', gc_true TYPE rs_bool VALUE 'X', gc_Indx_ID TYPE INDX-SRTFD VALUE 'ZPCHAIN_WATCHDOG_DB', gc_Active_Ver(1) TYPE c VALUE 'A', gc_UnAnalyzed_Check TYPE c VALUE '1', gc_Analyzed_Check TYPE c VALUE '2', gc_Max_Track_Entries TYPE i VALUE 3000. *----------------------------------------------------------------------* * Structures & Types * *----------------------------------------------------------------------* TYPES: BEGIN OF t_ZPCSP_Log, CHAIN_ID TYPE RSPCLOGCHAIN-CHAIN_ID, LOG_ID TYPE RSPCLOGCHAIN-LOG_ID, END OF t_ZPCSP_Log. DATA: gs_RSPCLOGCHAIN TYPE rspclogchain, gv_TrkTbl_Lines TYPE i, gs_Indx TYPE INDX. *----------------------------------------------------------------------* * Internal tables * *----------------------------------------------------------------------* DATA: gt_LogChain TYPE TABLE OF rspclogchain, gt_ZPCSP_Log TYPE TABLE OF t_ZPCSP_Log. *----------------------------------------------------------------------* * Variables * *----------------------------------------------------------------------* DATA: gv_RECEIVER TYPE SOMLRECI1-RECEIVER. *----------------------------------------------------------------------* * Ranges * *----------------------------------------------------------------------* *----------------------------------------------------------------------* * Selection-Screen * *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK om0 WITH FRAME TITLE text-557. PARAMETERS: p_Test AS CHECKBOX. SELECTION-SCREEN END OF BLOCK om0. SELECTION-SCREEN BEGIN OF BLOCK om1 WITH FRAME TITLE text-555. SELECT-OPTIONS p_CHAIN for gs_RSPCLOGCHAIN-CHAIN_ID. PARAMETERS: p_Days(3) type n default 3. SELECTION-SCREEN END OF BLOCK om1. SELECTION-SCREEN BEGIN OF BLOCK om2 WITH FRAME TITLE text-556. PARAMETERS: p_Email AS CHECKBOX DEFAULT 'X'. SELECT-OPTIONS: s_mail FOR gv_RECEIVER lower case NO INTERVALS. SELECTION-SCREEN END OF BLOCK om2. AT SELECTION-SCREEN. if p_Email = gc_true. READ TABLE s_mail INDEX 1. if sy-subrc <> 0. MESSAGE e001 WITH 'Please enter atleast one email address'. ENDIF. ENDIF. loop at s_mail. if not s_mail-high is initial. MESSAGE e001 WITH s_mail-high 'is not valid. Please enter with no intervals'. endif. endloop. *----------------------------------------------------------------------* * Start-of-selection * *----------------------------------------------------------------------* START-OF-SELECTION. * House keeping PERFORM Initial_Steps. * Get process chains that have not yet been analyzed PERFORM Get_Process_Chain_Data. *----------------------------------------------------------------------* * End-of-selection * *----------------------------------------------------------------------* END-OF-SELECTION. * Process the selected Process Chain log PERFORM Process_PChains_in_Error. * House keeping PERFORM Process_Tracking_Info. *----------------------------------------------------------------------* * Top-of-Page * *----------------------------------------------------------------------* TOP-OF-PAGE. * Process the selected Process Chain log PERFORM Page_Header. *&---------------------------------------------------------------------* *& Form INITIAL_STEPS *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM INITIAL_STEPS . REFRESH gt_ZPCSP_Log. * IMPORT tab = gt_ZPCSP_Log FROM DATABASE INDX(ZP) TO GS_INDX CLIENT sy-mandt ID gc_Indx_ID. DESCRIBE TABLE gt_ZPCSP_Log LINES gv_TrkTbl_Lines. ENDFORM. " INITIAL_STEPS *&---------------------------------------------------------------------* *& Form Get_Process_Chain_Data *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM Get_Process_Chain_Data . DATA: lv_From_Dt TYPE d, lv_To_Dt TYPE d. lv_From_Dt = sy-datum - p_Days. * Take care of Time zone differences (Eurasia, America etc.) lv_To_Dt = sy-datum + 1. * Check Un-analyzed Process chains PERFORM Check_UnAnalyzed_in_Error TABLES gt_LogChain USING lv_From_Dt lv_To_Dt. * Additional step - Analyzed = X but has no email sent PERFORM Check_Analyzed_in_Error TABLES gt_LogChain USING lv_From_Dt lv_To_Dt. ENDFORM. " Get_Process_Chain_Data *&---------------------------------------------------------------------* *& Form Filter_PC_by_Current_Status *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM Filter_PC_by_Current_Status TABLES pt_LogChain STRUCTURE rspclogchain USING p_Check_Type TYPE c. DATA: ls_LogChain TYPE rspclogchain, l_s_log TYPE rspcprocesslog, l_t_log TYPE TABLE OF rspcprocesslog, lf_Step_has_error, lf_Notif_Defined, lf_Select_this_LogID, l_object TYPE seoclsname, l_status_if TYPE rs_bool, l_s_object TYPE rsprocesstypes, l_t_object TYPE HASHED TABLE OF rsprocesstypes WITH UNIQUE KEY type. * For all PC Log get logs for each process steps LOOP AT pt_LogChain INTO ls_LogChain. * Clear flag CLEAR: lf_Select_this_LogID. REFRESH: l_t_log. * Get the log for all steps SELECT * FROM rspcprocesslog INTO TABLE l_t_log WHERE log_id = ls_LogChain-LOG_ID. if sy-subrc = 0. * Now analyze the selected log entries * ==== Find out actual state for ... ==== * - Jobs with get_status interface * - Jobs with unfinished state LOOP AT l_t_log INTO l_s_log. * Initialize CLEAR: l_s_object, lf_Notif_Defined, lf_Step_has_error. * ---- find out object for type (if implemented) ---- READ TABLE l_t_object INTO l_s_object WITH TABLE KEY type = l_s_log-type. IF sy-subrc <> 0. CLEAR: l_object, l_s_object. l_s_object-type = l_s_log-type. CALL FUNCTION 'RSPC_HAS_INTERFACE' EXPORTING i_type = l_s_log-type i_method = 'GET_STATUS' IMPORTING e_object = l_object EXCEPTIONS interface_not_implemented = 1 unknown_process = 2 OTHERS = 3. IF sy-subrc = 0. l_s_object-object = l_object. ENDIF. INSERT l_s_object INTO TABLE l_t_object. ENDIF. CLEAR l_status_if. IF NOT l_s_object-object IS INITIAL AND NOT l_s_log-instance IS INITIAL. * .... Find out state via interface .... CALL METHOD (l_s_object-object)=>if_rspc_get_status~get_status EXPORTING i_variant = l_s_log-variante i_instance = l_s_log-instance i_dont_update = 'X' IMPORTING e_status = l_s_log-actual_state. * ==== Set the Flag =============== if l_s_log-actual_state CA 'RXJ'. lf_Step_has_error = gc_true. ENDIF. l_status_if = 'X'. ELSEIF l_s_log-state CA 'RXJ'. lf_Step_has_error = gc_true. ELSE. IF ls_LogChain-synchronous = gc_false. * .... Find out state via batch .... CALL FUNCTION 'RSPC_GET_JOBSTATE' EXPORTING i_type = l_s_log-type i_variant = l_s_log-variante i_jobcount = l_s_log-job_count IMPORTING e_status = l_s_log-actual_state EXCEPTIONS failed = 1. IF sy-subrc <> 0 AND l_s_log-state CA 'RXJ'. * ==== Set the Flag =============== lf_Step_has_error = gc_true. ENDIF. * ==== Set the Flag =============== if l_s_log-actual_state CA 'RXJ'. lf_Step_has_error = gc_true. ENDIF. ELSE. * .... Keep synchronous state .... if l_s_log-state CA 'RXJ'. * ==== Set the Flag =============== lf_Step_has_error = gc_true. ENDIF. "if l_s_log-state CA 'RXJ'. ENDIF. "IF ls_LogChain-synchronous = gc_false. ENDIF. "IF NOT l_s_object-object IS INITIAL AND * Error found hence no need to check further IF lf_Step_has_error = gc_true. CASE p_Check_Type. * Different checks WHEN gc_UnAnalyzed_Check. * Set the flag lf_Select_this_LogID = gc_true. * Exit further check of this PC Log EXIT. WHEN gc_Analyzed_Check. * Error found, now check whether email notification exist PERFORM Check_PC_Definition_for_Email USING ls_LogChain-CHAIN_ID l_s_log-TYPE l_s_log-variante lf_Notif_Defined. if lf_Notif_Defined IS INITIAL. * Set the flag lf_Select_this_LogID = gc_true. * Exit further check of this PC log EXIT. ENDIF. "if lf_Notif_Defined IS INITIAL. ENDCASE. "CASE p_Check_Type ENDIF. "IF lf_Step_has_error = gc_true. ENDLOOP. "LOOP AT l_t_log INTO l_s_log * --- Finished analyzing all the steps of the PC ----- * Check whether to select the ID for further process if lf_Select_this_LogID is INITIAL. * Add this to the processed log so that this won't be analyzed again PERFORM Add_PC_Log_to_ZPCSP_Log USING ls_LogChain-CHAIN_ID ls_LogChain-LOG_ID. * Do not analyze this process chain DELETE pt_LogChain WHERE CHAIN_ID = ls_LogChain-CHAIN_ID AND LOG_ID = ls_LogChain-LOG_ID. ENDIF. "if lf_Select_this_LogID is INITIAL. ENDIF. "if sy-subrc = 0 (select rspcprocesslog) ENDLOOP. "LOOP AT pt_LogChain * ENDFORM. " Filter_PC_by_Current_Status *&---------------------------------------------------------------------* *& Form Process_PChains_in_Error *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM Process_PChains_in_Error . DATA: ls_LogChain TYPE rspclogchain, lt_PROCESSLIST TYPE TABLE OF RSPC_S_PROCESSLIST, lv_PC_Date TYPE d, lv_PC_Time TYPE t, lv_Count TYPE i, lv_PC_Text TYPE rspcchaint-txtlg. if gt_LogChain[] is INITIAL. "no chains that have not been analyzed MESSAGE s001 WITH 'No process chains in errors found'. ELSE. * Process the error run LOOP at gt_LogChain INTO ls_LogChain. * Initialize CLEAR: lv_PC_Date, lv_PC_Time, lv_PC_Text. lv_Count = lv_Count + 1. * Get Text SELECT SINGLE txtlg FROM rspcchaint INTO lv_PC_Text WHERE langu = sy-langu AND chain_id = ls_LogChain-chain_id AND OBJVERS = gc_Active_Ver. * Convert Time CALL FUNCTION 'RSSM_GET_TIME' EXPORTING * I_TIMESTAMPL = * I_TIMESTAMPS = I_DATUM_UTC = ls_LogChain-DATUM I_UZEIT_UTC = ls_LogChain-ZEIT * I_DATUM_LOC = * I_UZEIT_LOC = * I_DATUM_SYS = * I_UZEIT_SYS = * I_USE_ENQ_SERVER = ' ' IMPORTING * E_DATUM_LOC = * E_UZEIT_LOC = * E_TIMESTAMPS = * E_TIMESTAMPL = * E_DATUM_UTC = * E_UZEIT_UTC = E_DATUM_SYS = lv_PC_Date E_UZEIT_SYS = lv_PC_Time EXCEPTIONS FAILED = 1 OTHERS = 2 . IF SY-SUBRC <> 0. lv_PC_Date = ls_LogChain-DATUM. lv_PC_Time = ls_LogChain-ZEIT. ENDIF. IF p_Test is INITIAL. CALL FUNCTION 'RSPC_API_CHAIN_GET_PROCESSES' EXPORTING I_CHAIN = ls_LogChain-CHAIN_ID I_LOGID = ls_LogChain-LOG_ID TABLES E_T_PROCESSLIST = lt_PROCESSLIST EXCEPTIONS FAILED = 1 OTHERS = 2. ENDIF. "IF p_Test is INITIAL. IF p_Email = gc_true AND p_Test is INITIAL. PERFORM send_email using ls_LogChain-CHAIN_ID lv_PC_Text lv_PC_Date lv_PC_Time. ENDIF. "IF p_Email = gc_true * Show Report WRITE:/1 sy-vline, 2 'Process Chain:', ls_LogChain-CHAIN_ID, '(', lv_PC_Text, ')', 'Ran on:', lv_PC_Date MM/DD/YYYY, 'at:', (8) lv_PC_Time USING EDIT MASK '__:__:__', 'has errors'. WRITE 255 sy-vline. ULINE. * Add to the tracking table PERFORM Add_PC_Log_to_ZPCSP_Log USING ls_LogChain-CHAIN_ID ls_LogChain-LOG_ID. ENDLOOP. "LOOP at gt_LogChain INTO ls_LogChain if lv_Count > 0. MESSAGE s001 WITH 'Analyzed: ' lv_Count ' erroneous process chain runs.'. ENDIF. ENDIF. ENDFORM. " Process_PChains_in_Error *&---------------------------------------------------------------------* *& Form Page_Header *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM Page_Header . format INTENSIFIED on. FORMAT COLOR COL_HEADING. ULINE. WRITE: /1 sy-vline, 'Date : ', sy-datum MM/DD/YYYY, ' Time : ', sy-uzeit USING EDIT MASK '__:__:__', ' System : ', sy-sysid, 100 'Process Chain Sentinal Program: ', sy-repid, 235 'Page:', (5) sy-pagno, 255 sy-vline. ULINE. format INTENSIFIED off. FORMAT COLOR COL_NORMAL. ENDFORM. " Page_Header *&---------------------------------------------------------------------* *& Form send_email *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM send_email using p_CHAIN_ID TYPE rspclogchain-CHAIN_ID p_PC_Text TYPE rspcchaint-txtlg p_PC_Date type d p_PC_Time type T. DATA: RECV LIKE SOMLRECI1 OCCURS 1 WITH HEADER LINE, OBJECT_ID LIKE SOFOLENTI1-OBJECT_ID, OBJCONT LIKE SOLI OCCURS 10 WITH HEADER LINE, v_document_data LIKE SODOCCHGI1, v_dt_mail(10), v_tm_mail(8). refresh OBJCONT. clear OBJCONT. * message attachment APPEND OBJCONT. OBJCONT-LINE = '*----------------------------------------------------------------*'. APPEND OBJCONT. CONCATENATE 'System : ' sy-sysid into OBJCONT-LINE SEPARATED BY space. APPEND OBJCONT. CONCATENATE 'Process Chain : ' p_CHAIN_ID into OBJCONT-LINE SEPARATED BY space. APPEND OBJCONT. CONCATENATE 'Process Chain''s Descr. : ' p_PC_Text into OBJCONT-LINE SEPARATED BY space. APPEND OBJCONT. write p_PC_Date to v_dt_mail MM/DD/YYYY. CONCATENATE 'Ran on : ' v_dt_mail into OBJCONT-LINE SEPARATED BY space. APPEND OBJCONT. write p_PC_Time to v_tm_mail. CONCATENATE 'Ran at : ' v_tm_mail into OBJCONT-LINE SEPARATED BY space. APPEND OBJCONT. OBJCONT-LINE = '*-----------------------------------------------------------------*'. APPEND OBJCONT. CLEAR OBJCONT-LINE. APPEND OBJCONT. * --- Customize the message contents by changing the below line * OBJCONT-LINE = 'The above-listed process chain has errors and has been terminated.'. APPEND OBJCONT. OBJCONT-LINE = 'Please check.'. APPEND OBJCONT. REFRESH recv. CLEAR recv. loop at s_mail. * receivers RECV-RECEIVER = s_mail-low. "recipient RECV-EXPRESS = 'X'. RECV-REC_TYPE = 'U'. "internet email append recv. endloop. * document data - description is subject line v_document_data-obj_name = 'Process Chain Watchdog'. CONCATENATE 'Process Chain:' p_CHAIN_ID 'has errors' into v_document_data-obj_descr SEPARATED BY space. * send mail message CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1' EXPORTING DOCUMENT_DATA = v_document_data DOCUMENT_TYPE = 'RAW' PUT_IN_OUTBOX = 'X' COMMIT_WORK = 'X' IMPORTING NEW_OBJECT_ID = OBJECT_ID TABLES OBJECT_CONTENT = OBJCONT RECEIVERS = RECV EXCEPTIONS TOO_MANY_RECEIVERS = 1 DOCUMENT_NOT_SENT = 2 DOCUMENT_TYPE_NOT_EXIST = 3 OPERATION_NO_AUTHORIZATION = 4 PARAMETER_ERROR = 5 X_ERROR = 6 ENQUEUE_ERROR = 7 OTHERS = 8. IF sy-subrc <> 0. MESSAGE s001 WITH 'Email was not sent'. ELSE. MESSAGE s001 WITH 'Email was successfully sent'. ENDIF. ENDFORM. " send_email *&---------------------------------------------------------------------* *& Form CHECK_UNANALYZED_IN_ERROR *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_GT_LOGCHAIN text * -->P_LV_FROM_DT text * -->P_LV_TO_DT text *----------------------------------------------------------------------* FORM CHECK_UNANALYZED_IN_ERROR TABLES pt_LogChain STRUCTURE RSPCLOGCHAIN USING p_From_Dt TYPE d p_To_Dt TYPE d. DATA: lt_LogChain TYPE TABLE OF rspclogchain, ls_LogChain TYPE rspclogchain. * Get Process Chain logs that have not yet been reported SELECT * FROM RSPCLOGCHAIN INTO TABLE lt_LogChain WHERE CHAIN_ID in p_CHAIN and datum BETWEEN p_From_Dt And p_To_Dt and ANALYZED = Space. * Check whether the log has already been considered LOOP at lt_LogChain INTO ls_LogChain. READ TABLE gt_ZPCSP_Log WITH KEY CHAIN_ID = ls_LogChain-CHAIN_ID LOG_ID = ls_LogChain-LOG_ID TRANSPORTING NO FIELDS. IF sy-subrc = 0. * Skip this Log/ID DELETE lt_LogChain WHERE CHAIN_ID = ls_LogChain-CHAIN_ID AND LOG_ID = ls_LogChain-LOG_ID. ENDIF. ENDLOOP. * Analyze each step IF NOT lt_LogChain[] IS INITIAL. PERFORM Filter_PC_by_Current_Status TABLES lt_LogChain USING gc_UnAnalyzed_Check. * Add the Process chain Logs to global log APPEND LINES OF lt_LogChain TO pt_LogChain. ENDIF. ENDFORM. " CHECK_UNANALYZED_IN_ERROR *&---------------------------------------------------------------------* *& Form CHECK_ANALYZED_IN_ERROR *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM CHECK_ANALYZED_IN_ERROR TABLES pt_LogChain STRUCTURE RSPCLOGCHAIN USING p_From_Dt TYPE d p_To_Dt TYPE d. DATA: lt_LogChain TYPE TABLE OF rspclogchain, ls_LogChain TYPE rspclogchain. * Get Process Chain logs that has Analyzed set SELECT * FROM RSPCLOGCHAIN INTO TABLE lt_LogChain WHERE CHAIN_ID in p_CHAIN and datum BETWEEN p_From_Dt And p_To_Dt and ANALYZED = gc_true AND ( ANALYZED_STATUS = 'X' or ANALYZED_STATUS = 'R' or ANALYZED_STATUS = 'J' ). * Check whether the log has already been considered LOOP at lt_LogChain INTO ls_LogChain. READ TABLE gt_ZPCSP_Log WITH KEY CHAIN_ID = ls_LogChain-CHAIN_ID LOG_ID = ls_LogChain-LOG_ID TRANSPORTING NO FIELDS. IF sy-subrc = 0. * Skip this Log/ID DELETE lt_LogChain WHERE CHAIN_ID = ls_LogChain-CHAIN_ID AND LOG_ID = ls_LogChain-LOG_ID. ENDIF. ENDLOOP. * Analyze each step IF NOT lt_LogChain[] IS INITIAL. PERFORM Filter_PC_by_Current_Status TABLES lt_LogChain USING gc_Analyzed_Check. * Add the Process chain Logs to global log APPEND LINES OF lt_LogChain TO pt_LogChain. ENDIF. ENDFORM. " CHECK_ANALYZED_IN_ERROR *&---------------------------------------------------------------------* *& Form CHECK_EACH_STEP_PC_LOG *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_GS_LOGCHAIN text * -->P_L_S_LOG text *----------------------------------------------------------------------* *FORM CHECK_EACH_STEP_PC_LOG * USING PS_LOGCHAIN TYPE rspclogchain * pf_PC_has_error TYPE c. * * * *ENDFORM. " CHECK_EACH_STEP_PC_LOG *&---------------------------------------------------------------------* *& Form CHECK_PC_DEFINITION_FOR_EMAIL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_LS_LOGCHAIN_CHAIN_ID text * -->P_L_S_LOG_TYPE text * -->P_L_S_LOG_VARIANTE text * -->P_lf_Notif_Not_Defined text *----------------------------------------------------------------------* FORM CHECK_PC_DEFINITION_FOR_EMAIL USING P_CHAIN_ID TYPE rspclogchain-CHAIN_ID p_TYPE TYPE rspcprocesslog-TYPE P_VARIANTE TYPE rspcprocesslog-variante Pf_Notif_Exist TYPE c. DATA: lv_MAIL_AT_RED TYPE RSPCCHAIN-MAIL_AT_RED. * Initialize CLEAR: pf_Notif_Exist. * Check against Process Chain definition SELECT MAIL_AT_RED FROM RSPCCHAIN UP TO 1 ROWS INTO lv_MAIL_AT_RED WHERE CHAIN_ID = P_CHAIN_ID AND OBJVERS = gc_Active_Ver AND TYPE = p_TYPE AND VARIANTE = P_VARIANTE. exit. ENDSELECT. * Check whether email notification exist if sy-subrc = 0 AND NOT lv_MAIL_AT_RED IS INITIAL. pf_Notif_Exist = gc_true. ENDIF. ENDFORM. " CHECK_PC_DEFINITION_FOR_EMAIL *&---------------------------------------------------------------------* *& Form ADD_PC_LOG_TO_ZPCSP_LOG *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_P_CHAIN_ID text * -->P_P_LOG_ID text *----------------------------------------------------------------------* FORM ADD_PC_LOG_TO_ZPCSP_LOG USING P_CHAIN_ID type RSPCLOGCHAIN-CHAIN_ID P_LOG_ID type RSPCLOGCHAIN-LOG_ID. DATA: ls_ZPCSP_Log TYPE t_ZPCSP_Log. ls_ZPCSP_Log-CHAIN_ID = P_CHAIN_ID. ls_ZPCSP_Log-LOG_ID = P_LOG_ID. APPEND ls_ZPCSP_Log TO gt_ZPCSP_Log. ENDFORM. " ADD_PC_LOG_TO_ZPCSP_LOG *&---------------------------------------------------------------------* *& Form PROCESS_TRACKING_INFO *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM PROCESS_TRACKING_INFO . DATA: lv_Curr_Lines TYPE i, lv_no_of_Del_ln TYPE i. if p_Test IS INITIAL. * Get the current no lines in gt_ZPCSP_Log DESCRIBE TABLE gt_ZPCSP_Log LINES lv_Curr_Lines. * First check any new entries present IF lv_Curr_Lines > gv_TrkTbl_Lines. lv_no_of_Del_ln = lv_Curr_Lines - gc_Max_Track_Entries. * Get rid of old entries, if needed if lv_no_of_Del_ln > 0. DELETE gt_ZPCSP_Log FROM 1 to lv_no_of_Del_ln. endif. * Record in tracking table gs_Indx-aedat = sy-datum. gs_Indx-usera = sy-uname. gs_Indx-pgmid = sy-repid. * Save the most recent entries (upto gc_Max_Track_Entries) EXPORT tab = gt_ZPCSP_Log TO DATABASE INDX(ZP) FROM GS_INDX CLIENT sy-mandt ID gc_Indx_ID. ENDIF. "IF lv_Curr_Lines > gv_TrkTbl_Lines ENDIF. "if p_Test IS INITIAL ENDFORM. " PROCESS_TRACKING_INFO