1. 程式人生 > >ABAP程式互呼叫:SUBMIT、CALL TRANSACTION、LEAVE TO TRANSACTION

ABAP程式互呼叫:SUBMIT、CALL TRANSACTION、LEAVE TO TRANSACTION

Calling Executable Programs(SUBMIT)
設定選擇螢幕引數值(SUBMIT…WITH)
例項一:引數傳遞
例項二:引數傳遞及返回值接收
控制Called Programs中LISTS輸出
修改輸出LISTS行列數
將被調程式的輸出列表列印到spool system
將輸出列表儲存到ABAP memory
使用LEAVE語句退出被調程式
CALL TRANSACTION、LEAVE TO TRANSACTION
退出程式 Leave Program
Passing Data Between Programs

Calling Programs
下面ABAP語句允許你呼叫一個可執行程式或者事務碼,呼叫後你可以直接退出主調程式,或者返回到呼叫被調程式的地方繼續後繼程式碼的執行:
可執行Program                     Transaction
Call (without returning)  SUBMIT                              LEAVE TO TRANSACTION
Call and return             SUBMIT AND RETURN         CALL TRANSACTION
Calling Executable Programs(SUBMIT)
SUBMIT|() [AND RETURN] [].
如果省略AND RETURN選項,主調程式的所有資料與所有級別的List都會從 internal session 中刪除。在被調程式執行完後,會返回到主調程式啟動的地方。
如果帶AND RETURN選項,系統將會保持主調程式的所有數,並在被調程式執行完後返回到主調程式呼叫處(SUBMIT…AND RETURN語句呼叫處),然後系統會繼續執行主調程式SUBMIT…AND RETURN後面的語句。
用來將資料傳遞給被調程式,有以下方式:
設定選擇螢幕引數值(SUBMIT…WITH)
當正常執行一個報表程式時,標準的選擇螢幕會顯示,這些螢幕選擇條件可以是程式自己本身的,也可以是繫結的LDB的螢幕欄位。當使用SUBMIT呼叫時,可以通過各種引數選項來給這些螢幕選擇條件填充值:
SUBMIT… [VIA SELECTION-SCREEN]
[USING SELECTION-SET ]
[WITH ]
[WITH FREE SELECTIONS ]
[WITH SELECTION-TABLE ].
 
VIA SELECTION-SCREEN
被調報表程式的選擇螢幕會顯示。如果此選擇開啟,並且還使用了其他引數選項來傳輸值時,這些值也會顯示在螢幕中相應的輸入框中,並且使用者可以進一步修改這些值。在預設的情況下,通過SUBMIT呼叫時是不會顯示可執行程式的選擇螢幕的。
USING SELECTION-SET
使用變式。This option tells the system to start the called program with the variant .
WITH
使用此選擇可以對選擇螢幕的某個選擇條件進行單獨的賦值,並通過部分來具體來決定是SELECT-OPTIONS還是PARAMETERS,部分可以為以下三種情況:
l   [SIGN ], 用來傳輸螢幕選擇條件的單個值
如果為SELECT-OPTIONS型別的螢幕選擇條件,則使用去填充選擇內表的OPTION欄位,去填充選擇內表的LOW欄位,去填充選擇內表的SIGN欄位(注:如果螢幕條件取值為某個範圍,則這裡不用BT與NB,則使用下面的[NOT] BETWEEN來單獨傳遞)
如果為PARAMETERS型別的螢幕欄位,的值只能是“=”,並將的值賦值給相應螢幕欄位
l  [NOT] BETWEEN AND [SIGN ], 用來傳遞範圍取值
會傳遞給LOW欄位,會傳遞給HIGH欄位,會傳遞給選擇內表的SIGN欄位。如果省略了NOT選項,系統會將OPTION欄位設定為BT,如果使用了NOT選項,系統會將OPTION設定為NB。
l  IN , 通過條件選擇內表(行結構型別與SELECT-OPTION選擇條內錶行結構相同)傳遞螢幕引數
該選項會將主調程式中的條件內表賦值給被呼叫程式的條件選擇內表。必須是一個條件內表,可以使用RANGES語句來建立。
WITH FREE SELECTION , user dialog for dynamic selections動態選擇的使用者對話
To use this option, both calling and called programs must be connected to a logical
database that supports dynamic selections. In the calling program, use the function
modules FREE_SELECTIONS_INIT and FREE_SELECTIONS_DIALOG. They allow the
user to enter dynamic selections on a selection screen. One export parameter of these
function modules has structure RSDS_TEXPR from the RSDS type group. Transfer the
values of this export parameter by means of the internal table of the same
structure to the called report.
要使用此選項,必須將呼叫報表和被呼叫報表都連線到支援動態選擇的邏輯資料庫。在呼叫報表中,使用功能模組 FREE-SELECTIONS_INIT 和 FREE_SELECTIONS_DIALOG,它們允許使用者在選擇螢幕上輸入動態選擇。這些功能塊的一個輸出引數有 RSDS 型別組中的 RSDS_TEXPR 結構。通過相同結構的內部表將此輸出引數的值傳送到被呼叫報表。
 
