ABAP Help Document(13):6.Program call and jump

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