Complex LUW processing

<!--左侧开始-->

Complex LUW processing

用两种方式可以实现在一个program内部调用其它的ABAP program

l 被调用的program是被inserted的,即目前的program停止运行,当被调用的program执行完毕后,当前的program继续执行。CALL FUNCTION CALL TRANSACTION SUBMIT <program> AND RETURN可以实现这种方式的调用。

l Calling programinterrupted,被调用的programstarted SUBMIT <program> LEAVET TO TRANSACTION <t_code>是这种方式的调用。

SUBMITSUBMIT AND RETURN用来调用excutable programCALL TRANSACTIONLEAVET TO TRANSACTION用来调用transactions

Function module可以asynchronously call,通过addition STARTING NEW TASK <task name>来实现。Function module的异步调用与调用程序是平行运行的。可以在调用程序中通过RECEIVE RESULTS FROM FUNCTION来得到function module的运行结果。想使用STARTING NEW TASKfunction module必须被标识为remote enable

一个user session可以有多个external session(mode)。一个external session对应于一个SAP R/3 window。一个external session可以最多有20internal session。一个程序运行在一个internal session中。Program data只有在program中是visible的。可以通过ABAP MEMORYSAP 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 sessioninternal session之间传递值时应当使用ABAP MEMORY

每个external session有自己的ABAP MEMORYexternal session中的internal session都可以访问ABAP MEMORY中的值。ABAP MEMORY可以存储internal programvariable,可以用来在external sessioninternal 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 sessionremoved,被调用的程序被load到当前的internal session

LEAVE TO TRANSACTIONremove掉当前external session中的所有internal session,然后创建新的internal session来执行调用的transaction。同时ABAP MEMORY也会被initialized

Asynchronously function module call会在当前的application server上新的openedexternal session上执行。可以在调用程序上得到function module的运行结果(RECIEIVING RESULTS FROM FUNCTION)。

有五种方式可以实现程序间传递数据;

l 通过被调用程序的interfacesubroutinefunction moduledialog modulesstandard selection screen of a report

l 通过ABAP MEMORY

l 通过SAP MEMORY

l Database tablesEXPROT IMPORT

l Presentation serverGUI_UPLOAD GUI_DOWNLOAD)或者application server(TRANSFER READ DATASET)上的文件

SUBROUTINEFUNCTION MODULE可以通过INTERFACE来传递数据,standard selection screen程序可以通过下列方式来实行:

l 通过variantSUBMIT addition USING SELECTION-SET

l selection-screeninput 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的形式copyABAP memory中。<id>最长为13个字符是创建的data cluster的唯一标识。如果EXPROT有相同的memory id,原来的就会被overwrite。通过IMPORT FROM MEMORY ID <id>可以把data cluster中的值读到程序的变量中。Readwrite程序的变量必须有相同的formatFREE MEMORY ID <id>可以删除对应的data clusterFREE MEMORY则会初始化当前external sessionABAP MEMORY。通过IMPORT可以只读取data cluster的部分数据。

object navigator中你可以定义PARAMETER ID(存储在表TPARA)parameter ID不能超过20个字符。通过SET PARAMETE ID可以为当前user sessionSAP MEMOORYparameter设置值。可以在同一个user session中通过GET PARAMETER ID得到SAP MEMORYparameter的值。也可以通过在screen field中输入值来设置SAP MEMORYparameter的值。为了做到这点定义screen fielddata element必须与相应的parameter联系起来。而且screen fieldset parameter属性必须激活。反过来,screen field也可以取得SAP MEMORYparameter的值,做到这点需要下面三个前提条件:

l 定义screen fielddata element要与parameter id联系起来

l Screen fieldGET function被激活。

l 程序只为screen field提供初始值。

这样programscreen就可以与SAP MEMORY交换数据了。可以通过screen fieldf1 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 RETURNCALL TRANSACTION调用的程序,在被调用的程序完成后,调用程序的LUW还会继续。调用和被调用程序的LUW是分开独立运行的,这样就会出现下面的情况:

l 直接的inline change会在screen改变时写到数据库中

l 对于update flagPERFORM ON COMMIT在各自的LUW中需要一个COMMIT WORK

如果使用SUBMITLEVAE 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还可以设置为AE。通过参数UPDATE可以改变transaction更新数据的方式。默认情况下为Aasynchronous),还可以是S(synchronous)Llocal)。如果UPDATE=S,只有被调用的transactionupdate完成后,调用程序的LUW才能继续。如果被调用transactionupdate成功,sy-subrc就会返回0。通过UPDATE=S可以实现只有被调用事务的更新成功后才能进行后续处理。

通过CALL FUNCTION ABC IN NEW TASK T1异步调用的function module运行在单独的SAP LUW中。Calling program的处理会暂时停止,直到function module被触发。也就是说registered update flagPERFORM ON COMMIT仍然被保留。Asynchronous function call会激发implicitly database commit,也就是说在此时inline changes会写入到数据库中。

如果一个data record有类型为Elock,程序本身以及synchronous调用的function module所在的function group可以访问这条记录。Original lockcumulative counter会被加1。通过SUBMINT AND RETURNCALL TRANSACTION调用的程序不能在这条记录上再设置lock。通过SUBMITLEAVET TO TRANSACTION调用程序时,调用程序被终止,相应的locks也会被删除掉。Calling programcalled program之间便不会存在lock conflict。同一个用户的不同external sessionlock request与不同用户的user sessionlock request的处理方式一样。

SUBMIT AND RETURNCALL TRANSACTION有自己的SAP LUW,可以通过它们实现nested SAP LUWAsynchronous function module call可以实现处理同时运行。使用异步function module调用的场景:

你希望在另外一个external session中显示相关的数据,异步调用一个function modulefunction module中通过call transaction来调用程序,通过function moduleinterface来传递相关数据。在调用transaction之前可以把相应的数据写入到SAP MEMORY中。

几种程序调用方式的比较列表:

Call

Data

SAP LUW

Suitable for

CALL FUNCTION

Own

Same

Display data

Data change(within the same SAP LUW)

SUBMIT AND RETURN

CALL TRANSACTION

Own

Own

Display data

Data change(in different LUWs)

CALL FUNCTIONSTARTING NEW TASK

Own

Own

Parallel tasks

<!-- You can follow any responses to this entry through the <a href="http://scnblogs.techweb.com.cn/abaplv/archives/176.html/feed" mce_href="http://scnblogs.techweb.com.cn/abaplv/archives/176.html/feed">RSS 2.0</a> feed. -->Trackback: http://scnblogs.techweb.com.cn/abaplv/archives/176.html/trackback

你可能感兴趣的:(process)