You are on page 1of 8

SELECT

/*

[NAME]

- HANA_ABAP_BatchJobs

[DESCRIPTION]

- Overview of ABAP batch jobs

[SOURCE]

- SAP Note 1969700

[DETAILS AND RESTRICTIONS]

- Table TBTCO only available in SAP ABAP environments


- You have to be connected to the SAP<sid> schema otherwise the following error is
issued:

[259]: invalid table name: Could not find table/view TBTCO in schema

- If access to ABAP objects is possible but you cannot log on as ABAP user, you can
switch the default schema before executing the command:

SET SCHEMA SAP<sid>

[VALID FOR]

- Revisions: all
- Statistics server type: all
- Client application: ABAP

[SQL COMMAND VERSION]

- 2018/10/24: 1.0 (initial version)


- 2018/12/03: 1.1 (shortcuts for BEGIN_TIME and END_TIME like 'C', 'E-S900' or
'MAX')
- 2019/01/23: 1.2 (WP_PID included)
- 2020/03/04: 1.3 (EVENTID included)

[INVOLVED TABLES]

- TBTCO

[INPUT PARAMETERS]

- BEGIN_TIME

Begin time

'2018/12/05 14:05:00' --> Set begin time to 5th of December 2018, 14:05
'C' --> Set begin time to current time
'C-S900' --> Set begin time to current time minus 900 seconds
'C-M15' --> Set begin time to current time minus 15 minutes
'C-H5' --> Set begin time to current time minus 5 hours
'C-D1' --> Set begin time to current time minus 1 day
'C-W4' --> Set begin time to current time minus 4 weeks
'E-S900' --> Set begin time to end time minus 900 seconds
'E-M15' --> Set begin time to end time minus 15 minutes
'E-H5' --> Set begin time to end time minus 5 hours
'E-D1' --> Set begin time to end time minus 1 day
'E-W4' --> Set begin time to end time minus 4 weeks
'MIN' --> Set begin time to minimum (1000/01/01 00:00:00)

- END_TIME

End time

'2018/12/08 14:05:00' --> Set end time to 8th of December 2018, 14:05
'C' --> Set end time to current time
'C-S900' --> Set end time to current time minus 900 seconds
'C-M15' --> Set end time to current time minus 15 minutes
'C-H5' --> Set end time to current time minus 5 hours
'C-D1' --> Set end time to current time minus 1 day
'C-W4' --> Set end time to current time minus 4 weeks
'B+S900' --> Set end time to begin time plus 900 seconds
'B+M15' --> Set end time to begin time plus 15 minutes
'B+H5' --> Set end time to begin time plus 5 hours
'B+D1' --> Set end time to begin time plus 1 day
'B+W4' --> Set end time to begin time plus 4 weeks
'MAX' --> Set end time to maximum (9999/12/31 23:59:59)

- JOB_NAME

Batch job name

'EU_REORG' --> Batch job EU_REORG


'%' --> No restriction related to batch job name

- USER_NAME

Batch job scheduling user

'SAPADM' --> User SAPADM


'%' --> No restriction related to batch job scheduling user

- MIN_DURATION_S

Threshold for minimum batch job duration

3600 --> Only consider batch jobs with a runtime of at least 3600
seconds
-1 --> No restriction related to batch job duration

- STATUS

Batch job status (check "Modification section" for all possible values)

'CANCELLED' --> Only display cancelled batch jobs


'%' --> No restriction related to batch job user

- EVENTID

Event ID (for event triggered jobs)


'SAP_END_OF_JOB' --> Display jobs that are triggered by the end of another job
'SAP_SYSTEM_START' --> Display jobs to be started during system start
'%' --> No restriction related to event ID

- AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'TIME' --> Aggregation by time


'HOST, PORT' --> Aggregation by host and port
'NONE' --> No aggregation

- TIME_AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'HOUR' --> Aggregation by hour


'YYYY/WW' --> Aggregation by calendar week
'TS<seconds>' --> Time slice aggregation based on <seconds> seconds
'NONE' --> No aggregation

- ORDER_BY

Sort criteria (available values are provided in comment)

'SIZE' --> Sorting by size


'TABLE' --> Sorting by table name

[OUTPUT PARAMETERS]

- START_TIME: Start time of considered time interval


- JOB_NAME: Batch job name
- USER_NAME: Scheduling user name
- STATUS: Batch job status
- EVENTID: Event ID
- WP_PID: Process ID of work process
- NUM_JOBS: Number of batch jobs
- TOT_DUR_S: Total duration (s)
- AVG_DUR_S: Average duration (s)

[EXAMPLE OUTPUT]

-----------------------------------------------------------------------------------
--------------
|START_TIME |JOB_NAME |USER_NAME|STATUS |NUM_JOBS|
TOT_DUR_S |AVG_DUR_S |
-----------------------------------------------------------------------------------
--------------
|2018/12/19 12:15:22|BI_PROCESS_ABAP |MAESTRO |CANCELLED| 1|
182546| 182546.00|
|2018/12/20 04:03:20|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
125654| 125654.00|
|2018/12/20 04:03:22|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
125648| 125648.00|
|2018/12/20 06:32:34|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
116714| 116714.00|
|2018/12/20 07:46:57|BIDTPR_2740096_1 |ALEREMOTE|CANCELLED| 1|
112251| 112251.00|
|2018/12/20 07:54:06|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111822| 111822.00|
|2018/12/20 07:54:05|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111805| 111805.00|
|2018/12/20 08:00:27|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111423| 111423.00|
|2018/12/20 08:29:31|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
109697| 109697.00|
|2018/12/20 08:29:33|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
109677| 109677.00|
|2018/12/20 08:59:15|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
107913| 107913.00|
|2018/12/20 09:29:30|BIDTPR_2740314_1 |ALEREMOTE|CANCELLED| 1|
106098| 106098.00|
|2018/12/20 09:31:42|BIDTPR_2740314_1 |ALEREMOTE|CANCELLED| 1|
105948| 105948.00|
|2018/12/20 09:38:48|BIDTPR_2740329_1 |ALEREMOTE|CANCELLED| 1|
105522| 105522.00|
|2018/12/20 09:55:53|BI_WRITE_PROT_TO_APPLLOG|ABCDEF |CANCELLED| 1|
104497| 104497.00|
|2018/12/22 12:15:10|BI_PROCESS_ABAP |MAESTRO |RUNNING | 1|
93905| 93905.00|
-----------------------------------------------------------------------------------
--------------

*/

