用两种方式可以实现在一个program内部调用其它的ABAP program:
l 被调用的program是被inserted的,即目前的program停止运行,当被调用的program执行完毕后,当前的program继续执行。CALL FUNCTION… CALL TRANSACTION… SUBMIT <program> AND RETURN可以实现这种方式的调用。
l Calling program被interrupted,被调用的program被started。 SUBMIT <program> LEAVET TO TRANSACTION <t_code>是这种方式的调用。
SUBMIT和SUBMIT AND RETURN用来调用excutable program。CALL TRANSACTION和LEAVET TO TRANSACTION用来调用transactions。
Function module可以asynchronously call,通过addition STARTING NEW TASK <task name>来实现。Function module的异步调用与调用程序是平行运行的。可以在调用程序中通过RECEIVE RESULTS FROM FUNCTION来得到function module的运行结果。想使用STARTING NEW TASK的function module必须被标识为remote enable。
一个user session可以有多个external session(mode)。一个external session对应于一个SAP R/3 window。一个external session可以最多有20个internal session。一个程序运行在一个internal session中。Program data只有在program中是visible的。可以通过ABAP MEMORY和SAP MEMORY在不同的程序间传递data。一个user session有一个SAP MEMORY,这个user session的所有external session都可以访问他。SAP MEMORY用于存储变量值,其生命周期与user session一样。可以用SAP MEMORY中的值作为screen input fields的缺省值。由于user session的所有external session都可以访问SAP MEMORY,所以在external session的internal session之间传递值时应当使用ABAP MEMORY。
每个external session有自己的ABAP MEMORY,external session中的internal session都可以访问ABAP MEMORY中的值。ABAP MEMORY可以存储internal program的variable,可以用来在external session的internal session中传递数据。一旦external session结束相应的ABAP MEMORY也会被初始化。
在程序中调用function module时,function module所在的function group就会被加载到当前的internal session,当前的程序中断,function module处理完后,程序继续执行。一旦function group被加载,function group的全局变量就会一直存在在internal session中直到程序结束。这也意味着当调用这个function group的另外一个function module时,function group不需要再被加载。
CALL TRANSACTION SUBMIT AND RETURN运行在另外一个新的internal session中,被调用的program结束时,这个internal session就会被terminated,调用程序就会继续执行。被调用程序可以通过LEAVE PROGRAM来结束自己。
当使用SUBMIT调用程序时,当前的program就会被从internal session中removed,被调用的程序被load到当前的internal session。
LEAVE TO TRANSACTION会remove掉当前external session中的所有internal session,然后创建新的internal session来执行调用的transaction。同时ABAP MEMORY也会被initialized。
Asynchronously function module call会在当前的application server上新的opened的external session上执行。可以在调用程序上得到function module的运行结果(RECIEIVING RESULTS FROM FUNCTION)。
有五种方式可以实现程序间传递数据;
l 通过被调用程序的interface(subroutine,function module,dialog modules,standard selection screen of a report)
l 通过ABAP MEMORY
l 通过SAP MEMORY
l Database tables(EXPROT IMPORT)
l Presentation server(GUI_UPLOAD GUI_DOWNLOAD)或者application server(TRANSFER READ DATASET)上的文件
SUBROUTINE和FUNCTION MODULE可以通过INTERFACE来传递数据,standard selection screen程序可以通过下列方式来实行:
l 通过variant:SUBMIT addition USING SELECTION-SET
l 给selection-screen的input fields赋值
SUBMIT <program> [AND RETURN] [VIA SELECTION-SCREEN]
WITH <parameter> EQ <value>
WITH <sel_opt> <operator> <value> SIGN <s>
WITH <sel_opt> BETWEEN <value1> AND <value2> SIGN <s>
WITH <sel_opt> NOT BETWEEN <value1> AND <value2> SIGN <s>
WITH <sel_opt> IN <sel_tab>
通过EXPORT TO MEMORY ID <id>可以把程序中变量的值以data cluster的形式copy到ABAP memory中。<id>最长为13个字符是创建的data cluster的唯一标识。如果EXPROT有相同的memory id,原来的就会被overwrite。通过IMPORT FROM MEMORY ID <id>可以把data cluster中的值读到程序的变量中。Read和write程序的变量必须有相同的format。FREE MEMORY ID <id>可以删除对应的data cluster。FREE MEMORY则会初始化当前external session的ABAP MEMORY。通过IMPORT可以只读取data cluster的部分数据。
在object navigator中你可以定义PARAMETER ID(存储在表TPARA中),parameter ID不能超过20个字符。通过SET PARAMETE ID可以为当前user session的SAP MEMOORY的parameter设置值。可以在同一个user session中通过GET PARAMETER ID得到SAP MEMORY中parameter的值。也可以通过在screen field中输入值来设置SAP MEMORY中parameter的值。为了做到这点定义screen field的data element必须与相应的parameter联系起来。而且screen field的set parameter属性必须激活。反过来,screen field也可以取得SAP MEMORY中parameter的值,做到这点需要下面三个前提条件:
l 定义screen field的data element要与parameter id联系起来
l Screen field的GET function被激活。
l 程序只为screen field提供初始值。
这样program和screen就可以与SAP MEMORY交换数据了。可以通过screen field的f1 help->technical info直到screen field与那个parameter id有联系。
通过SAP MEMORY可以为screen field设置缺省值,如:
Carrid = ‘LH’.
SET PARAMETER ID ‘CAR’ FIELD carrid.
CALL TRANSACTION ‘TABC’ [AND SKIP FIRST SCREEN].
Function module和调用他的program在一个LUW中。通过SUBMIT AND RETURN,CALL TRANSACTION,SUBMIT,LEAVE TO TRANSACTION调用的program,运行在它们自己的LUW中,也就是说它们的CHANGE REQUEST有自己的update key。对于SUBMIT AND RETURN和CALL TRANSACTION调用的程序,在被调用的程序完成后,调用程序的LUW还会继续。调用和被调用程序的LUW是分开独立运行的,这样就会出现下面的情况:
l 直接的inline change会在screen改变时写到数据库中
l 对于update flag或PERFORM ON COMMIT在各自的LUW中需要一个COMMIT WORK
如果使用SUBMIT或LEVAE TO TRANSACTION,调用程序的LUW就会结束。Direct inline change在每次screen改变时会更新到数据库中。然而如果在调用程序之前你的update flag没有通过COMMIT WORK关闭,log table中的update request就被会被update work process执行。对于PERFORM ON COMMIT也是这样。
如果transaction是通过call transaction调用的,可以在没有user dialog的情况下执行transaction。这种情况下你需要通过using addition传入一个batch input format internal table并且指定MODE参数为‘N’。另外MODE还可以设置为’A’或’E’。通过参数UPDATE可以改变transaction更新数据的方式。默认情况下为’A’(asynchronous),还可以是S(synchronous)和L(local)。如果UPDATE=’S’,只有被调用的transaction的update完成后,调用程序的LUW才能继续。如果被调用transaction的update成功,sy-subrc就会返回0。通过UPDATE=’S’可以实现只有被调用事务的更新成功后才能进行后续处理。
通过CALL FUNCTION ‘ABC’ IN NEW TASK ‘T1’异步调用的function module运行在单独的SAP LUW中。Calling program的处理会暂时停止,直到function module被触发。也就是说registered update flag和PERFORM ON COMMIT仍然被保留。Asynchronous function call会激发implicitly database commit,也就是说在此时inline changes会写入到数据库中。
如果一个data record有类型为E的lock,程序本身以及synchronous调用的function module所在的function group可以访问这条记录。Original lock的cumulative counter会被加1。通过SUBMINT AND RETURN和CALL TRANSACTION调用的程序不能在这条记录上再设置lock。通过SUBMIT和LEAVET TO TRANSACTION调用程序时,调用程序被终止,相应的locks也会被删除掉。Calling program和called program之间便不会存在lock conflict。同一个用户的不同external session的lock request与不同用户的user session的lock request的处理方式一样。
SUBMIT AND RETURN和CALL TRANSACTION有自己的SAP LUW,可以通过它们实现nested SAP LUW。Asynchronous function module call可以实现处理同时运行。使用异步function module调用的场景:
你希望在另外一个external session中显示相关的数据,异步调用一个function module,function module中通过call transaction来调用程序,通过function module的interface来传递相关数据。在调用transaction之前可以把相应的数据写入到SAP MEMORY中。