更新FM:LUW
CALL FUNCTION update_function IN UPDATE TASK,直到Commit Work 才运行
(注:debug隐式提交不会触发)。
主要用于本地更新(非远程RFC调用,如果是远程调用,则采用事务性RFC调用方式:IN BACKGROUND TASK)
update fm需要在属性中勾选“更新模块”
然后在程序中使用 call function in update task调用,此时不会立即执行函数,在执行到commit work时触发执行(注:debug隐式提交不会触发)。
update task不在当前dialog work process中执行,会在update work process中异步执行。dialog work process把修改数据写入簇表VBLOG中,update work process从表VBLOG中读取,把修改传入数据库。更新数据库成功后,update work process会在最后一步数据库修改操作完成后触发一次数据库commit,把vblog中的数据删掉;如果更新失败,会触发一次rollback,保留vblog中的数据,发送一条消息给sap用户。
注意:
在update task里不能使用commit work,否则会dump。
使用update task可以控制出错时多个update module同时回滚。
在update module中打断点是不会进去的,dump了也不会报出来,会把错误发到用户的收件箱。
查看错误的数据,使用tcode sm13查看update请求,双击进入error的项目,把光标定位在module上,点击"dsplay uodate data"可以看到具体错误的数据。
分步异步更新:先执行V1,再执行V2。可以在update work process不够用的情况下,优先执行V1
debug
SET UPDATE TASK LOCAL
执行了这句之后,call function in update task就不会提交到update work process,会在diaog work process执行(不管是否wait都会在当前session同步执行)。依旧在commit时触发,断点不再需要debug update就可以进入,如果是commit and wait ,那么执行完了就表示update function全部执行完了。
此时会保留update task的解锁功能
注:SET UPDATE TASK LOCAL只对一个luw起作用,且必须在第一个update task注册之前申明,即如果多次调用commit,就需要每次都在第一个update task之前申明SET UPDATE TASK LOCAL
2. RFC函数:远程调用
2.1. 同步
CALL FUNCTION func [DESTINATION dest] [?desti?nei??n]
(在DESTINATION不省略的情况下,且dest取值又不为SPACE,则函数一定要是RFC函数才能采用此方式进行远程同步调用)
2.2. 异步
CALL FUNCTION rfm_name STARTING NEW TASK [DESTINATION dest]taskname PERFORMING return_form ON END OF TASK
FORM return_form USING taskname.
...
RECEIVE RESULTS FROM FUNCTION rfm_name
...
ENDFORM.
等待多个异步调用的返回结果:WAIT UNTIL log_exp [UP TO sec SECONDS].
异步调用时不能有IMPORTING参数;函数一定要是RFC函数才能采用异步调用;只要有STARTING NEW TASK选项,即为异步调用;如果是异步调用同一目标端的RFC函数,则可以省略DESTINATION
2.2.1. 事务性RFC调用
实质上事务RFC调用也属于异步调用
CALL FUNCTION func IN BACKGROUND TASK [DESTINATION dest],并不立即执行,直到主调程序中的COMMIT WORK语句(隐式提交不要,一定要使用COMMIT WORK显示提交)才一次性执行多个远程函数调用
(函数一定要为RFC函数,且要通过Commit Work语句显示提交后,才会去执行,否则不会执行;如果是同一目标端的RFC函数,则可以省略DESTINATION)
2.3. DESTINATION 取值
l 目标NONE:当前程序所在应用服务器作为目标系统,但调用过程还是RFC远程方式来调用,这与SPACE是同的
l 目标SPACE: DESTINATION选项将会被忽略,被调功能函数将作为普通函数在本机调用
l 目标BACK:用于被远程调用的RFM程序内部的CALL FUNCTION语句中的目标指定,通过已建立的RFC连接反过来调用该函数的主调者系统中的其他功能模块(即主调程序—>远程系统中的RFM—>又回调主调程序所在系统中的其他函数)