reusable abap codes

80
Reusable abap codes : INDEX 1. To show alternate colors in rows in alv display. 2. TO put x in fieldx for all the entered values of field 3. Choosing presentation server path on selection screen 4. choosing application (unix) server. 5. Perform used to upload the file from the presentation server. 6. Perform used to upload the file from the application server. 7. Downloading the datas to application server 8. Downloading the datas to presentation server 9. For creating dynamic table and using them 10. Good String processing code 11. Idoc programming 12. bdc programming for updating material 13. Give user the status information during execution of program 14. Program to open excel and values get feeded automatically realtime or can be feeded in background jobs 15. Pop up programming 16. Wait time program 17. at line selection event 18. simple bdc program thru excel with good error handling 19. Important tables of SAP 20. To find the creation/modification data of document at unix server 21. Code to compare contents of two internal table 22. schedule jobs programmatically 23. Coding using define & end define. 24. This include allows you to display one or more ALV tables by simply using a local class. Block mode is supported so you can display several tables on same screen. 25. User exit for invoices - RV60AFZZ 26. Program to download file to application server and then send mail to user to download it in presentation server 27. Program which create job and specify more details 28. Program to convert spool to pdf 29. Subroutine to prevent time out error

Upload: api-26420083

Post on 18-Nov-2014

1.570 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Reusable abap codes

Reusable abap codes :

INDEX 1. To show alternate colors in rows in alv display.2. TO put x in fieldx for all the entered values of field3. Choosing presentation server path on selection screen4. choosing application (unix) server.5. Perform used to upload the file from the presentation server.6. Perform used to upload the file from the application server.7. Downloading the datas to application server8. Downloading the datas to presentation server9. For creating dynamic table and using them10. Good String processing code11. Idoc programming12. bdc programming for updating material13. Give user the status information during execution of program14. Program to open excel and values get feeded automatically realtime or can be feeded in background jobs15. Pop up programming16. Wait time program17. at line selection event18. simple bdc program thru excel with good error handling19. Important tables of SAP20. To find the creation/modification data of document at unix server21. Code to compare contents of two internal table22. schedule jobs programmatically23. Coding using define & end define.24. This include allows you to display one or more ALV tables by simply using a local class. Block mode is

supported so you can display several tables on same screen.25. User exit for invoices - RV60AFZZ26. Program to download file to application server and then send mail to user to download it in presentation server27. Program which create job and specify more details28. Program to convert spool to pdf29. Subroutine to prevent time out error

Page 2: Reusable abap codes

To show alternate colors in rows in alv display.

DATA: l_color(1) TYPE c.

l_color = '0'. LOOP AT it_result INTO wa_result. IF l_color = '0'. wa_result-rowcolor = 'C400'. l_color = 'X'. ELSE. wa_result-rowcolor = 'C500'. l_color = '0'. ENDIF.

MODIFY it_result FROM wa_result. ENDLOOP.

wa_layout-info_fieldname = 'ROWCOLOR'. wa_layout-box_fieldname = 'C_ROW'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = wa_layout it_fieldcat = it_fieldcat it_events = it_events[] TABLES t_outtab = it_final.

It_result is the final internal table which will be used in fm REUSE_ALV_GRID_DISPLAY. It will contain one additional field ‘ rowcolor’ besides all the necessary fields.

30.To use top of page event in alv :

TO put x in fieldx for all the entered values of field.

PERFORM setdatax USING uom_s uomx.

Page 3: Reusable abap codes

FORM setdatax USING regdata xdata.

FIELD-SYMBOLS: <fs1>, <fs2>. DATA: n TYPE i. DO. n = n + 1. ASSIGN COMPONENT n OF STRUCTURE regdata TO <fs1>. IF sy-subrc <> 0. EXIT. ENDIF.

ASSIGN COMPONENT n OF STRUCTURE xdata TO <fs2>. IF NOT <fs1> IS INITIAL. <fs2> = 'X'. ENDIF. ENDDO.

ENDFORM. " setdatax

Good commands :

WRITE c_kunnr LEFT-JUSTIFIED TO wa_final-kunnr.SPLIT wa_kna1-name2 AT '' INTO c_name1 c_name2 c_name3.

F4 help in selection screen for address :

(1)

AT SELECTION-SCREEN ON VALUE-REQUEST FOR po_fnm.PARAMETERS: po_fnm(80) TYPE c MODIF ID md1 DEFAULT'C:\seedfile.txt' LOWER CASE.

(2)AT SELECTION-SCREEN ON VALUE-REQUEST FOR outfile.PARAMETERS: outfile(60) TYPE c MODIF ID md2 DEFAULT'/usr/sap/trans/data/seedfile.txt' LOWER CASE.

Choosing presentation server path on selection screen :

PERFORM open_folder.

FORM open_folder . DATA: l_it_file TYPE STANDARD TABLE OF sdokpath, l_wa_file TYPE sdokpath, l_folder TYPE c.

CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG' TABLES

Page 4: Reusable abap codes

file_table = l_it_file EXCEPTIONS cntl_error = 1 OTHERS = 2.

IF sy-subrc EQ 0. READ TABLE l_it_file INTO l_wa_file INDEX 1. IF sy-subrc EQ 0. po_fnm = l_wa_file-pathname. ENDIF. ENDIF.

choosing application (unix) server path on selection screen for selecting path :

PERFORM open_file.

form open_file .CALL FUNCTION 'F4_DXFILENAME_4_DYNP' EXPORTING* DYNPFIELD_FILETYPE = dynpfield_filename = 'OUTFILE' dyname = sy-repid dynumb = sy-dynnr filetype = 'P' location = 'A' server = '' .

endform. " open_file

Perform used to upload the file from the presentation server. PERFORM upload.

FORM upload . MOVE p_file TO w_path.

CALL FUNCTION 'GUI_UPLOAD' EXPORTING filename = w_path filetype = 'ASC' has_field_separator = ' ' TABLES data_tab = it_material

CLEAR wa_material. LOOP AT it_material INTO wa_material. select * from mara where matnr = wa_material-matnr. IF sy-subrc = 0. wa_material-ean11 = mara-ean11. MODIFY it_material FROM wa_material. ENDIF. CLEAR wa_material.

Page 5: Reusable abap codes

endselect. ENDLOOP.

ENDFORM. " upload

* Perform used to upload the file from the application server. PERFORM upload_apps.

FORM upload_apps . DATA: l_line TYPE string, l_matnr LIKE mara-matnr.

OPEN DATASET p_file1 FOR INPUT IN TEXT MODE ENCODING DEFAULT. IF sy-subrc NE 0. MESSAGE ID 'FB' TYPE 'E' NUMBER '002' WITH p_file1. ENDIF.

DO. CLEAR: l_line, l_matnr. READ DATASET p_file1 INTO l_line. IF sy-subrc <> 0. EXIT. ENDIF. l_matnr = l_line.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING input = l_matnr IMPORTING output = l_matnr.

APPEND l_matnr TO it_material. ENDDO.

CLOSE DATASET p_file1.

CLEAR wa_material. LOOP AT it_material INTO wa_material. select * from mara where matnr = wa_material-matnr. IF sy-subrc = 0. wa_material-ean11 = mara-ean11. MODIFY it_material FROM wa_material. ENDIF. CLEAR wa_material. endselect. ENDLOOP.

ENDFORM. " Upload_apps

** Downloading the datas to application server PERFORM download_appl.form download_appl .

Page 6: Reusable abap codes

OPEN DATASET p_outfil FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.

LOOP AT it_output. TRANSFER it_output TO p_outfil. IF sy-subrc NE 0. it_status-matnr = it_output(12). it_status-status = text-013. it_status-message = text-008. APPEND it_status. ENDIF. ENDLOOP. CLOSE DATASET p_outfil. IF sy-subrc NE 0. MESSAGE ID 'FB' TYPE 'E' NUMBER '002' WITH p_outfil. ELSE. MESSAGE ID 'FB' TYPE 'I' NUMBER '001' WITH p_outfil. ENDIF.

endform. " download_appl

** Downloading the datas to presentation server PERFORM download_pc.

form download_pc .

CLEAR w_file.

w_file = p_desfil.

CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = w_file filetype = 'ASC' trunc_trailing_blanks = space confirm_overwrite = c_x trunc_trailing_blanks_eol = space TABLES data_tab = it_output . IF SY-SUBRC NE 0. MESSAGE i001 WITH text-022. LEAVE LIST-PROCESSING. ELSE. MESSAGE i001 WITH text-021. ENDIF.

endform. " download_pc

For creating dynamic table and using them : whole running program

*&---------------------------------------------------------------------**& Report Z_T401212 **& **&---------------------------------------------------------------------**& **& **&---------------------------------------------------------------------*

REPORT Z_T401212 .

Page 7: Reusable abap codes

type-pools: slis.

field-symbols: <dyn_table> type standard table,<dyn_wa>,<dyn_field>.

data: alv_fldcat type slis_t_fieldcat_alv,it_fldcat type lvc_t_fcat.

type-pools : abap.

data : it_details type abap_compdescr_tab,wa_details type abap_compdescr.

data : ref_descr type ref to cl_abap_structdescr.

data: new_table type ref to data,new_line type ref to data,wa_it_fldcat type lvc_s_fcat.

selection-screen begin of block b1 with frame title text .parameters: p_table(30) type c.selection-screen end of block b1.

*Get the structure of the table.ref_descr ?= cl_abap_typedescr=>describe_by_name( p_table ).it_details = ref_descr->components.

loop at it_details into wa_details.clear wa_it_fldcat.wa_it_fldcat-fieldname = wa_details-name .wa_it_fldcat-datatype = wa_details-type_kind.wa_it_fldcat-inttype = wa_details-type_kind.wa_it_fldcat-intlen = wa_details-length.wa_it_fldcat-decimals = wa_details-decimals.append wa_it_fldcat to it_fldcat .endloop.

*Create dynamic internal table and assign to FScall method cl_alv_table_create=>create_dynamic_tableexportingit_fieldcatalog = it_fldcatimportingep_table = new_table.

assign new_table->* to <dyn_table>.

*Create dynamic work area and assign to FScreate data new_line like line of <dyn_table>.assign new_line->* to <dyn_wa>.

*Select Data from table.select * into corresponding fields of table <dyn_table>from (p_table).

Page 8: Reusable abap codes

*Write out data from table.loop at <dyn_table> into <dyn_wa>.do.assign component sy-index of structure <dyn_wa> to <dyn_field>.if sy-subrc <> 0.exit.endif.if sy-index = 1.write:/ <dyn_field>.else.write: <dyn_field>.endif.enddo.endloop.

Good String processing code :

You can do the following:

DATA: lv_string TYPE string,lv_firstname TYPE string,lv_lastname TYPE string,lv_num TYPE i,lv_check TYPE c.

lv_string = 'Firstname h g t Lastname'.

lv_check = lv_string(1). extract first name

WHILE NOT lv_check IS INITIAL.CONCATENATE lv_firstname lv_string(1) INTO lv_firstname.SHIFT lv_string LEFT BY 1 PLACES IN CHARACTER MODE.lv_check = lv_string(1).ENDWHILE.

extract last name

lv_num = STRLEN( lv_string ).lv_num = lv_num - 1.lv_check = lv_string+lv_num(1).WHILE NOT lv_check IS INITIAL.CONCATENATE lv_string+lv_num(1) lv_lastname INTO lv_lastname.SHIFT lv_string RIGHT BY 1 PLACES IN CHARACTER MODE.lv_check = lv_string+lv_num(1).ENDWHILE.

WRITE: / lv_lastname, ',', lv_firstname.

Regards,MichaelDate format write sy-datum to w_cdate YYMMDD.

Page 9: Reusable abap codes

Defining range :

RANGES: w_tlx FOR adr5-tlx_number.

IF NOT it_kna1[] IS INITIAL. w_tlx-sign = 'E'. w_tlx-option = 'CP'. w_tlx-low = '000042*'. APPEND w_tlx

Idoc programming :

Program to create idoc, if all configurations are already done. ( purchase order )

check the below sample code for triggering the idoc..The same thing u can do for ur requirement..slect all then data from ur custom table and finally call the FM"MASTER_IDOC_DISTRIBUTE".

&---------------------------------------------------------------------*& Report ZZ_Program_To_Create_Idoc&---------------------------------------------------------------------

report zz_program_to_create_idoc .tables: ekko,ekpo.

selection-screen skip 3.selection-screen begin of block b1 with frame title titl.selection-screen skip.select-options s_ebeln for ekko-ebeln.selection-screen skip.selection-screen end of block b1.

data: header_segment_name like edidd-segnam value 'Z1EKKO',item_segment_name like edidd-segnam value 'Z1EKPO',idoc_name like edidc-idoctp value 'Z19838IDOC1'.