WITH SELECTION-TABLE , dynamic transfer of values
內表必須是行結構必須是RSPARAMS結構型別的型別,該結構包含以下欄位:

SELNAME:SELECT-OPTION 或者 PARAMETER螢幕欄位名稱
KIND:如果是SELECT-OPTION時,取值為S,如果PARAMETER時,取值為P。
其他欄位與SELECT-OPTION選擇條內錶行結構相同。
除了WITH SELECTION-TABLE以外,WITH 選項你可以多次使用。在實際應用中,你可以對某個SELECT-OPTION選擇條件使用WITH 選項多次,在被呼叫程式中,系統會將這些行append到selection tables中,但如果對某個PARAMETER條件使用多次,則會使用最後一次的值。
 
例項一:引數傳遞
REPORT  zjzj_rep2 NO STANDARD PAGE HEADING.DATA: int TYPE i,
      rspar LIKE rsparams OCCURS 10 WITH HEADER LINE.RANGES seltab FOR int.WRITE: ‘Select a Selection!’,
      / ‘--------------------’.SKIP.FORMAT HOTSPOT COLOR 5 INVERSE ON.WRITE: ‘Selection 1’,
      / ‘Selection 2’.AT LINE-SELECTION.
  CASE sy-lilli."選中的行號
    WHEN 4.
      seltab-sign = ‘I’.
      seltab-option = ‘BT’.
      seltab-low = 1.
      seltab-high = 5.
      APPEND seltab.
      SUBMIT zjzj_rep1 VIA SELECTION-SCREEN
        WITH paramet EQ ‘Selection 1’
        WITH selecto IN seltab
        WITH selecto NE 3
        AND RETURN.
    WHEN 5.
      rspar-selname = ‘SELECTO’. 
      rspar-kind = ‘S’.
      rspar-sign = ‘E’. 
      rspar-option = ‘BT’.
      rspar-low = 14. 
      rspar-high = 17.
      APPEND rspar.
      rspar-selname = ‘PARAMET’. 
      rspar-kind = ‘P’.
      rspar-low = ‘Selection 2’.
      APPEND rspar.
      rspar-selname = ‘SELECTO’. 
      rspar-kind = ‘S’.
      rspar-sign = ‘I’. 
      rspar-option = ‘GT’.
      rspar-low = 10.
      APPEND rspar.
      SUBMIT zjzj_rep1 VIA SELECTION-SCREEN
        WITH SELECTION-TABLE rspar
        AND RETURN.
  ENDCASE.
 
REPORT  ZJZJ_REP1.DATA number TYPE i.PARAMETERS paramet(14).SELECT-OPTIONS selecto FOR number.

例項二:引數傳遞及返回值接收
REPORT  yjzj_call_prog_9_6_2.TABLES: mard.DATA: BEGIN OF gx_mard OCCURS 0,
      matnr LIKE mard-matnr,
      werks LIKE mard-werks,
      lgort LIKE mard-lgort,
      labst LIKE mard-labst,
      insme LIKE mard-insme,END OF gx_mard,
gt_mard LIKE TABLE OF gx_mard.CONSTANTS: g_memory(30) VALUE ‘JACKYTEST’.PARAMETERS: p_werks LIKE mard-werks OBLIGATORY.SELECT-OPTIONS: s_matnr FOR mard-matnr.PARAMETERS: p_qty AS CHECKBOX.PARAMETERS: p_type NO-DISPLAY DEFAULT ‘1’.START-OF-SELECTION.
  DATA: gt_tabsel LIKE rsparams OCCURS 10 WITH
HEADER LINE.
  IF NOT s_matnr[] IS INITIAL.
    LOOP AT s_matnr.
      "selection型別引數需要封裝到rsparams型別的內表中才能傳遞
      MOVE-CORRESPONDING s_matnr TO gt_tabsel.
      "被呼叫程式中的selection-option引數
      gt_tabsel-selname = ‘S_MATNR’.
      gt_tabsel-kind = ‘S’.
      APPEND gt_tabsel.
      CLEAR gt_tabsel.
    ENDLOOP.
  ENDIF.
  SUBMIT yjzj_call_prog_9_6 WITH p_werks = p_werks
                          WITH p_qty = p_qty
                          WITH p_type = ‘X’
                          "傳遞selection型別的引數到被呼叫程式中
                          WITH SELECTION-TABLE gt_tabsel
                          AND RETURN.
  "從被呼叫程式中匯入結果
  IMPORT gt_mard TO gt_mard FROM MEMORY ID g_memory.
  FREE MEMORY ID g_memory.
  LOOP AT gt_mard INTO gx_mard.
    WRITE:/02 gx_mard-matnr,
              gx_mard-werks,
              gx_mard-lgort,
              gx_mard-labst,
              gx_mard-insme.
  ENDLOOP.
 
