6. Calling and leaving program units
6.1 Calling ABAP Programs
1. SUBMIT keywords
Example:
REPORT ZTOM_LEANING2. "SUBMIT "grammar: *SUBMIT {rep|(name)} [selscreen_options] * [list_options] * [job_options] * [AND RETURN]. "[selscreen_options]: * [USING SELECTION-SCREEN dynnr] * [VIA SELECTION-SCREEN] * [selscreen_parameters] "[USING SELECTION-SCREEN dynnr]: Specify to call Executable Program, I don't know the default 1000 "[VIA SELECTION-SCREEN]: display selection screen, otherwise the selection screen will be executed in the background. "[selscreen_parameters]: * [USING SELECTION-SET variant] * [USING SELECTION-SETS OF PROGRAM prog] "Use variant, use different program variant * [WITH SELECTION-TABLE rspar] "rspar's standard table structure RSPARAMS or RSPARAMSL_255 * [WITH expr_syntax1 WITH expr_syntax2 ...] "Single value: sel {EQ|NE|CP|NP|GT|GE|LT|LE} dobj [SIGN sign] "Range value: sel [NOT] BETWEEN dobj1 AND dobj2 [SIGN sign] "Range type table: sel IN rtab * [WITH FREE SELECTIONS texpr] "[list_options] * [LINE-SIZE width] * [LINE-COUNT page_lines] * { [EXPORTING LIST TO MEMORY] * | [TO SAP-SPOOL spool_options] } "Example: DEMO_PROGRAM_SUBMIT_LINE "spool_options: * SPOOL PARAMETERS pri_params * [ARCHIVE PARAMETERS arc_params] * WITHOUT SPOOL DYNPRO... "[job_options] *[USER user] VIA JOB job NUMBER n... "Define screen SELECTION-SCREEN BEGIN OF SCREEN 1200. PARAMETERS: params RADIOBUTTON GROUP grp1. PARAMETERS: params1 RADIOBUTTON GROUP grp1. SELECTION-SCREEN END OF SCREEN 1200. CLASS demo_submit DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS demo_submit IMPLEMENTATION. METHOD main. DATA: lr_seltab TYPE RANGE OF i, ls_selection LIKE LINE OF lr_seltab, int TYPE i, lt_rspar TYPE TABLE OF rsparams, wa_rspar LIKE LINE OF lt_rspar. "call screen CALL SELECTION-SCREEN 1200 STARTING AT 10 10. IF sy-subrc <> 0. RETURN. ENDIF. IF params = 'X'. wa_rspar-selname = 'SELECTO'. wa_rspar-kind = 'S'. wa_rspar-sign = 'E'. wa_rspar-option = 'BT'. wa_rspar-low = 14. wa_rspar-high = 17. APPEND wa_rspar TO lt_rspar. wa_rspar-selname = 'SELECTO'. wa_rspar-kind = 'S'. wa_rspar-sign = 'I'. wa_rspar-option = 'GT'. wa_rspar-low = 10. APPEND wa_rspar TO lt_rspar. wa_rspar-selname = 'PARAMET'. wa_rspar-kind = 'P'. wa_rspar-low = 'RSPARAMS'. APPEND wa_rspar TO lt_rspar. "Use Selection table SUBMIT ZTOM_LEANING3 VIA SELECTION-SCREEN WITH SELECTION-TABLE lt_rspar AND RETURN. ELSEIF params1 = 'X'. ls_selection-sign = 'I'. ls_selection-option = 'BT'. ls_selection-low = 1. ls_selection-high = 5. APPEND ls_selection TO lr_seltab. "Use with + parameter name SUBMIT ZTOM_LEANING3 VIA SELECTION-SCREEN WITH paramet EQ 'WITH EXPR' WITH selecto IN lr_seltab WITH selecto NE 3 AND RETURN. ENDIF. END METHOD. ENDCLASS. START-OF-SELECTION. demo_submit=>main( ). "EXPORTING LIST TO MEMORY "Must cooperate with AND RETURN FORM f_export_list. DATA list_tab TYPE TABLE OF abaplist. SUBMIT report EXPORTING LIST TO MEMORY AND RETURN. CALL FUNCTION 'LIST_FROM_MEMORY' TABLES listobject = list_tab EXCEPTIONS not_found = 1 OTHERS = 2. IF sy-subrc = 0. CALL FUNCTION 'WRITE_LIST' TABLES listobject = list_tab. ENDIF. ENDFORM. "spool options FORM f_spool_opt. DATA: print_parameters TYPE pri_params, archi_parameters TYPE arc_params, valid_flag TYPE c LENGTH 1. "Get the print parameter CALL FUNCTION 'GET_PRINT_PARAMETERS' EXPORTING report = 'SUBMITABLE' archive_mode = '3' IMPORTING out_parameters = print_parameters out_archive_parameters = archi_parameters valid = valid_flag EXCEPTIONS invalid_print_params = 2 OTHERS = 4. IF valid_flag = 'X' AND sy-subrc = 0. SUBMIT submittable TO SAP-SPOOL SPOOL PARAMETERS print_parameters ARCHIVE PARAMETERS archi_parameters WITHOUT SPOOL DYNPRO. ENDIF. ENDFORM. "job options FORM f_job_opt. DATA: number TYPE tbtcjob-jobcount, name TYPE tbtcjob-jobname VALUE 'JOB_TEST', print_parameters TYPE pri_params. ... "Start the job CALL FUNCTION 'JOB_OPEN' EXPORTING jobname = name IMPORTING jobcount = number EXCEPTIONS cant_create_job = 1 invalid_job_data = 2 jobname_missing = 3 OTHERS = 4. IF sy-subrc = 0. SUBMIT submittable TO SAP-SPOOL SPOOL PARAMETERS print_parameters WITHOUT SPOOL DYNPRO VIA JOB name NUMBER number AND RETURN. IF sy-subrc = 0. "Close the job CALL FUNCTION 'JOB_CLOSE' EXPORTING jobcount = number jobname = name strtimmed = 'X' EXCEPTIONS cant_start_immediate = 1 invalid_startdate = 2 jobname_missing = 3 job_close_failed = 4 job_nosteps = 5 job_notex = 6 lock_failed = 7 OTHERS = 8. IF sy-subrc <> 0. ... ENDIF. ENDIF. ENDIF. ENDFORM.
2. Call Transaction
Example:
"Calling Transactions "1.CALL TRANSACTION "grammar: *CALL TRANSACTION ta { [AND SKIP FIRST SCREEN] * | [USING bdc_tab [bdc_options]] }. "bdc_tab type BDCDATA "[bdc_options]: *{ {[MODE mode] [UPDATE upd]} * |[OPTIONS FROM opt]} *[MESSAGES INTO itab] "MODE: "'A', screen display; "'E',screen display only error occurs; "'N', process without screen display; "'P', process without screen display, debug; "UPDATE: "'A', asynchronous update, commit work; "'S', synchronous update, commit work and wait; "'L', local update, SET UPDATE TASK LOCAL; "OPTIONS, table type CTU_PARAMS "Contains setting fields such as mode and update "2.LEAVE TO TRANSACTION "grammar: *LEAVE TO { {TRANSACTION ta} | {CURRENT TRANSACTION} } * [AND SKIP FIRST SCREEN]. FORM f_call_trans. "order number DATA:lv_order TYPE vbak-vbeln. "transaction call, spa/gpa parameters SET PARAMETER ID 'AUN' FIELD lv_order. CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. "transaction call, bdc table DATA class_name TYPE c LENGTH 30 VALUE 'CL_SPFLI_PERSISTENT'. DATA: bdcdata_wa TYPE bdcdata, bdcdata_tab TYPE TABLE OF bdcdata. DATA opt TYPE ctu_params. CLEAR bdcdata_wa. bdcdata_wa-program = 'SAPLSEOD'. bdcdata_wa-dynpro = '1000'. bdcdata_wa-dynbegin = 'X'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_CURSOR'. bdcdata_wa-fval = 'SEOCLASS-CLSNAME'. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'SEOCLASS-CLSNAME'. bdcdata_wa-fval = class_name. APPEND bdcdata_wa TO bdcdata_tab. CLEAR bdcdata_wa. bdcdata_wa-fnam = 'BDC_OKCODE'. bdcdata_wa-fval = '=WB_DISPLAY'. APPEND bdcdata_wa TO bdcdata_tab. opt-dismode = 'E'. opt-defsize = 'X'. CALL TRANSACTION 'SE24' USING bdcdata_tab OPTIONS FROM opt. ENDFORM.
6.2 Calling Processing Blocks
Procedure can be called internally or externally.
Internal call: define visible methods of Class; Function Modules in Function Group; Subroutine subroutine;
External call: Global Class, public class global call; protected subclass call; private itself and friend class call; Function Module;
Method Calls: static call, dynamic call;
Static call:
meth( … ) – standalone method call
meth( … ) – functional method call
…meth1( … )->meth2( … )->… – method chaining
Dynamic call:
CALL METHOD
Example:
"Static method call *{ static_meth( ) *| static_meth( a ) *| static_meth( p1 = a1 p2 = a2 ... ) *| static_meth( [EXPORTING p1 = a1 p2 = a2 ...] * { [IMPORTING p1 = a1 p2 = a2...] * [CHANGING p1 = a1 p2 = a2...] } * | [RECEIVING r = a] * [EXCEPTIONS [exc1 = n1 exc2 = n2 ...] * [OTHERS = n_others]] ) } "Class method call "The same class method can be called directly by meth( ) or me->meth( ) *meth | oref->meth | class=>meth | super->meth | super->constructor "Functional Method Call "This method only has input parameters, use return to define the return value *{ static_meth( ) *| static_meth( a ) *| static_meth( p1 = a1 p2 = a2 ... ) } "Chain method call "The return value is a class object reference *{ static_meth( ... )->meth1( ... )->meth2( ... )->...->meth( ... )} *| { static_meth( ... )->meth1( ... )->meth2( ... )->...->attr } "Dynamic method call "grammar: *CALL METHOD dynamic_meth { parameter_list * | parameter_tables }. "dynamic_meth: * (meth_name) *| cref->(meth_name) *| iref->(meth_name) *| (class_name)=>(meth_name) *| (class_name)=>meth *| class=>(meth_name) "parameter *[PARAMETER-TABLE ptab] *[EXCEPTION-TABLE etab]. "ptab-name, length 30; "ptab-kind value: class CL_ABAP_OBJECTDESCR defines const value; "ptab-value: data reference; "etab-name, length 30, uppercase; "etab-value, i type; FORM f_dynamic_meth_call. DATA: line TYPE c LENGTH 80, text_tab LIKE STANDARD TABLE OF line, filename TYPE string, filetype TYPE c LENGTH 10, fleng TYPE i. DATA: meth TYPE string, class TYPE string, ptab TYPE abap_parmbind_tab, ptab_line TYPE abap_parmbind, etab TYPE abap_excpbind_tab, etab_line TYPE abap_excpbind. DATA: exc_ref TYPE REF TO cx_sy_dyn_call_error, exc_text TYPE string. "Call class, method class = 'CL_GUI_FRONTEND_SERVICES'. meth = 'GUI_DOWNLOAD'. filename = 'c:\temp\text.txt'. filetype = 'ASC'. ptab_line-name = 'FILENAME'. ptab_line-kind = cl_abap_objectdescr=>exporting. GET REFERENCE OF filename INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. ptab_line-name = 'FILETYPE'. ptab_line-kind = cl_abap_objectdescr=>exporting. GET REFERENCE OF filetype INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. ptab_line-name = 'DATA_TAB'. ptab_line-kind = cl_abap_objectdescr=>changing. GET REFERENCE OF text_tab INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. ptab_line-name = 'FILELENGTH'. ptab_line-kind = cl_abap_objectdescr=>importing. GET REFERENCE OF fleng INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. etab_line-name = 'OTHERS'. etab_line-value = 4. INSERT etab_line INTO TABLE etab. try. CALL METHOD (class) => (meth) PARAMETER-TABLE ptab EXCEPTION-TABLE etab. CASE sy-subrc. WHEN1. ENDCASE. CATCH cx_sy_dyn_call_error INTO exc_ref. exc_text = exc_ref->get_text( ). MESSAGE exc_text TYPE 'I'. ENDTRY. ENDFORM.
CALL FUNCTION
General Function Module Call
1. CALL FUNCTION func { parameter_list | parameter_tables }.
Registration of an Update Task Function Module
2. CALL FUNCTION update_function IN UPDATE TASK
[EXPORTING p1 = a1 p2 = a2…]
[TABLES t1 = itab1 t2 = itab2 …].
Remote Function Call
3. CALL FUNCTION… DESTINATION…
Example 1: general function call
"Function Call "general function call "CALL FUNCTION func { parameter_list | parameter_tables }. "function parameter *[EXPORTING p1 = a1 p2 = a2...] *[IMPORTING p1 = a1 p2 = a2...] *[TABLES t1 = itab1 t2 = itab2...] *[CHANGING p1 = a1 p2 = a2...] *[EXCEPTIONS [exc1 = n1 exc2 = n2 ...] * [error_message = n_error] * [OTHERS = n_others] ]. "EXCEPTIONS exc1 = n1 exc2 = n2 ... OTHERS = n_others "Up to 0-65535 exceptions; "sy-subrc = 0, no exception, otherwise return the n value corresponding to the exception; "Use RAISE or MESSAGE RAISING + execn, throw a specific exception; "Use RAISE without specifying exception, runtime error; "Using MESSAGE RAISING does not know exception, throws information, and then whether the program is executed depends on the type of information; "S, I, or W type, only background log records; "E and A, exception information sy-msgid, sy-msgno, sy-msgty, and sy-msgv1, ... sy-msgv4; "X,short dumps; "Similar to dynamic method call *[PARAMETER-TABLE ptab] *[EXCEPTION-TABLE etab] "ptab type: ABAP_FUNC_PARMBIND_TAB "ptab line type: ABAP_FUNC_PARMBIND "ptab-name,length 30; "ptab-kind, abap defines the type, *- ABAP_FUNC_EXPORTING for input parameters *- ABAP_FUNC_IMPORTING for output parameters *- ABAP_FUNC_TABLES for table parameters *- ABAP_FUNC_CHANGING for input/output parameters "ptab-value, data reference; "ptab-tables_wa, data reference, header line of abap_func_tables parameter; FORM f_dynamic_func_call. DATA: line TYPE c LENGTH 80, text_tab LIKE STANDARD TABLE OF line, filename TYPE string, filetype TYPE c LENGTH 10, fleng TYPE i. DATA: func TYPE string, ptab TYPE abap_func_parmbind_tab, ptab_line TYPE abap_func_parmbind, etab TYPE abap_func_excpbind_tab, etab_line TYPE abap_func_excpbind. func = 'GUI_DOWNLOAD'. filename = 'c:\temp\text.txt'. filetype = 'ASC'. ptab_line-name = 'FILENAME'. ptab_line-kind = abap_func_exporting. GET REFERENCE OF filename INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. ptab_line-name = 'FILETYPE'. ptab_line-kind = abap_func_exporting. GET REFERENCE OF filetype INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. ptab_line-name = 'DATA_TAB'. ptab_line-kind = abap_func_tables. GET REFERENCE OF text_tab INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. ptab_line-name = 'FILELENGTH'. ptab_line-kind = abap_func_importing. GET REFERENCE OF fleng INTO ptab_line-value. INSERT ptab_line INTO TABLE ptab. etab_line-name = 'OTHERS'. etab_line-value = 10. INSERT etab_line INTO TABLE etab. "Dynamic call func CALL FUNCTION func PARAMETER-TABLE ptab EXCEPTION-TABLE etab. CASE sy-subrc. WHEN1. ENDCASE. ENDFORM.
Example 2: call function in update task
"Call Function in update task *CALL FUNCTION update_function IN UPDATE TASK * [EXPORTING p1 = a1 p2 = a2...] * [TABLES t1 = itab1 t2 = itab2 ...].
Example 3: RFCs
"Remote Function Call(RFC) "synchronous function *1. CALL FUNCTION func DESTINATION dest parameter_list. "Asynchronous function *2. CALL FUNCTION func STARTING NEW TASK task * [DESTINATION {dest|{IN GROUP {group|DEFAULT}}}] * [{PERFORMING subr}|{CALLING meth} ON END OF TASK] * parameter_list. "background function(bgRFC) *3. CALL FUNCTION func IN BACKGROUND UNIT parameter_list. "transactional function(tRFC) *4. CALL FUNCTION func IN BACKGROUND TASK * [AS SEPARATE UNIT] * [DESTINATION dest] * parameter_list. "bgRFC is an enhancement of tRFC, it is recommended to use
PERFORM
subroutine call
General Subroutine Call
1. PERFORM subr_identifier [parameter_list].
Registration of Subroutines
2. PERFORM subr ON { {COMMIT [LEVEL idx]} | {ROLLBACK} }.
Example:
"form "perform call subroutine *PERFORM subr_identifier [parameter_list]. "subr_identifier *subr | {subr|(sname) IN PROGRAM [prog|(pname)] [IF FOUND]} *| {n OF subr1 subr2 ...} "[parameter_list] *[TABLES itab1 itab2...] *[USING a1 a2...] *[CHANGING a1 a2 ...].
6.3 Exiting Program Units
Exit Program.
LEAVE PROGRAM
Exit Process Blocks
RETURN
EXIT
CHECK
STOP
CHECK SELECT-OPTIONS (obsolete, for logical databases only)
REJECT (obsolete, for logical databases only)
Example:
"1. Exit Program "LEAVE PROGRAM. "2. Exit block "RETURN "EXIT "CHECK log_exp. "log_exp, logical expression *{ {operand1 {=|EQ|<>|NE|>|GT|<|LT|>=|GE|<=|LE * |CO|CN|CA|NA|CS|NS|CP|NP * |BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS * |O|Z|M} operand2 } * | {operand [NOT] BETWEEN operand1 AND operand2} * | {<fs> IS [NOT] ASSIGNED} * | {ref IS [NOT] BOUND} * | {operand IS [NOT] INITIAL} * | {para IS [NOT] REQUESTED} * | {para IS [NOT] SUPPLIED} * | {[operand [NOT] IN] seltab} } "LOAD-OF-PROGRAM event block "Cannot use return, exit, check to exit "STOP " can only be used in the following block *AT SELECTION-SCREEN (without additions) *START-OF-SELECTION *GET "3. Exit loops *EXIT, exit the loop *CONTINUE, skip this cycle *CHECK, if check fails, jump out of the loop