data: header_segment_data like z1ekko,item_segment_data like z1ekpo.

data: control_record like edidc.

data: messagetyp like edmsg-msgtyp value 'ZZ9838MESG1'.

data: i_communication like edidc occurs 0 with header line,i_data like edidd occurs 0 with header line.

data: begin of i_ekko occurs 0,ebeln like ekko-ebeln,aedat like ekko-aedat,bukrs like ekko-bukrs,bsart like ekko-bsart,lifnr like ekko-lifnr,end of i_ekko.

Page 10: Reusable abap codes

data: begin of i_ekpo occurs 0,ebelp like ekpo-ebelp,matnr like ekpo-matnr,menge like ekpo-menge,meins like ekpo-meins,netpr like ekpo-netpr,end of i_ekpo.

start-of-selection.

select ebeln aedat bukrs bsart lifnr from ekkointo table i_ekko where ebeln in s_ebeln.

select ebelpmatnrmengemeinsnetprfrom ekpointo table i_ekpowhere ebeln in s_ebeln.

control_record-mestyp = messagetyp.control_record-rcvprt = 'LS'.control_record-idoctp = idoc_name.control_record-rcvprn = '0MART800'.

loop at i_ekko.header_segment_data-ebeln = i_ekko-ebeln.header_segment_data-aedat = i_ekko-aedat.header_segment_data-bukrs = i_ekko-bukrs.header_segment_data-bsart = i_ekko-bsart.header_segment_data-lifnr = i_ekko-lifnr.i_data-segnam = header_segment_name.i_data-sdata = header_segment_data.append i_data.

select ebelpmatnrmengemeinsnetprfrom ekpointo table i_ekpowhere ebeln = i_ekko-ebeln.

loop at i_ekpo.item_segment_data-ebelp = i_ekpo-ebelp.item_segment_data-matnr = i_ekpo-matnr.item_segment_data-menge = i_ekpo-menge.item_segment_data-meins = i_ekpo-meins.item_segment_data-netpr = i_ekpo-netpr.i_data-segnam = item_segment_name.i_data-sdata = item_segment_data.append i_data.

Page 11: Reusable abap codes

endloop.clear i_ekpo.refresh i_ekpo.endloop.

call function 'MASTER_IDOC_DISTRIBUTE'exportingmaster_idoc_control = control_record

* OBJ_TYPE = ''* CHNUM = ''

tablescommunication_idoc_control = i_communicationmaster_idoc_data = i_dataexceptionserror_in_idoc_control = 1error_writing_idoc_status = 2error_in_idoc_data = 3sending_logical_system_unknown = 4others = 5.if sy-subrc 0.message id sy-msgid type sy-msgty number sy-msgnowith sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.else.

loop at i_communication.write: 'IDOC GENERATED', i_communication-docnum.endloop.commit work.

endif.

initialization.titl = 'ENTER THE PURCHASE ORDER NUMBER'.

kindly reward if found helpful.

cheers,Hema.

Syngenta project standard usage codes :

Report name NO STANDARD PAGE HEADING MESSAGE-ID 38 LINE-COUNT 65 LINE-SIZE 150.

Modifying material number with bdc

LOOP AT it_final INTO wa_final. PERFORM fill_it_bdcdata. CALL TRANSACTION 'MM02' USING it_bdcdata MODE c_mod UPDATE c_mod1

Page 12: Reusable abap codes

MESSAGES INTO it_messages.* PERFORM bdc_process. PERFORM error_messages. PERFORM append_messages. CLEAR : it_bdcdata,it_messages. REFRESH : it_bdcdata,it_messages. CLEAR wa_final. CLEAR wa_result. ENDLOOP.

FORM fill_it_bdcdata . PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'. PERFORM bdc_field USING 'BDC_CURSOR' 'RMMG1-MATNR'. PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'. PERFORM bdc_field USING 'RMMG1-MATNR' wa_final-matnr. MOVE wa_final-matnr1 TO wa_result-mat_no.

PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'. PERFORM bdc_field USING 'BDC_CURSOR' 'MSICHTAUSW-DYTXT(01)'. PERFORM bdc_field USING 'BDC_OKCODE' '=ENTR'. PERFORM bdc_field USING 'MSICHTAUSW-KZSEL(01)' 'X'. PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'. PERFORM bdc_field USING 'BDC_OKCODE' '=BU'. PERFORM bdc_field USING 'BDC_CURSOR' 'MARA-NUMTP'.* READ TABLE it_material INTO wa_material* WITH KEY matnr = wa_final-matnr1 .* IF sy-subrc = 0.* IF wa_material-ean11 IS INITIAL. PERFORM bdc_field USING 'MARA-EAN11' wa_final-gtn.

MOVE wa_final-gtn TO wa_result-gtn.

PERFORM bdc_field USING 'MARA-NUMTP' c_nmtp. PERFORM bdc_dynpro USING 'SAPLSP01' '0300'. PERFORM bdc_field USING 'BDC_OKCODE' '=YES'. flag = 1. MOVE wa_final-gtn TO wa_result-gtn. CLEAR wa_material.* ENDIF.ENDFORM.

FORM bdc_field USING fnam LIKE bdcdata-fnam fval. it_bdcdata-fnam = fnam. it_bdcdata-fval = fval. APPEND it_bdcdata. CLEAR it_bdcdata.

ENDFORM. " BDC_FIELD

FORM bdc_dynpro USING program LIKE bdcdata-program dynpro LIKE bdcdata-dynpro. it_bdcdata-program = program. it_bdcdata-dynpro = dynpro. it_bdcdata-dynbegin = 'X'. APPEND it_bdcdata.

Page 13: Reusable abap codes

CLEAR it_bdcdata.

ENDFORM. " BDC_DYNPRO

Give user the status information during execution of program : CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING* PERCENTAGE = 0 TEXT = TEXT-007 EXCEPTIONS OTHERS = 1.

Reference code : RSDEMO01

Program to open excel and values get feeded automatically realtime or can be feeded in background jobs.

INCLUDE OLE2INCL.* handles for OLE objectsDATA: H_EXCEL TYPE OLE2_OBJECT, " Excel object H_MAPL TYPE OLE2_OBJECT, " list of workbooks H_MAP TYPE OLE2_OBJECT, " workbook H_ZL TYPE OLE2_OBJECT, " cell H_F TYPE OLE2_OBJECT. " font

* start Excel CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'. PERFORM ERR_HDL. SET PROPERTY OF H_EXCEL 'Visible' = 1. PERFORM ERR_HDL.

* output column headings to active Excel sheet PERFORM FILL_CELL USING 1 1 1 'Flug'(001). PERFORM FILL_CELL USING 1 2 1 'Nr'(002). PERFORM FILL_CELL USING 1 3 1 'Von'(003). PERFORM FILL_CELL USING 1 4 1 'Nach'(004). PERFORM FILL_CELL USING 1 5 1 'Zeit'(005).

* disconnect from Excel FREE OBJECT H_EXCEL. PERFORM ERR_HDL.

FORM FILL_CELL USING I J BOLD VAL. CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J. PERFORM ERR_HDL. SET PROPERTY OF H_ZL 'Value' = VAL . PERFORM ERR_HDL. GET PROPERTY OF H_ZL 'Font' = H_F. PERFORM ERR_HDL. SET PROPERTY OF H_F 'Bold' = BOLD . PERFORM ERR_HDL.ENDFORM.

Page 14: Reusable abap codes

FORM ERR_HDL.IF SY-SUBRC <> 0. WRITE: / 'Fehler bei OLE-Automation:'(010), SY-SUBRC. STOP.ENDIF.ENDFORM. " ERR_HDL

Pop up programming

* Warn user about over-selecting... DESCRIBE TABLE ZVEXT_ORDERS LINES READ_COUNT. IF READ_COUNT GT 500. WRITE READ_COUNT TO TEMP_TEXT LEFT-JUSTIFIED. CONCATENATE 'You have selected' TEMP_TEXT 'orders...' INTO TEMP_TEXT SEPARATED BY SPACE. CALL FUNCTION 'POPUP_TO_DECIDE' EXPORTING DEFAULTOPTION = '2' TEXTLINE1 = TEMP_TEXT TEXTLINE2 = '(processing may be slow)' TEXTLINE3 = 'Are you sure you want to continue?' TEXT_OPTION1 = 'Continue' TEXT_OPTION2 = 'Cancel' ICON_TEXT_OPTION1 = 'ICON_CHECKED' ICON_TEXT_OPTION2 = 'ICON_CANCEL' TITEL = 'Are you sure?'* START_COLUMN = 25* START_ROW = 6 CANCEL_DISPLAY = ' ' IMPORTING ANSWER = TEMP_ANSWER. IF TEMP_ANSWER = 2. STOP. ENDIF. ENDIF.

Wait time program

REPORT ZPAUSE.parameters: p_sec type i.data: new_time like sy-uzeit.

if p_sec > 3600. move 3600 to p_sec.endif.

get time.new_time = sy-uzeit + p_sec.while sy-uzeit < new_time. get time.endwhile.

At line selection code :

AT LINE-SELECTION. CLEAR : w_cacnt, w_ccode, w_augbl, w_belnr.

Page 15: Reusable abap codes

SPLIT sy-lisel AT sy-vline INTO w_ccode w_cacnt w_vname w_regio w_augbl w_belnr. PERFORM conversion USING w_cacnt. PERFORM conversion USING w_augbl. PERFORM conversion USING w_belnr. SORT i_bsak BY lifnr augbl bukrs belnr. CLEAR wa_bsak. READ TABLE i_bsak INTO wa_bsak WITH KEY lifnr = w_cacnt augbl = w_augbl bukrs = w_ccode belnr = w_belnr BINARY SEARCH TRANSPORTING gjahr.

with this command wa_bsak will be populated with only field ghahr.

SET PARAMETER ID bln FIELD w_belnr. SET PARAMETER ID buk FIELD w_ccode. SET PARAMETER ID gjr FIELD wa_bsak-gjahr.

CALL TRANSACTION FB03 AND SKIP FIRST SCREEN.

Simple bdc program with good error handling

*----------------------------------------------------------------------** Case Id : ** PROGRAM ID/ Include ID : ZF_FB09 ** PROGRAM TITLE : Upload from excel in fb09 thru excel *** DEVELOPED BY : T401212 ** CREATION DATE : 18-MAR-2008 *

*----------------------------------------------------------------------** MODIFICATION HISTORY **----------------------------------------------------------------------**Ver|DATE |PGMR |TRANSPORT |DESCRIPTION OF CHANGES **No | | | | ** ---------------------------------------------------------------------**001|18-MAR-2008|T401212 |CL1K972236 |Initial **----------------------------------------------------------------------*

REPORT zf_fb09NO STANDARD PAGE HEADING LINE-COUNT 65 LINE-SIZE 150.

DATA: it_excel LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.DATA : bdc_suc_count TYPE i, bdc_err_count TYPE i, bdc_count TYPE i.

DATA : BEGIN OF it_fb09 OCCURS 0, belnr LIKE rf05l-belnr, bukrs LIKE rf05l-bukrs, gjahr LIKE rf05l-gjahr,

Page 16: Reusable abap codes

buzei LIKE rf05l-buzei, zterm LIKE bseg-zterm, zfbdt(10), END OF it_fb09.

DATA: BEGIN OF it_bdcdata OCCURS 0. INCLUDE STRUCTURE bdcdata.DATA : END OF it_bdcdata.

DATA : c_mod(1) TYPE c VALUE 'N', c_mod1 TYPE c VALUE 'S', it_messages LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.

DATA : BEGIN OF it_result OCCURS 0, belnr LIKE rf05l-belnr, status(20), message(250), END OF it_result.TABLES : t100.

SELECTION-SCREEN BEGIN OF BLOCK block1 .

PARAMETERS: p_file LIKE rlgrap-filename OBLIGATORY.

SELECTION-SCREEN END OF BLOCK block1.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.

* Perform used to support the location of file. PERFORM open_folder.

START-OF-SELECTION.

* Perform used to upload the file from the presentation server. PERFORM upload.

PERFORM fb09_transaction.

PERFORM write_error_message.

*&---------------------------------------------------------------------**& Form bdc*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM fb09_transaction .

CLEAR it_fb09. LOOP AT it_fb09.

PERFORM fill_it_bdcdata. CALL TRANSACTION 'FB09' USING it_bdcdata MODE c_mod UPDATE c_mod1 MESSAGES INTO it_messages.

Page 17: Reusable abap codes

IF sy-subrc EQ 0. ADD 1 TO bdc_suc_count.*it_result-status = 'SUCCESS'.*it_result-belnr = it_fb09-belnr.*append it_result. ELSE. ADD 1 TO bdc_err_count. PERFORM error_messages. ENDIF. ADD 1 TO bdc_count. CLEAR it_fb09. ENDLOOP.