REPORT  yjzj_call_prog_9_6.TABLES: mard.DATA: BEGIN OF gx_mard OCCURS 0,
      matnr LIKE mard-matnr,
      werks LIKE mard-werks,
      lgort LIKE mard-lgort,
      labst LIKE mard-labst,
      insme LIKE mard-insme,END OF gx_mard,
gt_mard LIKE TABLE OF gx_mard.CONSTANTS: g_memory(30) VALUE ‘JACKYTEST’.PARAMETERS: p_werks LIKE mard-werks OBLIGATORY.SELECT-OPTIONS: s_matnr FOR mard-matnr.PARAMETERS: p_qty AS CHECKBOX.PARAMETERS: p_type NO-DISPLAY.START-OF-SELECTION.
  SELECT matnr werks lgort labst insme
         INTO CORRESPONDING FIELDS OF TABLE gt_mard FROM mard WHERE
         matnr IN s_matnr AND
         werks EQ p_werks.
  DATA: g_tabix TYPE i.
  IF p_qty NE space.
    LOOP AT gt_mard INTO gx_mard.
      g_tabix = sy-tabix.
      gx_mard-labst = gx_mard-labst + gx_mard-insme.
      IF gx_mard-labst <= 0.
        DELETE gt_mard INDEX g_tabix.
        CONTINUE.
      ENDIF.
    ENDLOOP.
  ENDIF.
  IF p_type NE space.
    FREE MEMORY ID g_memory.
    "將結果匯出到主呼叫程式    EXPORT gt_mard FROM gt_mard TO MEMORY ID g_memory.
  ELSE.
    LOOP AT gt_mard INTO gx_mard.
      WRITE:/02 gx_mard-matnr,
                gx_mard-werks,
                gx_mard-lgort,
                gx_mard-labst,
                gx_mard-insme.
    ENDLOOP.
  ENDIF.
控制Called Programs中LISTS輸出
當你使用SUBMIT提交一個ABAP program時,你可以控制這個被調程式的輸出列表:修改輸出行列長度格式、輸出到spool file來代替輸出到螢幕、或者是將輸出列表儲存到ABAP memory中。
修改輸出LISTS行列數
SUBMIT… [LINE-SIZE] [LINE-COUNT].
如果被調程式的REPORT語句後面沒有這LINE-SIZE與LINE-COUNT兩個選項,系統將會使用SUBMIT語句後面的這兩個選項來格式化輸出列表。
REPORT  zjzj_rep2 NO STANDARD PAGE HEADING.DATA: NAME(9) VALUE ‘ZJZJ_REP1’,
      WID TYPE I VALUE 80,
      LEN TYPE I VALUE 0.SET PF-STATUS ‘SELECT’.WRITE: ‘Select a report and its list format:’,
      / ‘-------------------------------------’.SKIP.WRITE: 'Report ', NAME INPUT ON,
        / 'Line size ', WID INPUT ON,
        / ‘Page length’, LEN INPUT

ON.AT USER-COMMAND.CASE SY-UCOMM.WHEN ‘SELE’.READ LINE: 4 FIELD VALUE NAME,5 FIELD VALUE WID,6 FIELD VALUE LEN.SUBMIT (NAME) LINE-SIZE WID LINE-COUNT LEN AND
RETURN.ENDCASE.

將被調程式的輸出列表列印到spool system
SUBMIT… TO SAP-SPOOL.
可以將被調程式的輸出列表直接輸出到spool system,而不是顯示在螢幕上。
將輸出列表儲存到ABAP memory
可以使用EXPORTING LIST TO MEMORY選項將被調程式輸出列表儲存到ABAP記憶體中(而不是直接顯示在螢幕上),供被調程式執行完後,主調程式來使用輸出列表:
SUBMIT… AND RETURN EXPORTING LIST TO MEMORY.
將被調程式的輸出列表儲存到ABAP記憶體中,可以在被調程式執行完後,主調程式還可以訪問它。EXPORTING LIST TO MEMORY選項需要與AND RETURN選項一起使用。並且不能將EXPORTING LIST TO MEMORY選項與TO SAP-SPOOL選項一起使用。
輸出列表存到記憶體裡時,會以行型別為ABAPLIST的內表形式儲存,可以使用下面這幾個Function來訪問ABAP內在中儲存的輸出列表(這些函式都是屬於function group SLST):
LIST_FROM_MEMORY:從ABAP Memory中將ListsLoad到row type ABAPLIST的內表中
WRITE_LIST:將行型別為ABAPLIST 的內表中的內容插入到當前輸出列表中.
DISPLAY_LIST:將行型別為ABAPLIST 的內表中的內容顯示在獨立的list screen中
LIST_TO_ASCI:將行型別為ABAPLIST 的內表中的內容轉換ASCII形式
 
