Is sitting around until it's archived. Here's what you can do with it - allow the end user (several end users) to have a look at reporting output from a batch job, which itself is too slow to be executed directly by the end user (TIME_OUT)
Spool lists are a special topic in SAP. Batch jobs keep track of output in "spool files" for which quite special treatment is required. First of all, have a play around with transaction SM37 which is about batch job scheduling. Where reporting output is available, it can be listed. Note that during your program run, the number of the spool request is in ABAP memory in variabele SY-SPONO - Print list, spool number.
This number can be fed into function module RSPO_DISPLAY_SPOOLJOB - Display spool file contents, which would fetch the stored spool file from the batch job and dispay the output. I've copied this function module and used it after removing the authorization check - allowing the end user to view (only relevant) spool files for scheduled job runs. Effectively users that are not allowed to run a slow report in the background can still look at it's output via spool files. This can be a very effective way to save system resources...
The other function module to remember is another step back, the overview of available spool files for a given job, as displayed in transaction SM37 can be shown via function module RSPO_RID_SPOOLREQ_LIST- lists the available spool requests as shown in the job log.
This function module will fetch the spool output and display it to the end user. A copy of a standard SAP module was made to avoid an authorization check.. Original: RSPO_DISPLAY_SPOOLJOB.
FUNCTION Z_UX_DISPLAY_SPOOLJOB.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(RQIDENT) LIKE TSP01-RQIDENT
*" VALUE(FIRST_LINE) TYPE I DEFAULT 1
*" VALUE(LAST_LINE) TYPE I OPTIONAL
*" VALUE(SKIP_AUTHORIZATION_CHECK) LIKE BAPIFLAG-BAPIFLAG OPTIONAL
*" EXCEPTIONS
*" NO_SUCH_JOB
*" JOB_CONTAINS_NO_DATA
*" SELECTION_EMPTY
*" NO_PERMISSION
*" CAN_NOT_ACCESS
*" READ_ERROR
*"----------------------------------------------------------------------
*----------------------------------------------------------------------*
* Function mod. - Z_UX_DISPLAY_SPOOLJOB *
* Description - Display spool contens for a given job *
* Developer - Wim Maasdam *
* Date - 7th of March 2005 *
* SAP version - 4.7 - 620 *
*----------------------------------------------------------------------*
* This function module is a copy of RSPO_DISPLAY_SPOOLJOB which allows *
* display of the spool of a background job. The only difference is the *
* processing of this functionality skipping an authorization check. *
* *
* For release changes: please consider a new copy of the above function*
* module before fixing any problems here. *
*----------------------------------------------------------------------*
* Amendment History *
* ----------------- *
* Date Developer Ref Description *
* ======== =========== ======== ====================================== *
* dd-mm-yy sap userid DR num desc *
* *
*----------------------------------------------------------------------*
data: buffer like data_set_line occurs 1000.
data: lcodepage like tst01-dcharcod.
tables: tsp02l.
select single * from tsp01 where rqident = rqident.
if sy-subrc <> 0.
message e126 with rqident raising no_such_job.
endif.
if SKIP_AUTHORIZATION_CHECK eq space.
call function 'RSPO_CHECK_JOB_PERMISSION'
EXPORTING
access = 'DISP'
spoolreq = tsp01
EXCEPTIONS
no_permission = 1
others = 2.
if sy-subrc <> 0.
route_exception no_permission.
endif.
endif.
perform read_data tables buffer
using tsp01 first_line last_line
changing lcodepage.
perform display_data tables buffer using tsp01-rqpaper tsp01-rqident
lcodepage.
endfunction.
The following coding is to be set up in an include with the function module. Purpose: minimize changes in the copy of standard SAP (which should make an upgrade much easier).
*----------------------------------------------------------------------*
* Include - LZUX_UTILITYF01 *
* Description - Form routines *
*----------------------------------------------------------------------*
* Amendment History *
* ----------------- *
* Date Developer Ref Description *
* ======== =========== ======== ====================================== *
* dd-mm-yy sap userid FD Description *
* *
*----------------------------------------------------------------------*
*---------------------------------------------------------------------
* Form GET_SPOOL_LINE (copied from std SAP)
*---------------------------------------------------------------------
FORM GET_SPOOL_LINE.
data: length type i.
DO.
IF TEMSE_RECTYP+1(1) = 'Y'.
CALL 'C_RSTS_READ'
ID 'HANDLE' FIELD TEMSE_HANDLE
ID 'BUFF' FIELD DATA_SET_LINE
ID 'BUFFLG' FIELD 1006
ID 'ALLINE' FIELD 'X'
ID 'BINARY' FIELD ' '
ID 'SHOWLG' FIELD 'X'
ID 'LENGTH' FIELD length
ID 'RC' FIELD RC
ID 'ERRMSG' FIELD ERRMSG.
STATUS = SY-SUBRC.
ELSE.
CALL 'C_RSTS_READ'
ID 'HANDLE' FIELD TEMSE_HANDLE
ID 'BUFF' FIELD DATA_SET_LINE+1
ID 'BUFFLG' FIELD 1005
ID 'ALLINE' FIELD 'X'
ID 'BINARY' FIELD ' '
ID 'SHOWLG' FIELD 'X'
ID 'LENGTH' FIELD length
ID 'RC' FIELD RC
ID 'ERRMSG' FIELD ERRMSG.
STATUS = SY-SUBRC.
DATA_SET_LINE(5) = DATA_SET_LINE+1(5).
DATA_SET_LINE-PRECOL = ' '.
ADD 1 TO DATA_SET_LINE-DATA_LENGTH.
ENDIF.
STATUS = SY-SUBRC.
IF STATUS <> 6. " EOF, error condition, or got data
EXIT.
ENDIF.
* end of this part, try to open next part
ADD 1 TO TEMSE_PART.
CALL 'C_RSTS_CLOSE'
ID 'HANDLE' FIELD TEMSE_HANDLE
ID 'RC' FIELD RC
ID 'ERRMSG' FIELD ERRMSG.
STATUS = SY-SUBRC.
IF STATUS = 0.
CALL FUNCTION 'RSTS_GET_ATTRIBUTES'
EXPORTING
AUTHORITY = 'SP01'
CLIENT = TEMSE_CLIENT
NAME = TEMSE_NAME
PART = TEMSE_PART
IMPORTING
CHARCO = TEMSE_CHARCO
RECTYP = TEMSE_RECTYP
OBJTYPE = TEMSE_OBJTYP
EXCEPTIONS
FB_ERROR = 1
FB_RSTS_OTHER = 2
NO_OBJECT = 3
NO_PERMISSION = 4
OTHERS = 5.
STATUS = SY-SUBRC.
ENDIF.
IF STATUS = 0.
CALL 'C_RSTS_OPEN_READ'
ID 'HANDLE' FIELD TEMSE_HANDLE
ID 'CLIENT' FIELD TEMSE_CLIENT
ID 'NAME' FIELD TEMSE_NAME
ID 'PART' FIELD TEMSE_PART
ID 'TYPE' FIELD TEMSE_OBJTYP
ID 'CONV' FIELD ' '
ID 'ALLINE' FIELD 'X'
ID 'BINARY' FIELD ' '
ID 'RECTYP' FIELD TEMSE_RECTYP
ID 'CHARCO' FIELD TEMSE_CHARCO
ID 'PROM' FIELD 'I'
ID 'RC' FIELD RC
ID 'ERRMSG' FIELD ERRMSG.
STATUS = SY-SUBRC.
ENDIF.
ENDDO.
IF STATUS = 4.
STATUS = 12. "EOF
ENDIF.
IF STATUS = 8.
STATUS = 40. "Line too long
ENDIF.
DATA_SET_LENGTH = DATA_SET_LINE-DATA_LENGTH.
ENDFORM. "GET_SPOOL_LINE
*---------------------------------------------------------------------
* Form read_data (copied from std SAP)
*---------------------------------------------------------------------
FORM READ_DATA TABLES BUFFER
USING TSP01 LIKE TSP01 VALUE(FIRST) TYPE I
VALUE(LAST) TYPE I
changing codepage like tst01-dcharcod.
DATA: LINES TYPE I.
REFRESH BUFFER.
CLEAR IS_OTF.
TEMSE_CLIENT = TSP01-RQCLIENT.
TEMSE_NAME = TSP01-RQO1NAME.
TEMSE_PART = 1.
CALL FUNCTION 'RSTS_GET_ATTRIBUTES'
EXPORTING
AUTHORITY = 'SP01'
CLIENT = TEMSE_CLIENT
NAME = TEMSE_NAME
PART = TEMSE_PART
IMPORTING
CHARCO = codepage
RECTYP = TEMSE_RECTYP
OBJTYPE = TEMSE_OBJTYP
EXCEPTIONS
FB_ERROR = 1
FB_RSTS_OTHER = 2
NO_OBJECT = 3
NO_PERMISSION = 4
OTHERS = 5.
IF SY-SUBRC = 0.
IF TEMSE_OBJTYP(3) = 'OTF'.
IS_OTF = 'X'.
ENDIF.
ELSE.
message e466 with tsp01-rqident raising READ_ERROR.
ENDIF.
CLEAR TEMSE_HANDLE.
CALL 'C_RSTS_OPEN_READ'
ID 'HANDLE' FIELD TEMSE_HANDLE
ID 'CLIENT' FIELD TEMSE_CLIENT "hjl
ID 'NAME' FIELD TEMSE_NAME
ID 'PART' FIELD TEMSE_PART
ID 'TYPE' FIELD TEMSE_OBJTYP
ID 'CONV' FIELD ' '
ID 'ALLINE' FIELD 'X'
ID 'BINARY' FIELD ' '
ID 'RECTYP' FIELD TEMSE_RECTYP
ID 'CHARCO' FIELD codepage
ID 'PROM' FIELD 'I'
ID 'RC' FIELD RC
ID 'ERRMSG' FIELD ERRMSG.
STATUS = SY-SUBRC.
IF STATUS = 0.
DO.
PERFORM GET_SPOOL_LINE.
IF STATUS <> 0 AND STATUS <> 40 AND STATUS <> 12.
PERFORM CLOSE_JOB.
message e466 with tsp01-rqident raising READ_ERROR.
ENDIF.
IF STATUS <> 12. " 12 = End
IF NOT ( DATA_SET_LENGTH IS INITIAL ).
DATA_SET_LINE-DATA_LENGTH = DATA_SET_LENGTH - 1.
ENDIF.
ADD 1 TO LINES.
IF LINES >= FIRST.
APPEND DATA_SET_LINE TO BUFFER.
ENDIF.
IF ( NOT LAST IS INITIAL ) AND ( LINES >= LAST ).
EXIT.
ENDIF.
ELSE.
IF LINES = 0.
PERFORM CLOSE_JOB.
message e467 with tsp01-rqident RAISing JOB_CONTAINS_NO_DATA.
ENDIF.
IF LINES < FIRST .
PERFORM CLOSE_JOB.
message e420 RAISing SELECTION_EMPTY.
ENDIF.
EXIT.
ENDIF.
ENDDO.
PERFORM CLOSE_JOB.
ENDIF.
ENDFORM. "READ_DATA
*---------------------------------------------------------------------
* FORM CLOSE_JOB (copied from std SAP)
*---------------------------------------------------------------------
FORM CLOSE_JOB.
IF STATUS <> 0 AND STATUS <> 12.
CALL 'C_RSTS_CLOSE'
ID 'HANDLE' FIELD TEMSE_HANDLE
ID 'RC' FIELD RC
ID 'ERRMSG' FIELD ERRMSG.
MESSAGE E112(PO) WITH STATUS RC ERRMSG RAISING READ_ERROR.
ENDIF.
CALL 'C_RSTS_CLOSE'
ID 'HANDLE' FIELD TEMSE_HANDLE
ID 'RC' FIELD RC
ID 'ERRMSG' FIELD ERRMSG.
STATUS = SY-SUBRC.
IF STATUS <> 0.
MESSAGE E112(PO) WITH STATUS RC ERRMSG RAISING READ_ERROR.
ENDIF.
ENDFORM. "CLOSE_JOB
*---------------------------------------------------------------------
* Form DISPLAY_DATA (copied from std SAP)
*---------------------------------------------------------------------
FORM DISPLAY_DATA TABLES BUFFER using rqpaper like tsp01-rqpaper
rqid like tsp01-rqident
lcodepage.
DATA: LINE_LENGTH TYPE I, gcol type i, glines type i,
LINE_LENGTH2 LIKE RSTSTYPE-LINELENGTH,
v, v2.
CLASS CL_ABAP_CHAR_UTILITIES DEFINITION LOAD.
CALL FUNCTION 'RSPO_SPOOLDATA_WRITE_INIT'
EXPORTING
codepage = lcodepage.
call function 'RSPO_OPTION_GET'
EXPORTING
name = spopt_realwidth
IMPORTING
VALUE = v.
call function 'RSPO_OPTION_GET'
EXPORTING
name = spopt_realheight
IMPORTING
VALUE = v2.
if not v is initial or not v2 is initial.
gcol = 0.
glines = 0.
select single * from tsp02l where pjident = rqid
and pjnummer = 0.
if sy-subrc = 0.
gcol = tsp02l-columns.
glines = tsp02l-lines.
else.
CALL FUNCTION 'RSPO_GET_SIZE_OF_LAYOUT'
EXPORTING
layout = rqpaper
IMPORTING
COLUMNS = gcol
LINES = glines.
endif.
endif.
if gcol < 80 or v is initial.
gcol = 255.
endif.
if glines < 5 or v2 is initial.
glines = 0.
endif.
* Buffer only 1000
if gcol >= 1000.
gcol = 999.
endif.
NEW-PAGE NO-HEADING NO-TITLE LINE-SIZE gcol
line-count glines. " make a wide list
SET BLANK LINES ON.
LOOP AT BUFFER.
DATA_SET_LINE = BUFFER.
IF DATA_SET_LINE-PRECOL = 'P'.
IF DATA_SET_LINE(1) = ' '. " Echter Vorschub ?"
NEW-PAGE.
ENDIF.
CONTINUE.
ENDIF.
* Zeilenlänge berechnen, falls unbekannt.
IF DATA_SET_LINE-DATA_LENGTH IS INITIAL.
LINE_LENGTH = STRLEN( DATA_SET_LINE-DATA_LINE ).
ELSE.
LINE_LENGTH = DATA_SET_LINE-DATA_LENGTH.
ENDIF.
IF LINE_LENGTH > 0.
LINE_LENGTH2 = LINE_LENGTH.
IF cl_abap_char_utilities=>charsize > 1.
CALL FUNCTION 'RSPO_SPOOLDATA_WRITE'
EXPORTING
SPOOL_DATA = DATA_SET_LINE-DATA_LINE
DATA_LENGTH = LINE_LENGTH2.
ELSE.
CALL FUNCTION 'RSPO_SPOOLDATA_WRITE_OLD'
EXPORTING
SPOOL_DATA = DATA_SET_LINE-DATA_LINE
DATA_LENGTH = LINE_LENGTH2.
ENDIF.
ELSE.
" Leerzeile
SKIP.
ENDIF.
ENDLOOP.
ENDFORM. "DISPLAY_DATA