ENDFORM. " fb09-transaction.*&---------------------------------------------------------------------**& Form ERROR_MESSAGES*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM error_messages . DATA : lv_string TYPE string. LOOP AT it_messages WHERE msgtyp = 'E'.

CLEAR t100. SELECT SINGLE * FROM t100 WHERE sprsl = it_messages-msgspra AND arbgb = it_messages-msgid AND msgnr = it_messages-msgnr.

IF sy-subrc EQ 0. CLEAR lv_string. lv_string = t100-text. IF lv_string CS '&1'. REPLACE '&1' WITH it_messages-msgv1 INTO lv_string. "Variable part of a message REPLACE '&2' WITH it_messages-msgv2 INTO lv_string. REPLACE '&3' WITH it_messages-msgv3 INTO lv_string. REPLACE '&4' WITH it_messages-msgv4 INTO lv_string. ELSE. REPLACE '&' WITH it_messages-msgv1 INTO lv_string. REPLACE '&' WITH it_messages-msgv2 INTO lv_string. REPLACE '&' WITH it_messages-msgv3 INTO lv_string. REPLACE '&' WITH it_messages-msgv4 INTO lv_string. ENDIF. CONDENSE lv_string. CONCATENATE it_messages-msgtyp lv_string INTO lv_string SEPARATED BY space. ELSE. lv_string = it_messages. ENDIF. CLEAR it_messages. ENDLOOP. it_result-belnr = it_fb09. it_result-status = 'FAILED'.

Page 18: Reusable abap codes

it_result-message = lv_string. APPEND it_result.

ENDFORM.*&---------------------------------------------------------------------**& Form FILL_IT_BDCDATA*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM fill_it_bdcdata . REFRESH it_bdcdata. PERFORM bdc_dynpro USING 'SAPMF05L' '0102'.

PERFORM bdc_field USING 'BDC_CURSOR' 'RF05L-BUZEI'.

PERFORM bdc_field USING 'BDC_OKCODE' '/00'.

PERFORM bdc_field USING 'RF05L-BELNR' it_fb09-belnr.

PERFORM bdc_field USING 'RF05L-BUKRS' it_fb09-bukrs.

PERFORM bdc_field USING 'RF05L-GJAHR' it_fb09-gjahr.

PERFORM bdc_field USING 'RF05L-BUZEI' it_fb09-buzei.

PERFORM bdc_dynpro USING 'SAPMF05L' '0301'.

PERFORM bdc_field USING 'BDC_CURSOR' it_fb09-zfbdt.

PERFORM bdc_field USING 'BDC_OKCODE' '=AE'.

*perform bdc_field using 'BSEG-SKFBT'* record-SKFBT_005.* PERFORM bdc_field USING 'BSEG-ZTERM' it_fb09-zterm.

PERFORM bdc_field USING 'BSEG-ZFBDT' it_fb09-zfbdt.

ENDFORM. " FILL_IT_BDCDATA

Page 19: Reusable abap codes

*&---------------------------------------------------------------------**& Form BDC_DYNPRO*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_0701 text* -->P_0702 text*----------------------------------------------------------------------*FORM bdc_dynpro USING program LIKE bdcdata-program dynpro LIKE bdcdata-dynpro. it_bdcdata-program = program. it_bdcdata-dynpro = dynpro. it_bdcdata-dynbegin = 'X'. APPEND it_bdcdata. CLEAR it_bdcdata.

ENDFORM. " BDC_DYNPRO*&---------------------------------------------------------------------**& Form BDC_FIELD*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** -->P_0706 text* -->P_0707 text*----------------------------------------------------------------------*FORM bdc_field USING fnam LIKE bdcdata-fnam fval. it_bdcdata-fnam = fnam. it_bdcdata-fval = fval. APPEND it_bdcdata. CLEAR it_bdcdata.

ENDFORM. " BDC_FIELD*&---------------------------------------------------------------------**& Form upload*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM upload . DATA : w_path LIKE rlgrap-filename. MOVE p_file TO w_path.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING filename = w_path i_begin_col = 1 i_begin_row = 2 i_end_col = 6 i_end_row = 6000 TABLES intern = it_excel.

PERFORM process_excel.

ENDFORM. " upload

Page 20: Reusable abap codes

*&---------------------------------------------------------------------*& Form PROCESS*&---------------------------------------------------------------------*text*----------------------------------------------------------------------**--> p1 text*<-- p2 text*----------------------------------------------------------------------FORM process_excel .

LOOP AT it_excel. CASE it_excel-col. WHEN '001'. it_fb09-belnr = it_excel-value.

WHEN '002'. it_fb09-bukrs = it_excel-value. WHEN '003'. it_fb09-gjahr = it_excel-value. WHEN '004'. it_fb09-buzei = it_excel-value. WHEN '005'. it_fb09-zterm = it_excel-value. WHEN '006'. CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL' EXPORTING date_external = it_excel-value IMPORTING date_internal = it_excel-value EXCEPTIONS date_external_is_invalid = 1 OTHERS = 2. IF sy-subrc <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4. ENDIF. DATA : lv_date TYPE dats.

lv_date = it_excel-value.*IT_FB09-ZFBDT = lv_date. WRITE lv_date TO it_fb09-zfbdt MM/DD/YYYY. ENDCASE.

AT END OF row. APPEND it_fb09. CLEAR it_fb09. ENDAT. CLEAR it_excel. ENDLOOP.

ENDFORM. " PROCESS_EXCEL

*&---------------------------------------------------------------------**& Form open_folder*&---------------------------------------------------------------------** text*----------------------------------------------------------------------*

Page 21: Reusable abap codes

* --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM open_folder .

DATA: l_it_file TYPE STANDARD TABLE OF sdokpath, l_wa_file TYPE sdokpath, l_folder TYPE c.

CALL FUNCTION 'TMP_GUI_FILE_OPEN_DIALOG' TABLES file_table = l_it_file EXCEPTIONS cntl_error = 1 OTHERS = 2.

IF sy-subrc EQ 0. READ TABLE l_it_file INTO l_wa_file INDEX 1. IF sy-subrc EQ 0. p_file = l_wa_file-pathname. ENDIF. ENDIF.

ENDFORM. " open_folder*&---------------------------------------------------------------------**& Form WRITE_ERROR_MESSAGE*&---------------------------------------------------------------------** text*----------------------------------------------------------------------** --> p1 text* <-- p2 text*----------------------------------------------------------------------*FORM write_error_message. WRITE:/ 'Total no. of rows uploaded from excel',bdc_count. WRITE:/'Total no. of rows updated to SAP', bdc_suc_count. WRITE:/ 'Total no. of rows in error stage', bdc_err_count. SKIP. WRITE:/ 'Rows in error stage as follows:'. SKIP. LOOP AT it_result. WRITE:/ 'Document Number ',it_result-belnr. WRITE:/ 'Status : ',it_result-status. WRITE:/ 'Message :',it_result-message. CLEAR it_result. ENDLOOP.

ENDFORM. " WRITE_ERROR_MESSAGE

Important tables of SAP

1. TBTCO – CONTAINS ALL SAP’S JOB INFO2. LIPS- Delivery item level info3. LIKP- delivery header level info4. vbak – sales order header data5. vbap – sales order item data

Page 22: Reusable abap codes

6. vbrp – billing item data7. vbrk – billing header data8. VBFA- sales document flow9. EKPO- purchase order – item10. EKKO- purchase order – header11. TSTC –tcode data12. E070 transport request header info13. KONP condition record info14. TNAPR processing program for output15. AUFM goods movement for order16. RBCO invoice document,gl document, account assignment17. VBKD sales data : business data18. TSPAT Organizational Unit: Sales Divisions: Texts19. C001 : Customer grp/material grp/ account key20. VTTK : shipment header level data21. VTTP : shipment item level data22. VTTS : Stage of Shipment23. VTPA : SHIPMENT PARTNER

To find the creation/modification data of document at unix server

PERFORM get_date_time USING dir file1. CONCATENATE file-mod_time+0(2) file-mod_time+3(2) file-mod_time+6(2) INTO last_mod_time.

FORM get_date_time USING P_DIR P_FILE1.

CONCATENATE P_DIR P_FILE1 into filepath.

OPEN DATASET filepath FOR input IN text MODE ENCODING default. IF sy-subrc EQ 0. PERFORM show_data USING P_DIR P_FILE1. ENDIF. CLOSE DATASET filepath.

ENDFORM. " get_date_time

FORM show_data USING DIR_NAME FILE_NAME.

DATA: timezone_sec(5) TYPE p, " seconds local time is later than GMT timezone_name(7) TYPE c.