START_TIME,
JOB_NAME,
USER_NAME,
STATUS,
EVENTID,
LPAD(WP_PID, 7) WP_PID,
LPAD(NUM_JOBS, 8) NUM_JOBS,
LPAD(DURATION_S, 10) TOT_DUR_S,
LPAD(TO_DECIMAL(MAP(NUM_JOBS, 0, 0, DURATION_S / NUM_JOBS), 10, 2), 10) AVG_DUR_S
FROM
( SELECT
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00', 'YYYY/MM/DD
HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), J.BEGIN_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(J.BEGIN_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END START_TIME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'JOB') != 0
THEN J.JOB_NAME ELSE MAP(BI.JOB_NAME, '%', 'any', BI.JOB_NAME)
END JOB_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'USER') != 0
THEN J.USER_NAME ELSE MAP(BI.USER_NAME, '%', 'any', BI.USER_NAME)
END USER_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATUS') != 0
THEN J.STATUS ELSE MAP(BI.STATUS, '%', 'any', BI.STATUS)
END STATUS,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'EVENTID') != 0
THEN J.EVENTID ELSE MAP(BI.EVENTID, '%', 'any', BI.EVENTID)
END EVENTID,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_PID') != 0
THEN TO_VARCHAR(J.WPPROCID) ELSE MAP(BI.WP_PID, -1, 'any',
TO_VARCHAR(BI.WP_PID)) END WP_PID,
COUNT(*) NUM_JOBS,
SUM(J.DURATION_S) DURATION_S,
BI.ORDER_BY
FROM
( SELECT
CASE
WHEN BEGIN_TIME = 'C' THEN CURRENT_TIMESTAMP
WHEN BEGIN_TIME LIKE 'C-S%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-S'))
WHEN BEGIN_TIME LIKE 'C-M%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-M') * 60)
WHEN BEGIN_TIME LIKE 'C-H%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-H') * 3600)
WHEN BEGIN_TIME LIKE 'C-D%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-D') * 86400)
WHEN BEGIN_TIME LIKE 'C-W%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-W') * 86400 * 7)
WHEN BEGIN_TIME LIKE 'E-S%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-S'))
WHEN BEGIN_TIME LIKE 'E-M%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-M') * 60)
WHEN BEGIN_TIME LIKE 'E-H%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-H') * 3600)
WHEN BEGIN_TIME LIKE 'E-D%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-D') * 86400)
WHEN BEGIN_TIME LIKE 'E-W%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-W') * 86400 * 7)
WHEN BEGIN_TIME = 'MIN' THEN
TO_TIMESTAMP('1000/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
WHEN SUBSTR(BEGIN_TIME, 1, 1) NOT IN ('C', 'E', 'M') THEN
TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS')
END BEGIN_TIME,
CASE
WHEN END_TIME = 'C' THEN CURRENT_TIMESTAMP
WHEN END_TIME LIKE 'C-S%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-S'))
WHEN END_TIME LIKE 'C-M%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-M') * 60)
WHEN END_TIME LIKE 'C-H%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-H') * 3600)
WHEN END_TIME LIKE 'C-D%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-D') * 86400)
WHEN END_TIME LIKE 'C-W%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-W') * 86400 * 7)
WHEN END_TIME LIKE 'B+S%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+S'))
WHEN END_TIME LIKE 'B+M%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+M') * 60)
WHEN END_TIME LIKE 'B+H%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+H') * 3600)
WHEN END_TIME LIKE 'B+D%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+D') * 86400)
WHEN END_TIME LIKE 'B+W%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+W') * 86400 * 7)
WHEN END_TIME = 'MAX' THEN
TO_TIMESTAMP('9999/12/31 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
WHEN SUBSTR(END_TIME, 1, 1) NOT IN ('C', 'B', 'M') THEN
TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS')
END END_TIME,
JOB_NAME,
USER_NAME,
MIN_DURATION_S,
WP_PID,
STATUS,
EVENTID,
AGGREGATE_BY
AGGREGATE_BY,
MAP(TIME_AGGREGATE_BY,
'NONE', 'YYYY/MM/DD HH24:MI:SS',
'HOUR', 'YYYY/MM/DD HH24',
'DAY', 'YYYY/MM/DD (DY)',
'HOUR_OF_DAY', 'HH24',
TIME_AGGREGATE_BY ) TIME_AGGREGATE_BY,
ORDER_BY
FROM
( SELECT /* Modification section */
'1000/10/18 07:58:00' BEGIN_TIME, /* YYYY/MM/DD HH24:MI:SS
timestamp, C, C-S<seconds>, C-M<minutes>, C-H<hours>, C-D<days>, C-W<weeks>, E-
S<seconds>, E-M<minutes>, E-H<hours>, E-D<days>, E-W<weeks>, MIN */
'MAX' END_TIME, /* YYYY/MM/DD HH24:MI:SS timestamp, C,
C-S<seconds>, C-M<minutes>, C-H<hours>, C-D<days>, C-W<weeks>, B+S<seconds>,
B+M<minutes>, B+H<hours>, B+D<days>, B+W<weeks>, MAX */
'%' JOB_NAME,
'%' USER_NAME,
86400 MIN_DURATION_S,
-1 WP_PID,
'%' STATUS, /* CANCELLED, FINISHED, SCHEDULED, RUNNING,
RELEASED, UNKNOWN, READY, PUT_ACTIVE */
'%' EVENTID,
'TIME' AGGREGATE_BY, /* TIME, JOB, USER, STATUS, EVENTID,
WP_PID or comma separated combinations, NONE for no aggregation */
'YYYY/MM' TIME_AGGREGATE_BY, /* HOUR, DAY, HOUR_OF_DAY or
database time pattern, TS<seconds> for time slice, NONE for no aggregation */
'TIME' ORDER_BY /* TIME, JOB, USER, STATUS, DURATION,
COUNT */
FROM
DUMMY
)
) BI,
( SELECT
BEGIN_TIME,
END_TIME,
SECONDS_BETWEEN(BEGIN_TIME, MAP(END_TIME, NULL, CURRENT_TIMESTAMP, '',
CURRENT_TIMESTAMP, END_TIME)) DURATION_S,
STATUS,
EVENTID,
JOB_NAME,
USER_NAME,
WPPROCID
FROM
( SELECT
TO_TIMESTAMP(STRTDATE || STRTTIME, 'YYYYMMDDHH24MISS') BEGIN_TIME,
MAP(ENDDATE, '00000000', NULL, TO_TIMESTAMP(ENDDATE || ENDTIME,
'YYYYMMDDHH24MISS')) END_TIME,
STATUS,
EVENTID,
JOB_NAME,
USER_NAME,
WPPROCID
FROM
( SELECT
CASE WHEN STRTDATE IN ('00000000', '') THEN SDLDATE ELSE STRTDATE END
STRTDATE,
CASE WHEN STRTDATE IN ('00000000', '') THEN SDLTIME ELSE STRTTIME END
STRTTIME,
MAP(STATUS, 'A', 'CANCELLED', 'F', 'FINISHED', 'P', 'SCHEDULED', 'R',
'RUNNING', 'S', 'RELEASED', 'X', 'UNKNOWN', 'Y', 'READY', 'Z', 'PUT_ACTIVE')
STATUS,
ENDDATE,
ENDTIME,
IFNULL(EVENTID, '') EVENTID,
JOBNAME JOB_NAME,
SDLUNAME USER_NAME,
WPPROCID
FROM
TBTCO
WHERE
STRTDATE != '00000000' OR SDLDATE != '00000000'
)
)
) J
WHERE
J.JOB_NAME LIKE BI.JOB_NAME AND
( TO_VARCHAR(BI.END_TIME, 'YYYY') = '9999' OR J.BEGIN_TIME <= BI.END_TIME ) AND
( J.END_TIME = '' OR J.END_TIME >= BI.BEGIN_TIME ) AND
J.STATUS LIKE BI.STATUS AND
J.EVENTID LIKE BI.EVENTID AND
J.USER_NAME LIKE BI.USER_NAME AND
( BI.WP_PID = -1 OR J.WPPROCID = BI.WP_PID ) AND
( BI.MIN_DURATION_S = -1 OR J.DURATION_S >= BI.MIN_DURATION_S )
GROUP BY
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00', 'YYYY/MM/DD
HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), J.BEGIN_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(J.BEGIN_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'JOB') != 0
THEN J.JOB_NAME ELSE MAP(BI.JOB_NAME, '%', 'any', BI.JOB_NAME)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'USER') != 0
THEN J.USER_NAME ELSE MAP(BI.USER_NAME, '%', 'any', BI.USER_NAME)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATUS') != 0
THEN J.STATUS ELSE MAP(BI.STATUS, '%', 'any', BI.STATUS)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'EVENTID') != 0
THEN J.EVENTID ELSE MAP(BI.EVENTID, '%', 'any', BI.EVENTID)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_PID') != 0
THEN TO_VARCHAR(J.WPPROCID) ELSE MAP(BI.WP_PID, -1, 'any',
TO_VARCHAR(BI.WP_PID)) END,
BI.ORDER_BY
)
ORDER BY
MAP(ORDER_BY, 'JOB', JOB_NAME, 'USER', USER_NAME, 'STATUS', STATUS),
MAP(ORDER_BY, 'DURATION', DURATION_S, 'COUNT', NUM_JOBS) DESC,
START_TIME DESC

You might also like