DATA list_tab TYPE TABLE OF abaplist.SUBMIT report EXPORTING LIST TO MEMORY
              AND RETURN."從ABAP記憶體中載入快取的LISTCALL FUNCTION ‘LIST_FROM_MEMORY’
  TABLES
    listobject = list_tab
  EXCEPTIONS
    not_found  = 1
    OTHERS     = 2."在當前螢幕中顯示上面載入的LISTIF sy-subrc = 0.
  CALL FUNCTION ‘WRITE_LIST’
    TABLES
      listobject = list_tab.ENDIF.
使用LEAVE語句退出被調程式
在通常情況下,我們在被調程式的基礎輸出列表(Level為0的List螢幕)按F3就會退出該程式。但是,在返回到主調程式之前,在被調程式裡需要執行更多的語句,比如需要使用EXPORT語句將被調程式中的資料儲存到ABAP memory中便於主調程式使用時,像這樣,你可以為Back Function自定義Function Code(不要使用預設的BACK,即要自己重寫預設的BACK Function
Code),並且在AT USER-COMMAND事件塊裡對相應的Function Code進行處理,當你將資料儲存起來之後,就可以使用LEAVE(因為重寫了預設的BACK Function Code,所以需要使用LEAVE語句來以程式設計方式退出程式)語句來退出當前被呼叫的程式了:
REPORT  ZJZJ1 NO STANDARD PAGE HEADING.DATA: ITAB TYPE I OCCURS 10,
NUM TYPE I.SUBMIT zjzj2 AND RETURN.
IMPORT ITAB FROM MEMORY ID ‘HK’.LOOP AT ITAB INTO NUM.
  WRITE / NUM.ENDLOOP.TOP-OF-PAGE.
  WRITE ‘Report 1’.
  ULINE.

注:不要將Function定義成預設的BACK了,否則不會被AT USER-COMMAND事件塊捕獲到,會使用預設的回退功能。
REPORT  ZJZJ2 NO STANDARD PAGE HEADING.DATA: NUMBER TYPE I,
ITAB TYPE I OCCURS 10.SET PF-STATUS ‘MYBACK’.DO 5 TIMES.
  NUMBER = SY-INDEX.
  APPEND NUMBER TO ITAB.
  WRITE / NUMBER.ENDDO.TOP-OF-PAGE.
  WRITE ‘Report 2’.
  ULINE.AT USER-COMMAND.
  CASE SY-UCOMM.
    WHEN ‘MBCK’.
     EXPORT ITAB TO MEMORY ID ‘HK’."退出前執行一些語句      LEAVE."離開當前被調程式,返回到主調程式
  ENDCASE.
CALL TRANSACTION、LEAVE TO TRANSACTION
二種方法呼叫Tcode:
1、 如果呼叫後不需要返回到主調程式,則可以使用下面這種方式:
LEAVE TO TRANSACTION |()[AND SKIP FIRST SCREEN].
該語句會結束當前主調程式去執行事務碼,並且會將主調程式從internal sessions中刪除,而被呼叫Tcode將會在該external session中新開一個internal session再執行,並且被調程式執行後,並不會回到主調程式呼叫處繼續往下執行,而是the system returns tothe area menu from which the original program in the call stack was started.
 
2、 如果呼叫後還要返回到主調程式,則使用下面這種方式:
CALL TRANSACTION |()  [AND SKIP FIRST SCREEN] [USING <bdc_tab >].
系統會重新開啟一個internal session,當被調程式結束後,被調Tcode所在的這個internal session會被delete掉,然後返回到主調程式呼叫處,繼續執行主調程式後面的語句
<bdc_tab>用在BDC呼叫輸入引數傳遞,具體請參考ABAP Practical Example App.docx文件
退出程式 Leave Program
LEAVE PROGRAM.
退出整個程式,並刪除所在內部會話、包括載入的程式、例項、資料。


本文來自 louisking111 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/louisking111/article/details/51197623?utm_source=copy