DATA: BEGIN OF searchpoints OCCURS 10, dirname(75) TYPE c, " name of directory. sp_name(75) TYPE c, " name of entry. (may end with sp_cs(10) TYPE c, " ContainsString pattern for name END OF searchpoints.

* prepare time zone correction.CALL 'C_GET_TIMEZONE' ID 'NAME' FIELD timezone_name ID 'SEC' FIELD timezone_sec. timezone_sec = 0 - sy-tzone. IF sy-dayst = 'X'. subtract 3600 from timezone_sec. ENDIF.

Page 23: Reusable abap codes

searchpoints-dirname = DIR_NAME. searchpoints-sp_name = FILE_NAME.

* get in directory

CALL 'C_DIR_READ_START' ID 'DIR' FIELD searchpoints-dirname ID 'FILE' FIELD searchpoints-sp_name ID 'ERRNO' FIELD file-errno ID 'ERRMSG' FIELD file-errmsg.

CLEAR file. CHECK sy-subrc = 0.

CALL 'C_DIR_READ_NEXT' ID 'NAME' FIELD file-name ID 'MTIME' FIELD file-mtime ID 'ERRNO' FIELD file-errno ID 'ERRMSG' FIELD file-errmsg.

IF SY-SUBRC <> 0. WRITE: / 'C_DIR_READ_NEXT', 'SUBRC', SY-SUBRC. EXIT. ENDIF. PERFORM P6_TO_DATE_TIME(RSTR0400) USING file-mtime timezone_sec file-mod_time file-mod_date.

CALL 'C_DIR_READ_FINISH' ID 'ERRNO' FIELD file-errno ID 'ERRMSG' FIELD file-errmsg.

IF SY-SUBRC <> 0. EXIT. ENDIF.

ENDFORM. " show_data

Code to compare contents of two internal table

WRITE:/ 'Customer Partnership'. SORT aknvp BY kunnr vkorg vtweg spart parvw kunn2 ASCENDING. SORT sknvp BY kunnr vkorg vtweg spart parvw kunn2 ASCENDING. LOOP AT sknvp. MOVE sknvp TO aknvp. READ TABLE aknvp WITH KEY kunnr = sknvp-kunnr vkorg = sknvp-vkorg vtweg = sknvp-vtweg spart = sknvp-spart parvw = sknvp-parvw kunn2 = sknvp-kunn2 BINARY SEARCH COMPARING kunnr parvw kunn2 sales_year gtcb_status rralfalfa_status. "Ins M002* IF sy-subrc > 2 OR ( sy-subrc = 2 AND aknvp-zprocessin = '06' ). "Del M003 IF sy-subrc > 2 OR ( sy-subrc = 2 AND aknvp-zprocessin = '02' ). "Ins M003 icust-kunnr = sknvp-kunnr. icust-erdat = sy-datum.

Page 24: Reusable abap codes

icust-erzet = sy-uzeit. icust-loevm = ' '. COLLECT icust. WRITE:/ sknvp-kunnr, sknvp-vkorg, sknvp-vtweg, sknvp-spart, sknvp-parvw, sknvp-kunn2, sknvp-sales_year,sknvp-gtcb_status, "Ins M002 sknvp-rralfalfa_status. "Ins M002 CLEAR icust. ENDIF. ENDLOOP.

schedule jobs programmaticallyDESCRIBE TABLE i_transports LINES lv_lines. IF lv_lines GT 10. MESSAGE i016(z1) WITH 'This may take long time online!running in background'. lv_jobname = sy-repid .

CALL FUNCTION 'JOB_OPEN' EXPORTING jobname = lv_jobname sdlstrtdt = sy-datum sdlstrttm = sy-uzeit IMPORTING jobcount = lv_count EXCEPTIONS cant_create_job = 1 invalid_job_data = 2 jobname_missing = 3 OTHERS = 4. IF sy-subrc <> 0. ENDIF.

OPEN DATASET lv_file IN TEXT MODE FOR OUTPUT ENCODING DEFAULT. LOOP AT i_transports. TRANSFER i_transports TO lv_file. ENDLOOP. CLOSE DATASET lv_file.

SUBMIT ztrconflict TO SAP-SPOOL WITHOUT SPOOL DYNPRO WITH p_upd EQ 'X' USER sy-uname VIA JOB lv_jobname NUMBER lv_count AND RETURN. CALL FUNCTION 'JOB_CLOSE' EXPORTING jobname = lv_jobname jobcount = lv_count strtimmed = 'X' EXCEPTIONS cant_create_job = 1 invalid_job_data = 2 jobname_missing = 3 OTHERS = 4. IF sy-subrc <> 0. ENDIF. WRITE:/ 'Background job scheduled'.

Coding using define & end defineCLEAR wa_komk.

Page 25: Reusable abap codes

wa_komk-belnr = svbak-vbeln. wa_komk-knumv = svbak-knumv. wa_komk-vkorg = svbak-vkorg. wa_komk-vtweg = svbak-vtweg. wa_komk-spart = svbak-spart. get_price_cond wa_komk itkomv. SORT itkomv BY kposn kschl.

DEFINE get_price_cond. call function 'RV_PRICE_PRINT_REFRESH' tables tkomv = &2.

call function 'RV_KONV_SELECT' exporting comm_head_i = &1* GENERAL_READ = ' '* READ_CONDITION_RECORD = ' '* IMPORTING* COMM_HEAD_E = tables tkomv = &2 .END-OF-DEFINITION.

This include allows you to display one or more ALV tables by simply using a local class. Block mode is supported so you can

display several tables on same screen.

[edit]

Language and PlatformThis is pure ABAP and will work on releases from 4.6 onwards.

[edit]

VersionV2 with block mode.

[edit]

Code*&---------------------------------------------------------------------*

*& Include Z_TABLE_DISPLAY*&---------------------------------------------------------------------*

* VERSION 2*

* Code from François Henrotte (EPONA Solutions)* http://www.eponasolutions.com

* Belgium* Please keep reference !

********************************************************************** HOW TO

*

Page 26: Reusable abap codes

* Display an ALV grid :* CALL METHOD lcl_table_display=>display_grid( 'tabname' ).

** Display a hierarchical list with header and detail :

* CALL METHOD lcl_table_display=>display_hier( in_header = 'table1'* in_detail = 'table2' ).

** Display a block list with two tables :

* CALL METHOD lcl_table_display=>set_block_mode( 'X' ).* CALL METHOD lcl_table_display=>display_grid( 'table1' ).* CALL METHOD lcl_table_display=>display_grid( 'table2' ).

* CALL METHOD lcl_table_display=>end_block_list( ).*

* You never have to deal with field catalog of tables !!*

* What if field catalog has to be changed anyway ?*

* ob_table = lcl_table_display=>create_table( 'tabname' ).* CALL METHOD ob_table->set_alv_fieldtext( in_field = field

* in_ftext = 'text' ).* CALL METHOD lcl_table_display=>display_grid( 'tabname' ).

*********************************************************************

type-pools: abap, slis.

*----------------------------------------------------------------------** LCL_TABLE_DISPLAY DEFINITION

*----------------------------------------------------------------------*class lcl_table_display definition.

public section.

class-methods: display_list importing in_tabname type any, display_grid importing in_tabname type any, display_hier importing in_header type any in_detail type any

in_level type i optional,

set_block_mode importing in_mode type c, set_block_text importing in_text type any,

end_block_list importing in_print type slis_print_alv optional

exceptions display_error,

create_table importing

in_tabname type tabname returning

value(out_table) type ref to lcl_table_display exceptions

create_error,

get_existing_table importing

in_tabname type any optional in_repid type any optional in_struc type any optional

Page 27: Reusable abap codes

returning value(out_table) type ref to lcl_table_display

exceptions no_parameter not_found,

refresh_objects.

methods: constructor importing in_data type standard table exceptions casting_error empty_fieldcat.

methods: get_alv_fieldcat returning value(out_fieldcat) type slis_t_fieldcat_alv.

methods: set_table_name importing in_tabname type any, set_alv_title importing in_title type any,

set_alv_fieldcat importing in_fieldcat type slis_t_fieldcat_alv, set_alv_fieldnoout importing in_field type any

in_noout type c optional in_tech type c optional,

set_alv_fieldedit importing in_field type any in_edit type c optional,

set_alv_fieldtext importing in_field type any in_ftext type any, set_alv_fieldsum importing in_field type any

in_dosum type c optional, set_alv_linebreak importing in_field type any, set_alv_settings importing in_settings type any, set_alv_layout importing in_layout type any, set_alv_print importing in_print type any, set_alv_sorting importing in_field type any

in_desc type c optional in_group type any optional in_subtot type c optional,

set_alv_keys importing in_level type i in_key type c optional,

set_alv_event importing in_name type any in_form type any,

set_all_events.

protected section.

data: g_table_type type slis_list_type.

data: g_title type lvc_title, gt_fcat type slis_t_fieldcat_alv,

gs_sett type lvc_s_glay, gs_layo type slis_layout_alv,

gt_sort type slis_t_sortinfo_alv, gt_evnt type slis_t_event, gs_prin type slis_print_alv.

class-methods: output_hierarchy exceptions display_error.

Page 28: Reusable abap codes

methods: output_table importing mode type c exceptions display_error,

output_list, output_grid.

private section.

class-data: gt_table_obj type table of ref to lcl_table_display, g_header_table type ref to lcl_table_display, g_detail_table type ref to lcl_table_display.

class-data: g_variant_level type i.

class-data: g_block_mode type c, g_block_text type slis_text40.

types: begin of ty_defin, fieldname type fieldname, ref_tabname type tabname, ref_fieldname type fieldname,

end of ty_defin.

data: g_repid type repid, g_struc type tabname, g_table type tabname.

data: gt_data type ref to data.

data: gt_defin type table of ty_defin, g_level type tabname.

methods: init_block_list, fill_fieldcat importing repid type repid struc type tabname

changing fcat type slis_t_fieldcat_alv exceptions no_definition,

get_definition importing repid type repid struc type tabname

changing abap type rsfb_source, recursive_definition importing repid type repid

changing abap type rsfb_source, map_structure importing source type any changing destin type any,

get_default_variant changing out_variant type disvariant.

endclass. "lcl_table_display DEFINITION

*----------------------------------------------------------------------** LCL_TABLE_DISPLAY IMPLEMENTATION

*----------------------------------------------------------------------*class lcl_table_display implementation.

**** Display table in ALV list

***

Page 29: Reusable abap codes

method display_list. data: l_object type ref to lcl_table_display,

l_tabname type tabname, l_found type c.

l_tabname = in_tabname. loop at gt_table_obj into l_object. if l_object->g_table = l_tabname.

l_found = 'X'. exit. endif. endloop.

if l_found is initial. l_object = lcl_table_display=>create_table( l_tabname ).

if g_block_mode is initial. l_object->g_table_type = 4.

else. l_object->g_table_type = 2.

endif. call method l_object->set_all_events.

endif. call method l_object->output_list.

endmethod. "display_list***

* Display table in ALV grid***

method display_grid. data: l_object type ref to lcl_table_display,

l_tabname type tabname, l_found type c.

l_tabname = in_tabname. loop at gt_table_obj into l_object. if l_object->g_table = l_tabname.

l_found = 'X'. exit. endif. endloop.

if l_found is initial. l_object = lcl_table_display=>create_table( l_tabname ).

if g_block_mode is initial. l_object->g_table_type = 4.

else. l_object->g_table_type = 2.

endif. call method l_object->set_all_events.

endif. if g_block_mode is initial.

call method l_object->output_grid. else.

call method l_object->output_list. endif.

endmethod. "display_grid***

* Display tables in ALV hierarchy***

method display_hier.

Page 30: Reusable abap codes

data: l_tabnam1 type tabname, l_tabnam2 type tabname,

lt_fcat1 type slis_t_fieldcat_alv, lt_fcat2 type slis_t_fieldcat_alv, ls_fcat1 type slis_fieldcat_alv, ls_fcat2 type slis_fieldcat_alv.

l_tabnam1 = in_header. l_tabnam2 = in_detail.

call method lcl_table_display=>get_existing_table exporting

in_tabname = l_tabnam1 receiving

out_table = g_header_table exceptions

not_found = 1. if sy-subrc ne 0.

g_header_table = lcl_table_display=>create_table( l_tabnam1 ). if g_block_mode is initial.

g_header_table->g_table_type = 1. else.

g_header_table->g_table_type = 3. endif.

call method g_header_table->set_all_events. endif.

call method lcl_table_display=>get_existing_table exporting

in_tabname = l_tabnam2 receiving

out_table = g_detail_table exceptions

not_found = 1. if sy-subrc ne 0.

g_detail_table = lcl_table_display=>create_table( l_tabnam2 ). endif.

* Set key fields if in_level is initial.

lt_fcat1 = g_header_table->get_alv_fieldcat( ). lt_fcat2 = g_detail_table->get_alv_fieldcat( ).

loop at lt_fcat1 into ls_fcat1. ls_fcat1-key = space.

loop at lt_fcat2 into ls_fcat2 where fieldname = ls_fcat1-fieldname.

ls_fcat2-key = space. ls_fcat2-key_sel = 'X'. ls_fcat2-tech = 'X'.

modify lt_fcat2 from ls_fcat2 transporting key. endloop.

if sy-subrc = 0. ls_fcat1-key = 'X'.

endif. modify lt_fcat1 from ls_fcat1 transporting key.

endloop. call method g_header_table->set_alv_fieldcat

exporting in_fieldcat = lt_fcat1.

Page 31: Reusable abap codes

call method g_detail_table->set_alv_fieldcat exporting

in_fieldcat = lt_fcat2. else.

call method g_header_table->set_alv_keys exporting

in_level = in_level. call method g_detail_table->set_alv_keys

exporting in_level = in_level in_key = space.

endif.

call method output_hierarchy. endmethod. "display_hier

**** Set block mode

*** method set_block_mode.

g_block_mode = in_mode. endmethod. "set_block_mode

**** Set block text

*** method set_block_text.

g_block_text = in_text. endmethod. "set_block_text

**** Create new table

*** method create_table.

data: l_object type ref to lcl_table_display.

field-symbols: <local> type standard table.

assign (in_tabname) to <local>. if not <local> is assigned.

raise create_error. endif.

create object l_object exporting in_data = <local> exceptions casting_error = 1 empty_fieldcat = 2.

if sy-subrc ne 0. raise create_error.

endif. call method l_object->set_table_name

exporting in_tabname = in_tabname.

* Default print options l_object->gs_prin-no_print_selinfos = 'X'. l_object->gs_prin-no_coverpage = 'X'. l_object->gs_prin-no_print_listinfos = 'X'.

out_table = l_object. endmethod. "create_table

Page 32: Reusable abap codes

**** Get existing table

*** method get_existing_table.

data: l_object type ref to lcl_table_display, l_tabname type tabname, l_repid type repid, l_struc type tabname,

l_found type c.

l_tabname = in_tabname. l_repid = in_repid. l_struc = in_struc.

if l_tabname is initial. if l_repid is initial and l_struc is initial. raise no_parameter.

else.* Get last existing table with same definition

loop at gt_table_obj into l_object. if l_object->g_repid = l_repid and l_object->g_struc = l_struc.

l_found = 'X'. exit. endif. endloop. endif. else.

* Get last existing table with same name loop at gt_table_obj into l_object. if l_object->g_table = l_tabname.

l_found = 'X'. exit. endif. endloop. endif.

if l_found is initial. raise not_found.

else. out_table = l_object.

endif. endmethod. "get_existing_table

**** Create table display

*** method constructor.

data: l_object type ref to lcl_table_display.

data: ls_data type ref to data.

data: ob_desc type ref to cl_abap_structdescr.

data: l_found type c, l_absol type char200, l_repid type repid, l_struc type tabname.

Page 33: Reusable abap codes

field-symbols: <table> type standard table, <struc> type any.

* Get data and store it into attribute create data me->gt_data like in_data. assign me->gt_data->* to <table>.

<table> = in_data.

* Get global data definition create data ls_data like line of <table>.

assign ls_data->* to <struc>. catch system-exceptions assign_casting_illegal_cast = 1.

ob_desc ?= cl_abap_typedescr=>describe_by_data( <struc> ). endcatch.

if sy-subrc = 1. raise casting_error.

endif.

* Get program name and main type used to define table l_absol = ob_desc->absolute_name.

split l_absol at '\TYPE=' into l_repid l_struc. shift l_repid up to '='.

shift l_repid.

check l_struc np '%_*'.

* Set attributes me->g_repid = l_repid. me->g_struc = l_struc.

me->g_table = l_struc. replace 'TY' with 'WT' into me->g_table.

* Field catalog call method lcl_table_display=>get_existing_table

exporting in_repid = l_repid in_struc = l_struc

receiving out_table = l_object

exceptions not_found = 1. if sy-subrc = 0.

me->gt_fcat = l_object->get_alv_fieldcat( ). call method set_table_name

exporting in_tabname = me->g_table.

else. call method fill_fieldcat

exporting repid = l_repid struc = l_struc

changing fcat = me->gt_fcat. if me->gt_fcat is initial. raise empty_fieldcat.

Page 34: Reusable abap codes

endif. endif.

* Keep list of tables append me to gt_table_obj.

endmethod. "constructor***

* Output list***

method output_list. call method output_table

exporting mode = 'L'.

endmethod. "output_list***

* Output grid***

method output_grid. call method output_table

exporting mode = 'G'.

endmethod. "output_grid***

* Output table***

method output_table. data: l_object type ref to lcl_table_display.

data: ls_vari type disvariant.

field-symbols: <table> type standard table.

assign me->gt_data->* to <table>.

if not g_block_mode is initial. read table gt_table_obj into l_object index 1.

if sy-subrc = 0. if l_object->g_table = me->g_table.

call method init_block_list. endif. endif. endif.

* Get default user variant call method get_default_variant

changing out_variant = ls_vari.

* Display table contents if mode = 'G'.

call function 'REUSE_ALV_GRID_DISPLAY' exporting

i_callback_program = me->g_repid i_grid_title = me->g_title i_grid_settings = me->gs_sett is_layout = me->gs_layo it_fieldcat = me->gt_fcat

Page 35: Reusable abap codes

it_sort = me->gt_sort i_save = 'U'

is_variant = ls_vari it_events = me->gt_evnt is_print = me->gs_prin

tables t_outtab = <table>

exceptions program_error = 1 others = 2.

if sy-subrc <> 0. raise display_error.

endif. call method refresh_objects.

else. if g_block_mode is initial.

call function 'REUSE_ALV_LIST_DISPLAY' exporting

i_callback_program = me->g_repid is_layout = me->gs_layo it_fieldcat = me->gt_fcat it_sort = me->gt_sort

i_save = 'U' is_variant = ls_vari

it_events = me->gt_evnt is_print = me->gs_prin

tables t_outtab = <table>

exceptions others = 0.

if sy-subrc <> 0. raise display_error.

endif. call method refresh_objects.

else. call function 'REUSE_ALV_BLOCK_LIST_APPEND'

exporting is_layout = me->gs_layo it_fieldcat = me->gt_fcat i_tabname = me->g_table it_events = me->gt_evnt it_sort = me->gt_sort i_text = g_block_text

tables t_outtab = <table>

exceptions program_error = 1 maximum_of_appends_reached = 2 others = 3.

if sy-subrc <> 0. raise display_error.

endif. endif. endif.

endmethod. "output_table***

* Output hierarchy

Page 36: Reusable abap codes

*** method output_hierarchy.

data: l_object type ref to lcl_table_display.

data: lt_fcat type slis_t_fieldcat_alv, lt_sort type slis_t_sortinfo_alv, ls_fcat type slis_fieldcat_alv,

ls_vari type disvariant, ls_keyi type slis_keyinfo_alv.

data: l_index type numc2, l_field type fieldname.

field-symbols: <head> type standard table, <deta> type standard table,

<targ> type any.

assign g_header_table->gt_data->* to <head>. assign g_detail_table->gt_data->* to <deta>.

* Set key fields as common fields between header and detail loop at g_header_table->gt_fcat into ls_fcat

where key = 'X'. l_index = l_index + 1.

* Create link concatenate 'HEADER' l_index into l_field.

assign component l_field of structure ls_keyi to <targ>. if sy-subrc = 0.

<targ> = ls_fcat-fieldname. unassign <targ>.

else. exit. endif. endloop.

append lines of g_header_table->gt_fcat to lt_fcat. append lines of g_detail_table->gt_fcat to lt_fcat.

append lines of g_header_table->gt_sort to lt_sort. append lines of g_detail_table->gt_sort to lt_sort.

if not g_block_mode is initial. read table gt_table_obj into l_object index 1.

if sy-subrc = 0. if l_object->g_table = g_header_table->g_table. call method g_header_table->init_block_list.

endif. endif. endif.

* Get default user variant call method g_header_table->get_default_variant

changing out_variant = ls_vari.

if g_block_mode is initial. call function 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'

Page 37: Reusable abap codes

exporting i_callback_program = g_header_table->g_repid is_layout = g_header_table->gs_layo

it_fieldcat = lt_fcat it_sort = lt_sort i_save = 'U'

is_variant = ls_vari it_events = g_header_table->gt_evnt i_tabname_header = g_header_table->g_table i_tabname_item = g_detail_table->g_table

is_keyinfo = ls_keyi is_print = g_header_table->gs_prin

tables t_outtab_header = <head> t_outtab_item = <deta>

exceptions program_error = 1 others = 2.

if sy-subrc <> 0. raise display_error.

endif. call method refresh_objects.

else. call function 'REUSE_ALV_BLOCK_LIST_HS_APPEND'

exporting is_layout = g_header_table->gs_layo

it_fieldcat = lt_fcat is_keyinfo = ls_keyi

i_header_tabname = g_header_table->g_table i_item_tabname = g_detail_table->g_table it_events = g_header_table->gt_evnt

it_sort = lt_sort i_text = g_block_text

tables t_outtab_header = <head> t_outtab_item = <deta>

exceptions program_error = 1 maximum_of_appends_reached = 2 others = 3.

if sy-subrc <> 0. raise display_error.

endif. endif.

endmethod. "output_hierarchy***

* Init block list***

method init_block_list. data: ls_evnt1 type slis_alv_event, ls_evnt2 type slis_alv_event.

* Events for whole list display concatenate 'F_' slis_ev_pf_status_set '_BLOCK'

into ls_evnt1-form. concatenate 'F_' slis_ev_user_command '_BLOCK'

into ls_evnt2-form.

Page 38: Reusable abap codes

* Initialization of block list call function 'REUSE_ALV_BLOCK_LIST_INIT'

exporting i_callback_program = me->g_repid i_callback_pf_status_set = ls_evnt1-form i_callback_user_command = ls_evnt2-form. endmethod. "init_block_list

**** End of block list

*** method end_block_list.

data: l_object type ref to lcl_table_display, ls_print type slis_print_alv.

check not g_block_mode is initial. if in_print is supplied. ls_print = in_print.

else. read table gt_table_obj into l_object index 1.

ls_print = l_object->gs_prin. endif.

call function 'REUSE_ALV_BLOCK_LIST_DISPLAY' exporting

is_print = ls_print exceptions

program_error = 1 others = 2.

if sy-subrc <> 0. raise display_error.

endif. call method refresh_objects.

endmethod. "end_block_list***

* Refresh table of objects***

method refresh_objects. free: gt_table_obj.

endmethod.***

* Fill field catalog***

method fill_fieldcat. data: lt_abap type rsfb_source.

data: ls_defin type ty_defin.

data: lt_dfies type table of dfies, ls_dfies type dfies, ls_dd04v type dd04v, ls_dd01v type dd01v,

l_flong type dfies-lfieldname, l_dname type dfies-domname.

data: ls_fcat type slis_fieldcat_alv, ls_fcat2 type slis_fieldcat_alv.

Page 39: Reusable abap codes

data: l_index type i, l_nbfld type i.

free: me->gt_defin.

* Process data definition call method get_definition

exporting repid = repid struc = struc

changing abap = lt_abap.

* Process sub levels if required call method recursive_definition

exporting repid = repid

changing abap = lt_abap.

if me->gt_defin is initial. raise no_definition.

endif.

loop at me->gt_defin into ls_defin. clear: ls_fcat.

move-corresponding ls_defin to ls_fcat.* Retrieve info about this field

free: ls_dfies, ls_dd04v, ls_dd01v, l_dname. l_flong = ls_fcat-ref_fieldname.

set locale language 'E'. translate: ls_fcat-ref_tabname to upper case, ls_fcat-ref_fieldname to upper case, l_flong to upper case.

if not ls_fcat-ref_tabname is initial.* Try to get info about field in table call function 'DDIF_FIELDINFO_GET'

exporting tabname = ls_fcat-ref_tabname fieldname = ls_fcat-ref_fieldname

lfieldname = l_flong importing

dfies_wa = ls_dfies exceptions

not_found = 1 internal_error = 2 others = 3.

if sy-subrc = 0. move-corresponding ls_dfies to ls_fcat. ls_fcat-fieldname = ls_defin-fieldname. move: ls_dfies-keyflag to ls_fcat-key,

ls_dfies-scrtext_m to ls_fcat-seltext_l, ls_dfies-domname to l_dname.

endif. else.

* Try to get info about structure ls_defin-ref_tabname = ls_defin-ref_fieldname.

Page 40: Reusable abap codes

call function 'DDIF_FIELDINFO_GET' exporting

tabname = ls_defin-ref_tabname tables

dfies_tab = lt_dfies exceptions

others = 0. if not lt_dfies is initial.

* Process fields of this structure loop at lt_dfies into ls_dfies.

clear: ls_fcat. move-corresponding ls_dfies to ls_fcat. if ls_defin-fieldname ne 'INCLUDE'.

concatenate ls_defin-fieldname ls_fcat-fieldname into ls_fcat-fieldname

separated by '-'. endif.

move ls_dfies-keyflag to ls_fcat-key. move ls_dfies-scrtext_m to ls_fcat-seltext_l.

ls_fcat-tabname = me->g_table. clear: ls_fcat-col_pos, ls_fcat-offset.

if ls_fcat-ref_tabname is initial. ls_fcat-ddictxt = 'L'.

endif.* Display Yes/No fields as checkboxes

if ls_dfies-domname = 'XFELD'. ls_fcat-checkbox = 'X'.

endif.

* Add field to field catalog append ls_fcat to fcat.

endloop. continue.

else.* Try to get info about data element

call function 'DDIF_DTEL_GET' exporting

name = ls_fcat-ref_fieldname langu = sy-langu

importing dd04v_wa = ls_dd04v

exceptions illegal_input = 1 others = 2.

if sy-subrc = 0. move-corresponding ls_dd04v to ls_fcat.

move: ls_dd04v-scrtext_m to ls_fcat-seltext_l, ls_dd04v-domname to l_dname.

else.* Finally try to get info about domain

call function 'DDIF_DOMA_GET' exporting

name = ls_fcat-ref_fieldname langu = sy-langu

importing dd01v_wa = ls_dd01v

Page 41: Reusable abap codes

exceptions illegal_input = 1 others = 2.

if sy-subrc = 0. move-corresponding ls_dd01v to ls_fcat.

move: ls_dd01v-ddtext to ls_fcat-seltext_l, ls_dd01v-domname to l_dname.

endif. endif. endif. endif.

* Table name must be internal table containing data ls_fcat-tabname = g_table.

* No offset clear: ls_fcat-offset.

* Default text is stored in long text if ls_fcat-ref_tabname is initial.

ls_fcat-ddictxt = 'L'. endif.

* Display Yes/No fields as checkboxes if l_dname = 'XFELD'.

ls_fcat-checkbox = 'X'. endif.

* Add field to field catalog append ls_fcat to fcat.

endloop.* Positions

loop at fcat into ls_fcat. ls_fcat-row_pos = 1.

ls_fcat-col_pos = sy-tabix. modify fcat from ls_fcat transporting row_pos col_pos.

endloop.* Link between fields

describe table fcat lines l_nbfld. loop at fcat into ls_fcat. if sy-tabix ne l_nbfld. l_index = sy-tabix + 1.

read table fcat into ls_fcat2 index l_index. if sy-subrc = 0.

if ls_fcat-datatype = 'CURR'.* Currency unit

if ls_fcat2-datatype = 'CUKY'. ls_fcat-cfieldname = ls_fcat2-fieldname. ls_fcat-ctabname = ls_fcat2-tabname.

modify fcat from ls_fcat. else.

loop at fcat into ls_fcat2 from l_index

where datatype = 'CUKY'.* First currency unit after field

ls_fcat-cfieldname = ls_fcat2-fieldname. ls_fcat-ctabname = ls_fcat2-tabname.

modify fcat from ls_fcat. exit. endloop.

if sy-subrc ne 0.

Page 42: Reusable abap codes

* No currency unit after field, try before read table fcat into ls_fcat2

with key datatype = 'CUKY'. if sy-subrc = 0.

ls_fcat-cfieldname = ls_fcat2-fieldname. ls_fcat-ctabname = ls_fcat2-tabname.

modify fcat from ls_fcat. else.

* Default is EURO ls_fcat-currency = 'EUR'.

endif. endif. endif. endif.

if ls_fcat-datatype = 'QUAN'.* Quantity unit

if ls_fcat2-datatype = 'UNIT'. ls_fcat-cfieldname = ls_fcat2-fieldname. ls_fcat-ctabname = ls_fcat2-tabname.

modify fcat from ls_fcat. endif. endif. endif. endif. endloop.

endmethod. "fill_fieldcat***

* Get definition of type from code source***

method get_definition. data: l_strng type rssource, ls_abap type rssource,

l_fdpos type i, l_first type i, l_lastr type i.

data: lt_incl type table of repid, ls_incl type repid.

* Get program code read report repid into abap.

check sy-subrc eq 0.

* Get first line of definition concatenate 'BEGIN OF' struc into l_strng separated by space.

loop at abap into ls_abap. if ls_abap cs l_strng.

l_fdpos = strlen( l_strng ) + sy-fdpos. if ls_abap(1) = '*' or ls_abap(sy-fdpos) cs '"'.

continue. endif.

if ls_abap+l_fdpos(1) ca ',. "'. l_first = sy-tabix.

exit. endif. endif.

Page 43: Reusable abap codes

endloop. if l_first is initial.

* Table is defined in an include call function 'RS_GET_ALL_INCLUDES'

exporting program = repid

tables includetab = lt_incl

exceptions others = 1. if sy-subrc = 0.

loop at lt_incl into ls_incl.* Try to find definition in this include

read report ls_incl into abap. loop at abap into ls_abap. if ls_abap cs l_strng.

l_fdpos = strlen( l_strng ) + sy-fdpos. if ls_abap(1) = '*' or ls_abap(sy-fdpos) cs '"'.

continue. endif.

if ls_abap+l_fdpos(1) ca ',. "'. l_first = sy-tabix.

exit. endif. endif. endloop.

if not l_first is initial. exit. endif. endloop. endif. endif.

* Get last line of definition concatenate 'END OF' struc into l_strng separated by space.

loop at abap into ls_abap. if ls_abap cs l_strng.

l_fdpos = strlen( l_strng ) + sy-fdpos. if ls_abap(1) = '*' or ls_abap(sy-fdpos) cs '"'.

continue. endif.

if ls_abap+l_fdpos(1) ca ',. "'. l_lastr = sy-tabix - l_first.

exit. endif. endif. endloop.

* Keep only relevant code lines if l_first le 0 or l_lastr le 0. refresh abap.

else. delete abap to l_first. delete abap from l_lastr.

endif.

Page 44: Reusable abap codes

endmethod. "get_definition***

* Get definition of type recursively***

method recursive_definition. data: lt_token type table of stokex,

ls_token type stokex, lt_state type table of sstmnt,

ls_state type sstmnt.

data: ls_defin type ty_defin, l_reffld type fieldname.

data: lt_recu type rsfb_source.

* Retrieve tokens scan abap-source abap

tokens into lt_token statements into lt_state.

loop at lt_state into ls_state. clear: ls_defin.

* Field name read table lt_token into ls_token

index ls_state-from. ls_defin-fieldname = ls_token-str.

* Reference type read table lt_token into ls_token

index ls_state-to. l_reffld = ls_token-str.

* Check if this type is defined in program free: lt_recu.

call method get_definition exporting

repid = repid struc = l_reffld

changing abap = lt_recu. if lt_recu is initial.

if not g_level is initial. concatenate g_level ls_defin-fieldname

into ls_defin-fieldname separated by '-'. condense ls_defin-fieldname.

endif. if l_reffld cs '-'.

split l_reffld at '-' into ls_defin-ref_tabname

ls_defin-ref_fieldname. if ls_defin-ref_tabname = 'SY'. ls_defin-ref_tabname = 'SYST'.

endif. else.

ls_defin-ref_fieldname = ls_token-str. endif.

append ls_defin to me->gt_defin. else.

* Process sub levels

Page 45: Reusable abap codes

if me->g_level is initial. me->g_level = ls_defin-fieldname.

else. concatenate me->g_level ls_defin-fieldname into me->g_level

separated by '-'. endif.

call method recursive_definition exporting

repid = repid changing

abap = lt_recu. if me->g_level cs '-'.

shift me->g_level right up to '-'. shift me->g_level right.

shift me->g_level left deleting leading space. else.

clear: me->g_level. endif. endif. endloop.

endmethod. "recursive_definition***

* Get fieldcat***

method get_alv_fieldcat. out_fieldcat = me->gt_fcat.

endmethod. "get_alv_fieldcat***

* Set table name***

method set_table_name. data: l_fcat type slis_fieldcat_alv.

loop at me->gt_fcat into l_fcat. l_fcat-tabname = in_tabname.

modify me->gt_fcat from l_fcat. endloop.

me->g_table = in_tabname. endmethod. "set_table_name

**** Set title

*** method set_alv_title.

me->g_title = in_title. endmethod. "set_alv_title

**** Set fieldcat

*** method set_alv_fieldcat.

me->gt_fcat = in_fieldcat. endmethod. "set_alv_fieldcat

**** Set field invisible

*** method set_alv_fieldnoout.

data: l_field type fieldname, l_noout type c,

Page 46: Reusable abap codes

l_tech type c, ls_fcat type slis_fieldcat_alv.

l_field = in_field. if in_noout is supplied. l_noout = in_noout.

else. l_noout = 'X'.

endif. if in_tech is supplied. l_tech = in_tech.

endif.

loop at me->gt_fcat into ls_fcat where fieldname = l_field.

ls_fcat-no_out = l_noout. ls_fcat-tech = l_tech.

modify gt_fcat from ls_fcat transporting no_out tech. endloop.

endmethod. "set_alv_fieldnoout***

* Set field editable***

method set_alv_fieldedit. data: l_field type fieldname,

l_edit type c, ls_fcat type slis_fieldcat_alv.

l_field = in_field. if in_edit is supplied. l_edit = in_edit.

else. l_edit = 'X'.

endif.

loop at me->gt_fcat into ls_fcat where fieldname = l_field.

ls_fcat-edit = l_edit. modify gt_fcat from ls_fcat transporting edit.

endloop. endmethod. "set_alv_fieldedit

**** Set field text

*** method set_alv_fieldtext.

data: l_field type fieldname, ls_fcat type slis_fieldcat_alv.

l_field = in_field. loop at me->gt_fcat into ls_fcat

where fieldname = l_field. ls_fcat-seltext_m = in_ftext.

ls_fcat-ddictxt = 'M'. modify gt_fcat from ls_fcat transporting seltext_m ddictxt.

endloop. endmethod. "set_alv_fieldtext

***

Page 47: Reusable abap codes

* Set field sum***

method set_alv_fieldsum. data: l_field type fieldname,

l_dosum type c, ls_fcat type slis_fieldcat_alv.

l_field = in_field. if in_dosum is supplied. l_dosum = in_dosum.

else. l_dosum = 'X'.

endif.

loop at me->gt_fcat into ls_fcat where fieldname = l_field.

ls_fcat-do_sum = l_dosum. modify gt_fcat from ls_fcat transporting do_sum.

endloop. endmethod. "set_alv_fieldsum

**** Set line break in field catalog

*** method set_alv_linebreak.

data: l_field type fieldname, ls_fcat type slis_fieldcat_alv,

l_tabix type i.

l_field = in_field. read table me->gt_fcat into ls_fcat

with key fieldname = l_field. if sy-subrc = 0.

l_tabix = sy-tabix. else. exit. endif.

loop at me->gt_fcat into ls_fcat from l_tabix.

ls_fcat-row_pos = ls_fcat-row_pos + 1. modify gt_fcat from ls_fcat transporting row_pos.

endloop. endmethod. "set_alv_linebreak

**** Set settings

*** method set_alv_settings.

call method map_structure exporting

source = in_settings changing

destin = me->gs_sett. endmethod. "set_alv_settings

**** Set layout

*** method set_alv_layout.

Page 48: Reusable abap codes

call method map_structure exporting

source = in_layout changing

destin = me->gs_layo. endmethod. "set_alv_layout

**** Set printing options

*** method set_alv_print.

call method map_structure exporting

source = in_print changing

destin = me->gs_prin. endmethod. "set_alv_print

**** Set sortings

*** method set_alv_sorting.

data: l_desc type alvdynp-sortdown, l_group type alvdynp-grouplevel, l_subtot type alvdynp-subtotals. data: ls_sort type slis_sortinfo_alv,

l_index type i.

if in_desc is supplied. l_desc = in_desc.

endif. if in_group is supplied. l_group = in_group.

else. l_group = '*'.

endif. if in_subtot is supplied. l_subtot = in_subtot.

else. l_subtot = 'X'.

endif.

describe table me->gt_sort lines l_index. l_index = l_index + 1.

ls_sort-spos = l_index. ls_sort-fieldname = in_field. ls_sort-tabname = me->g_table.

if l_desc is initial. ls_sort-up = 'X'.

else. ls_sort-down = 'X'.

endif. ls_sort-group = l_group. ls_sort-subtot = l_subtot.

append ls_sort to me->gt_sort. endmethod. "set_alv_sorting

***

Page 49: Reusable abap codes

* Set key fields***

method set_alv_keys. data: l_key type c,

ls_fcat type slis_fieldcat_alv.

if in_key is supplied. l_key = in_key.

else. l_key = 'X'.

endif. loop at me->gt_fcat into ls_fcat from 1 to in_level.

ls_fcat-key = l_key. modify gt_fcat from ls_fcat transporting key.

endloop. endmethod. "set_alv_keys

**** Add event

*** method set_alv_event.

data: ls_evnt type slis_alv_event.

loop at gt_evnt into ls_evnt where name = in_name.

ls_evnt-form = in_form. modify gt_evnt from ls_evnt transporting form.

endloop. if sy-subrc ne 0.

ls_evnt-name = in_name. ls_evnt-form = in_form.

append ls_evnt to gt_evnt. endif.

endmethod. "set_alv_event***

* Add event***

method set_all_events. data: lt_trig type table of rtrig, ls_evnt type slis_alv_event.

call function 'REUSE_ALV_EVENTS_GET' exporting

i_list_type = g_table_type importing

et_events = gt_evnt exceptions

list_type_wrong = 1 others = 2.

if sy-subrc = 0.* Get program form routines

load report g_repid part 'TRIG' into lt_trig.* List of valid form routines loop at gt_evnt into ls_evnt.

concatenate 'F_' ls_evnt-name into ls_evnt-form. if not g_block_mode is initial.

concatenate ls_evnt-form me->g_table into ls_evnt-form separated by '_'.

Page 50: Reusable abap codes

endif. read table lt_trig with key exto = ls_evnt-form

fform = 'X' transporting no fields.

if sy-subrc = 0. modify gt_evnt from ls_evnt transporting form.

else. delete gt_evnt.

endif. endloop. endif.

endmethod. "set_all_events***

* Map fields from incoming structure into attribute***

method map_structure. data: ob_desc type ref to cl_abap_structdescr,

ls_compo type abap_compdescr.

field-symbols: <field> type any, <struc> type any.

ob_desc ?= cl_abap_typedescr=>describe_by_data( destin ).

loop at ob_desc->components into ls_compo. assign component ls_compo-name of structure source to <field>.

if <field> is assigned. assign component ls_compo-name of structure destin to <struc>.

catch system-exceptions conversion_errors = 1. move <field> to <struc>.

endcatch. unassign <field>.

endif. endloop.

endmethod. "map_structure***

* Get default variant***

method get_default_variant. g_variant_level = g_variant_level + 1.

out_variant-report = me->g_repid. out_variant-handle = me->g_variant_level.

out_variant-username = sy-uname. call function 'REUSE_ALV_VARIANT_DEFAULT_GET'

exporting i_save = 'U'

changing cs_variant = out_variant

exceptions others = 0.

endmethod. "get_default_variantendclass. "lcl_table_display IMPLEMENTATION

[edit]

Page 51: Reusable abap codes

Links

26. Program to download file to application server and then send mail to user to download it in presentation server

*&---------------------------------------------------------------------**& Form download_to_application*& download to application server, attach to mail and send to user*&---------------------------------------------------------------------*FORM download_to_application.

data: l_title type SO_OBJ_DES.

l_title = sy-repid.

CALL FUNCTION 'ZSEND_REPORT_MAIL'EXPORTINGi_title = l_titletablesit_text_data = it_downloadEXCEPTIONSINVALID_USER = 1MAIL_SEND_ERROR = 2OPEN_FILE = 3FILE_GET_NAME = 4OTHERS = 5.IF sy-subrc <> 0.MESSAGE e368(00) with 'ZSEND_REPORT_MAIL fail -'sy-subrc.ENDIF.

ENDFORM. " download_to_application===============================================================================

FUNCTION Zsend_report_mail.*"----------------------------------------------------------------------

Page 52: Reusable abap codes

*"*"Local interface:*" IMPORTING*" REFERENCE(I_UNAME) TYPE SYUNAME DEFAULT SY-UNAME*" REFERENCE(I_TITLE) TYPE SO_OBJ_DES*" TABLES*" IT_TEXT_DATA*" EXCEPTIONS*" INVALID_USER*" MAIL_SEND_ERROR*" OPEN_FILE*" FILE_GET_NAME*"----------------------------------------------------------------------

* This function is used to store a file (report result) on the file* system of the application server and to send an "active" SAP mail* to the user.* The "active" SAP mail calls function ZMAIL_DOWNLOAD to* download the file to the presentation server.

DATA: ls_document_data LIKE sodocchgi1.DATA: lt_object_para LIKE soparai1 OCCURS 5 WITH HEADER LINE.DATA: lt_object_parb LIKE soparbi1 OCCURS 0 WITH HEADER LINE.DATA: lt_object_cont LIKE solisti1 OCCURS 0 WITH HEADER LINE.DATA: lt_reclist LIKE somlreci1 OCCURS 5 WITH HEADER LINE.

DATA: l_filename(200) TYPE c.

CHECK NOT it_text_data[] IS INITIAL.

* terminate if name not suitable.IF i_uname IS INITIAL ORi_uname = 'WF-BATCH' ORi_uname = 'DDIC' ORi_uname = 'SAP*'.RAISE invalid_user.ENDIF.

* get physical file from logical filename( optional)

CALL FUNCTION 'FILE_GET_NAME'EXPORTINGlogical_filename = 'MAILFILE'parameter_1 = sy-uname

Page 53: Reusable abap codes

parameter_2 = sy-datumparameter_3 = sy-uzeit* USE_PRESENTATION_SERVER = ' '* WITH_FILE_EXTENSION = ' '* USE_BUFFER = ' '* ELEMINATE_BLANKS = 'X'IMPORTING* EMERGENCY_FLAG =* FILE_FORMAT =file_name = l_filenameEXCEPTIONSfile_not_found = 1OTHERS = 2.IF sy-subrc NE 0.RAISE file_get_name.ENDIF.

* save fileOPEN DATASET l_filename FOR OUTPUT IN TEXT MODE.IF sy-subrc NE 0.RAISE open_file.ENDIF.LOOP AT it_text_data. " into l_text_data.TRANSFER it_text_data TO l_filename.ENDLOOP.CLOSE DATASET l_filename.

* SAP mail header (execute function)CLEAR: ls_document_data.ls_document_data-obj_descr = i_title.ls_document_data-proc_type = 'F'. " function callls_document_data-proc_name = 'ZMAIL_DOWNLOAD'.ls_document_data-no_change = 'X'.* SAP mail receiverREFRESH lt_reclist.CLEAR lt_reclist.lt_reclist-receiver = i_uname.lt_reclist-rec_type = 'B'.* gt_reclist-express = 'X'.APPEND lt_reclist.* message textREFRESH lt_object_cont.CLEAR lt_object_cont.

Page 54: Reusable abap codes

lt_object_cont-line ='The result of the following report has been saved.'.APPEND lt_object_cont.* report namelt_object_cont-line = 'Report:'.lt_object_cont-line+15 = sy-cprog.CONDENSE lt_object_cont-line.APPEND lt_object_cont.* date & timelt_object_cont-line = 'Date/Time:'.WRITE sy-datum TO lt_object_cont-line+15.WRITE sy-uzeit TO lt_object_cont-line+27.CONDENSE lt_object_cont-line.APPEND lt_object_cont.*lt_object_cont-line ='Please execute (Ctrl-F6) this mail to download the result.'.APPEND lt_object_cont.

* mail parametersREFRESH lt_object_parb.CLEAR lt_object_parb.lt_object_parb-name = 'FUNCTION'. " mail identifierlt_object_parb-value = 'FILE_DOWNLOAD'. " mail identifierAPPEND lt_object_parb.lt_object_parb-name = 'FILENAME'.lt_object_parb-value = l_filename.APPEND lt_object_parb.

*call SAPOffice APICALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'EXPORTINGdocument_data = ls_document_dataTABLESobject_content = lt_object_contobject_para = lt_object_paraobject_parb = lt_object_parbreceivers = lt_reclistEXCEPTIONStoo_many_receivers = 1document_not_sent = 2document_type_not_exist = 3operation_no_authorization = 4

Page 55: Reusable abap codes

parameter_error = 5x_error = 6enqueue_error = 7OTHERS = 8.IF sy-subrc NE 0.RAISE mail_send_error.ENDIF.

ENDFUNCTION.===========================================================================FUNCTION zmail_download.*"----------------------------------------------------------------------*"*"Local interface:*" TABLES*" MSGDIAL STRUCTURE SOPARBI1*"----------------------------------------------------------------------* This function is called in a SAP mail to download a file from the* application server file system.* Function ZSEND_REPORT_MAIL is used to save report result* on application server file system and to send SAP mail to user.* Based on UK COM solution by Damian Norton.

DATA: ls_msgdial TYPE soparbi1.DATA: l_filename TYPE filep.* DATA: l_filename_local TYPE filep.DATA: l_operation(30) TYPE c.DATA: BEGIN OF lt_text_data OCCURS 10,line(2000),END OF lt_text_data.

* read parametersLOOP AT msgdial INTO ls_msgdial.CASE ls_msgdial-name.WHEN 'FUNCTION'.l_operation = ls_msgdial-value.WHEN 'FILENAME'.l_filename = ls_msgdial-value.WHEN OTHERS.MESSAGE e368(00) WITH 'Invalid parameter' ls_msgdial-name.ENDCASE. " ls_msgdial-nameENDLOOP. " msgdial

Page 56: Reusable abap codes

IF l_operation = 'FILE_DOWNLOAD'.* check, whether file exists on presentation serverREFRESH lt_text_data.OPEN DATASET l_filename FOR INPUT IN TEXT MODE.IF sy-subrc = 0.DO.READ DATASET l_filename INTO lt_text_data-line.IF sy-subrc = 0.APPEND lt_text_data.ELSE.EXIT.ENDIF.ENDDO.CLOSE DATASET l_filename.* request filename on presentation server - or GUI_DOWNLOAD??CALL FUNCTION 'DOWNLOAD'TABLESdata_tab = lt_text_dataEXCEPTIONSinvalid_filesize = 1invalid_table_width = 2invalid_type = 3no_batch = 4unknown_error = 5gui_refuse_filetransfer = 6customer_error = 7OTHERS = 8.IF sy-subrc NE 0.MESSAGE e688(00) WITH 'File download error' sy-subrc.ENDIF.ELSE.MESSAGE e398(00) WITH 'File open error' l_filename.ENDIF. " sy-subrc = 0 (OPEN DATASET)ENDIF. " l_operation = 'FILE_DOWNLOAD'

ENDFUNCTION.

Page 57: Reusable abap codes

Program which create job and specify more details

REPORT ZT401212.*DATA : BEGDATE TYPE DATUM VALUE '20091001'.*data : lr_value1 type ztsdmp_result,*         lr_uname type ztsdmp_result with header line,*         wa_value1 TYPE zlsdmp_result.***SELECT VALUE1 AS low FROM ZENHDATA*INTO CORRESPONDING FIELDS OF TABLE lr_value1*WHERE ZENH = 'E000000198'*AND   active EQ 'X'.*clear wa_value1.**LOOP AT lr_value1 INTO wa_value1.**    lr_uname-sign = 'I'. lr_uname-option = 'EQ'. lr_uname-low = wa_value1-low.*    append lr_uname.*ENDLOOP.*IF sy-uname IN lr_uname.*BEGDATE(4) = BEGDATE(4) - 1.*ENDIF.data : wa_control_rec type EDIDC,      lv_pathname type EDI_PATH-PTHNAM.wa_control_rec-docnum = '0000000000767117'.        wa_control_rec-mandt = sy-mandt.

        CALL FUNCTION 'EDI_PATH_NAME_OUT'          EXPORTING            PORT                     = 'ZCROP'            CONTROLREC               = wa_control_rec         IMPORTING           PATHNAME                 = lv_pathname.data : i_sel1 TYPE TABLE OF rsparams,       wa_sel type rsparams.

 wa_sel-selname = 'HOST'.    "Parameter P_object        wa_sel-kind    = 'P'.           "Parameter        wa_sel-low    = '168.246.56.45'.        append wa_sel to i_sel1.        wa_sel-selname = 'USER'.    "Parameter P_object        wa_sel-kind    = 'P'.           "Parameter        wa_sel-low     = 'anonymous'.        append wa_sel to i_sel1.        wa_sel-selname = 'PASSWD'.    "Parameter P_object        wa_sel-kind    = 'P'.           "Parameter        wa_sel-low     = 'anonymous'.        append wa_sel to i_sel1.        wa_sel-selname = 'CMDS'.    "Parameter P_object        wa_sel-kind    = 'S'.

Page 58: Reusable abap codes

        wa_sel-sign = 'I'.        wa_sel-option = 'EQ'.        If sy-sysid eq 'MSP'.          wa_sel-low = 'cd seedsftp/ShipNoticeIDOCs'.        ELSEIF SY-SYSID EQ 'DEV' OR SY-SYSID EQ 'TRI'.          wa_sel-low = 'cd seedsftp/ShipNoticeIDOCs_test'.        endif.        append wa_sel to i_sel1.        wa_sel-selname = 'CMDS'.    "Parameter P_object        wa_sel-kind    = 'S'.           "Parameter        wa_sel-sign = 'I'.        wa_sel-option = 'EQ'.        wa_sel-low = 'append[]'.        append wa_sel to i_sel1.        wa_sel-selname = 'CMDS'.    "Parameter P_object        wa_sel-kind    = 'S'.           "Parameter        wa_sel-sign = 'I'.        wa_sel-option = 'EQ'.        CONCATENATE lv_pathname(22) '[' into wa_sel-low.        append wa_sel to i_sel1.        wa_sel-selname = 'CMDS'.    "Parameter P_object        wa_sel-kind    = 'S'.           "Parameter        wa_sel-sign = 'I'.        wa_sel-option = 'EQ'.        CONCATENATE lv_pathname+22(40) '[' into wa_sel-low.        append wa_sel to i_sel1.        wa_sel-selname = 'CMDS'.    "Parameter P_object        wa_sel-kind    = 'S'.           "Parameter        wa_sel-sign = 'I'.        wa_sel-option = 'EQ'.        move '[]' to wa_sel-low.        append wa_sel to i_sel1.        wa_sel-selname = 'CMDS'.    "Parameter P_object        wa_sel-kind    = 'S'.           "Parameter        wa_sel-sign = 'I'.        wa_sel-option = 'EQ'.        concatenate 'shipment_idoc-' lv_pathname+40(21) '.dat' into wa_sel-low.        append wa_sel to i_sel1.data : lv_count      LIKE tbtcjob-jobcount.

CALL FUNCTION 'JOB_OPEN'  EXPORTING*   DELANFREP              = ' '*   JOBGROUP               = ' '    JOBNAME                = 'zftpcall_ship_notice'   SDLSTRTDT              = sy-datum   SDLSTRTTM              = sy-uzeit*   JOBCLASS               = IMPORTING   JOBCOUNT               = lv_count* CHANGING*   RET                    =* EXCEPTIONS*   CANT_CREATE_JOB        = 1*   INVALID_JOB_DATA       = 2*   JOBNAME_MISSING        = 3

Page 59: Reusable abap codes

*   OTHERS                 = 4          .IF SY-SUBRC <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.

*submit zftpcall_ship_notice to sap-spool without spool dynpro*with selection-table i_sel1 user 'ZNAFTA' VIA JOB 'zftpcall_ship_notice' number lv_count*with operatingsystem ''*and return.data : ls_varid   LIKE varid,      lit_vari_text LIKE varit OCCURS 0 WITH HEADER LINE.

CLEAR lit_vari_text.    lit_vari_text-langu = sy-langu.    lit_vari_text-report = 'ZFTPCALL'.    lit_vari_text-variant = 'ship_notice'.    lit_vari_text-vtext = 'ship notice variant'.    APPEND lit_vari_text.

*.check variant   DATA: rc LIKE sy-subrc.  CALL FUNCTION 'RS_VARIANT_EXISTS'    EXPORTING      report              = 'ZFTPCALL'      variant             = 'ship_notice'    IMPORTING      r_c                 = rc    EXCEPTIONS      not_authorized      = 01      no_report           = 02      report_not_existent = 03      report_not_supplied = 04.

  IF sy-subrc <> 0.    rc = 8.  ENDIF.

  if rc = 0.

    CLEAR ls_varid.    ls_varid-report = 'ZFTPCALL'.    ls_varid-variant = 'ship_notice'.*    ls_varid-transport = 'F'.*    ls_varid-environmnt = 'A'.*    ADD 1 TO ls_varid-version .

    ls_varid-ename = sy-uname.    ls_varid-edat = sy-datum.    ls_varid-etime = sy-uzeit.    ls_varid-mlangu = sy-langu.    ADD 1 TO ls_varid-version.   CALL FUNCTION 'RS_CHANGE_CREATED_VARIANT'      EXPORTING

Page 60: Reusable abap codes

        curr_report               = 'ZFTPCALL'        curr_variant              = 'ship_notice'        vari_desc                 = ls_varid        ONLY_CONTENTS             = 'Y'      TABLES        vari_contents             = i_sel1        vari_text                 = lit_vari_text      EXCEPTIONS        illegal_report_or_variant = 01        illegal_variantname       = 02        not_authorized            = 03        not_executed              = 04        report_not_existent       = 05        report_not_supplied       = 06        variant_doesnt_exist      = 07        variant_locked            = 08        selections_no_match       = 09.

COMMIT WORK.

   else.

CALL FUNCTION 'RS_CREATE_VARIANT'  EXPORTING    CURR_REPORT                     = 'ZFTPCALL'    CURR_VARIANT                    =  'ship_notice'    VARI_DESC                       =  ls_varid  TABLES    VARI_CONTENTS                   = i_sel1    VARI_TEXT                       =  lit_vari_text*   VSCREENS                        =* EXCEPTIONS*   ILLEGAL_REPORT_OR_VARIANT       = 1*   ILLEGAL_VARIANTNAME             = 2*   NOT_AUTHORIZED                  = 3*   NOT_EXECUTED                    = 4*   REPORT_NOT_EXISTENT             = 5*   REPORT_NOT_SUPPLIED             = 6*   VARIANT_EXISTS                  = 7*   VARIANT_LOCKED                  = 8*   OTHERS                          = 9          .

endif.IF SY-SUBRC <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.CALL FUNCTION 'JOB_SUBMIT'  EXPORTING*   ARCPARAMS                         =    AUTHCKNAM                         = 'ZBTCNAFTA'*   COMMANDNAME                       = ' '*   OPERATINGSYSTEM                   = 'chwsxd34_DEV_00'*   EXTPGM_NAME                       = ' '*   EXTPGM_PARAM                      = ' '*   EXTPGM_SET_TRACE_ON               = ' '

Page 61: Reusable abap codes

*   EXTPGM_STDERR_IN_JOBLOG           = 'X'*   EXTPGM_STDOUT_IN_JOBLOG           = 'X'*   EXTPGM_SYSTEM                     = 'chwsxd34_DEV_00'*   EXTPGM_RFCDEST                    = 'chwsxd34_DEV_00'*   EXTPGM_WAIT_FOR_TERMINATION       = 'X'    JOBCOUNT                          = lv_count    JOBNAME                           = 'zftpcall_ship_notice'   LANGUAGE                          = sy-langu*   PRIPARAMS                         = ' '   REPORT                            = 'ZFTPCALL'   VARIANT                           = 'ship_notice'* IMPORTING*   STEP_NUMBER                       =* EXCEPTIONS*   BAD_PRIPARAMS                     = 1*   BAD_XPGFLAGS                      = 2*   INVALID_JOBDATA                   = 3*   JOBNAME_MISSING                   = 4*   JOB_NOTEX                         = 5*   JOB_SUBMIT_FAILED                 = 6*   LOCK_FAILED                       = 7*   PROGRAM_MISSING                   = 8*   PROG_ABAP_AND_EXTPG_SET           = 9*   OTHERS                            = 10          .IF SY-SUBRC <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.data : target_server like BTCTGTSRVR-SRVNAME.if sy-sysid eq 'MSP'.target_server = 'sapmspci_MSP_00'.elseif sy-sysid eq 'TRI'.target_server = 'saptria1_TRI_01'.elseif sy-sysid eq 'DEV'.target_server = 'chwsxd34_DEV_00'.endif.

CALL FUNCTION 'JOB_CLOSE'  EXPORTING*   AT_OPMODE                         = ' '*   AT_OPMODE_PERIODIC                = ' '*   CALENDAR_ID                       = ' '*   EVENT_ID                          = ' '*   EVENT_PARAM                       = ' '*   EVENT_PERIODIC                    = ' '    JOBCOUNT                          = lv_count    JOBNAME                           = 'zftpcall_ship_notice'*   LASTSTRTDT                        = NO_DATE*   LASTSTRTTM                        = NO_TIME*   PRDDAYS                           = 0*   PRDHOURS                          = 0*   PRDMINS                           = 0*   PRDMONTHS                         = 0*   PRDWEEKS                          = 0*   PREDJOB_CHECKSTAT                 = ' '*   PRED_JOBCOUNT                     = ' '

Page 62: Reusable abap codes

*   PRED_JOBNAME                      = ' '   SDLSTRTDT                         = SY-DATUM   SDLSTRTTM                         = SY-UZEIT*   STARTDATE_RESTRICTION             = BTC_PROCESS_ALWAYS   STRTIMMED                         = 'X'   TARGETSYSTEM                      = 'X'*   START_ON_WORKDAY_NOT_BEFORE       = SY-DATUM*   START_ON_WORKDAY_NR               = 0*   WORKDAY_COUNT_DIRECTION           = 0*   RECIPIENT_OBJ                     =   TARGETSERVER                      = target_server*   DONT_RELEASE                      = ' '*   TARGETGROUP                       = ' '*   DIRECT_START                      =* IMPORTING*   JOB_WAS_RELEASED                  =* CHANGING*   RET                               =* EXCEPTIONS*   CANT_START_IMMEDIATE              = 1*   INVALID_STARTDATE                 = 2*   JOBNAME_MISSING                   = 3*   JOB_CLOSE_FAILED                  = 4*   JOB_NOSTEPS                       = 5*   JOB_NOTEX                         = 6*   LOCK_FAILED                       = 7*   INVALID_TARGET                    = 8*   OTHERS                            = 9          .IF SY-SUBRC <> 0.* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.ENDIF.

Program to convert spool to pdf

RSTXPDFT4REPORT RSTXPDFT4 line-size 80.** Read spool job contents (OTF or ABAP list) and convert* to PDF, download PDF* B20K8A0IKH replace WS_DOWNLOAD with GUI_DOWNLOAD*PARAMETERS:  SPOOLNO LIKE TSP01-RQIDENT,  DOWNLOAD AS CHECKBOX DEFAULT 'X',  P_FILE LIKE RLGRAP-FILENAME DEFAULT 'C:\temp\file.pdf'. "#EC NOTEXTDATA otf like itcoo occurs 100 with header line.DATA CANCEL.DATA PDF LIKE TLINE OCCURS 100 WITH HEADER LINE.

Page 63: Reusable abap codes

DATA DOCTAB LIKE DOCS OCCURS 1 WITH HEADER LINE.DATA: NUMBYTES TYPE I,      ARC_IDX LIKE TOA_DARA,      pdfspoolid like tsp01-rqident,      jobname like tbtcjob-jobname,      jobcount like tbtcjob-jobcount,      is_otf.data: client like tst01-dclient,      name like tst01-dname,      objtype like rststype-type,      type like rststype-type.tables: tsp01.

select single * from tsp01 where rqident = spoolno.if sy-subrc <> 0.  WRITE: / 'Spoolauftrag existiert nicht'(003)          COLOR COL_negative.  exit.endif.client = tsp01-rqclient.name   = tsp01-rqo1name.CALL FUNCTION 'RSTS_GET_ATTRIBUTES'       EXPORTING            AUTHORITY     = 'SP01'            CLIENT        = client            NAME          = name            PART          = 1       IMPORTING*           CHARCO        =*           CREATER       =*           CREDATE       =*           DELDATE       =*           MAX_CREDATE   =*           MAX_DELDATE   =*           NON_UNIQ      =*           NOOF_PARTS    =*           RECTYP        =*           SIZE          =*           STOTYP        =            TYPE          = type            OBJTYPE       = objtype       EXCEPTIONS            FB_ERROR      = 1            FB_RSTS_OTHER = 2            NO_OBJECT     = 3            NO_PERMISSION = 4.if objtype(3) = 'OTF'.  is_otf = 'X'.else.  is_otf = space.endif.if is_otf = 'X'.  CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'      EXPORTING        SRC_SPOOLID                    = spoolno        NO_DIALOG                      = ' '*       DST_DEVICE                     =

Page 64: Reusable abap codes

*       PDF_DESTINATION                =      IMPORTING        PDF_BYTECOUNT                  = numbytes        PDF_SPOOLID                    = pdfspoolid*       OTF_PAGECOUNT                  =        BTC_JOBNAME                    = jobname        BTC_JOBCOUNT                   = jobcount      TABLES        PDF                            = pdf      EXCEPTIONS        ERR_NO_OTF_SPOOLJOB            = 1        ERR_NO_SPOOLJOB                = 2        ERR_NO_PERMISSION              = 3        ERR_CONV_NOT_POSSIBLE          = 4        ERR_BAD_DSTDEVICE              = 5        USER_CANCELLED                 = 6        ERR_SPOOLERROR                 = 7        ERR_TEMSEERROR                 = 8        ERR_BTCJOB_OPEN_FAILED         = 9        ERR_BTCJOB_SUBMIT_FAILED       = 10        ERR_BTCJOB_CLOSE_FAILED        = 11.  case sy-subrc.  when 0.    WRITE: / 'Funktion CONVERT_OTFSPOOLJOB_2_PDF erfolgreich'(001)          COLOR COL_POSITIVE.  when 1.    WRITE: / 'Kein OTF- und kein ABAP-Spoolauftrag'(002)          COLOR COL_negative.    exit.  when 2.    WRITE: / 'Spoolauftrag existiert nicht'(003)          COLOR COL_negative.    exit.  when 3.    WRITE: / 'Keine Berechtigung zum Lesen Spoolauftrag'(004)          COLOR COL_negative.    exit.  when others.    WRITE: / 'Fehler bei Funktion CONVERT_OTFSPOOLJOB_2_PDF'(005)              COLOR COL_negative.    exit.  endcase.else.  CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'      EXPORTING        SRC_SPOOLID                    = spoolno        NO_DIALOG                      = ' '*       DST_DEVICE                     =*       PDF_DESTINATION                =      IMPORTING        PDF_BYTECOUNT                  = numbytes        PDF_SPOOLID                    = pdfspoolid*       LIST_PAGECOUNT                 =        BTC_JOBNAME                    = jobname        BTC_JOBCOUNT                   = jobcount      TABLES        PDF                            = pdf

Page 65: Reusable abap codes

      EXCEPTIONS        ERR_NO_ABAP_SPOOLJOB           = 1        ERR_NO_SPOOLJOB                = 2        ERR_NO_PERMISSION              = 3        ERR_CONV_NOT_POSSIBLE          = 4        ERR_BAD_DESTDEVICE             = 5        USER_CANCELLED                 = 6        ERR_SPOOLERROR                 = 7        ERR_TEMSEERROR                 = 8        ERR_BTCJOB_OPEN_FAILED         = 9        ERR_BTCJOB_SUBMIT_FAILED       = 10        ERR_BTCJOB_CLOSE_FAILED        = 11.  case sy-subrc.  when 0.    WRITE: / 'Funktion CONVERT_ABAPSPOOLJOB_2_PDF erfolgreich'(006)          COLOR COL_POSITIVE.  when 1.    WRITE: / 'Kein OTF- und kein ABAP-Spoolauftrag'(002)          COLOR COL_negative.    exit.  when 2.    WRITE: / 'Spoolauftrag existiert nicht'(003)          COLOR COL_negative.    exit.  when 3.    WRITE: / 'Keine Berechtigung zum Lesen Spoolauftrag'(004)          COLOR COL_negative.    exit.  when others.    WRITE: / 'Fehler bei Funktion CONVERT_ABAPSPOOLJOB_2_PDF'(007)              COLOR COL_negative.    exit.  endcase.endif.*************** download PDF file ***********check download = 'X'.if not ( jobname is initial ).  WRITE: / 'Konvertierung per Hintergrundjob'(008)            COLOR COL_normal,            jobname, jobcount.  exit.endif.perform download_w_ext(RSTXPDFT) tables pdf                                 using p_file                                       '.pdf'                                       'BIN'                                       numbytes                                       cancel.if cancel = space.  WRITE: / NUMBYTES, 'Bytes heruntergeladen in Datei'(009), P_FILE.endif.

Page 66: Reusable abap codes

Subroutine to prevent time out error

PERFORM set_progress USING text-m01PERFORM set_progress USING text-m03.

FORM set_progress USING p_text.

MESSAGE s032 WITH p_text. set_progress sy-msgid sy-msgno sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 progress_count max_progress_count step_size. COMMIT WORK.

ENDFORM. " set_progress