您的位置:首页 > 数据库

SAP 高级应用开发 学习笔记 1 -- RFC NO.6

2009-11-12 15:19 507 查看
 

事务性RFC方式的RFM调用
l        同步、异步RFC过程中,每一个RFC调用在远程系统中构成一个独立的LUW
l        事务性RFC调用,可以将多个逻辑上相关的远程调用绑定至同一个LUW上,在该LUW内,按顺序调用,要么执行所有数据库操作,要么完全回滚来取消全部数据库更新操作,保证RFC调用过程的完整性和数据一致性
l        事务性RFC调用处理保证在程序到达COMMIT WORK语句时执行所有计划的更新,并保证事务性RFC调用仅运行一次
l        该调用具有安全、可靠的特点
             
CALL FUNCTION rfm_name

IN BACKGROUND TASK

[DESTINATION dest]

[EXPORTING   p1 = a1 ... pn = an ... ]

[TABLES      t1 = itab1 ... tn = itabn ... ]

[AS SEPARATE UNIT].

CALL FUNCTION rfm_name

IN BACKGROUND UNIT oref

[EXPORTING   p1 = a1 ... pn = an ... ]

[TABLES      t1 = itab1 ... tn = itabn ... ].
    
   其中oref必须引用一个接口IF_BGRFC_UNIT实现类的对象
l        在相邻两个COMMIT WORK之间出现的所有相同目标的异步调用都属于同一个LUW
l        事务性RFC不需要等待每个单独的更新过程完成,调用程序就可以立即继续进行,知道事务结束
l        若调用发送时,远程系统不可用,调用将设为后台作业运行,不能从调用模块接收返回结果,不允许调用者进行与远程系统的交互性对话及测试
 
调用参数
l        不能直接或通过RECEIVE RESULTS FROM FUNCTION语句接收RFM的返回结果,FM的接口不应指定任何EXPORT类型参数,在CALL FUNCTION语句中的IMPORTING参数将导致编译错误
l        事务性运行的功能模块中不适合进行回调(调用远程目标BACK)
l        事务性RFC调用示例
 
CALL FUNCTION 'TRAVEL_BOOK_REMOTE'

IN BACKGROUND TASK

DESTINATION 'GSE'

EXPORTING

FLIGHT     = sflight

CUSTOMERID = customer.

…

COMMIT  WORK.

l        直到COMMIT WORK 语句才开始于远程系统进行联系
l        TRAVEL_BOOK_REMOTE是一个适合进行事务性RFC调用的RFM,只进行远程系统中的数据库更新,不需要返回任何数据
 
事务ID
l        每一个事务性RFC调用均通过一个独特的事物ID(Transactional ID,TID)
l        TID存在于数据库表ARFCSSTATE和ARFCSDATA,ARFCSSTATE记录LUW执行状态,ARFCSDATA包含事务性RFC调用的输入数据
l        作业执行过程中,从事务性RFC表中读取相关数据,与相应的事务性RFC进行通信,远程LUW成功执行,则相应的条目在表中删除,因此,若LUW运行成功,则无法重新执行因而保证了仅仅执行一次
l        若COMMIT WORK同时触发了本地更新操作,则事务性RFC调用在本地更新成功完成之后才开始运行
 
设定作业开始时间
l        如果希望在特定时间启动LUW,可以通过功能模块START_OF_BACKGROUPTASK设置作业开始的时间,必须在LUW内部调用该功能模块,必须在第一个CALL…IN BACKGROUNDTASK语句之后和COMMIT WORK语句之前调用该功能模块
l        对于某个调用需要创建独立的事务,不参与其他目标的事务性RFC调用作何至一个LUW,可以通过AS SEPARATE UNTIAL附加项实现
l        各个LUW处理都是独立进行的,执行次序无法被保证
 
出错处理机制
l        发生错误,事务性RFC调用将启动重试机制或者回滚
l        通过COMMIT WORK执行远程调用时,不能建立到目标系统的连接,将在ARFCSSTATE表中记录当前状态,系统通过报表RSARFCSE根据当前的TID重新计划后台作业,准备进行下一次调用。
l        默认时间间隔15分钟,尝试至30次为止
l        Tools-Administraion-Administraion-Network-RFCdestinations-Destination-TRFC options进行尝试次数、时间间隔设定
l        若经过最大尝试次数,系统仍然无法连接,系统将停止调用报表RSARFCSE,将ARFCSDATA状态更新为CPICERR,默认8天,将表中的响应条目删除,SM59可以手动启动该条目
l        执行出错,A类型的消息或者RAISE语句抛出异常,则ARFCSSTATE表将记录出错状态,整个RFC中的操作将取消, SM58查看该错误,修改错误后,通过SM58重新启动出错的RFM
l        在RFM中,功能模块RESTART_OF_BACKGROUNDTASK启动重试功能
 
检查事务性RFC调用状态:
每个LUW都用过唯一的TID进行标识,两种方法检查TID状态:
l        ABAP程序:在CALL… IN BACKGROUND TASK之后和COMMIT WORK之前调用FM“ID_OF_BACKGROUNDTASK”,获得TID后,用FM“STATUS_OF_BACKGROUNDTASK”确定事务性RFC的状态
CALL FUNCTION 'TRAVEL_BOOK_REMOTE'

IN BACKGROUND TASK

DESTINATION 'GSE'

EXPORTING

FLIGHT     = sflight

CUSTOMERID = customer.

...

CALL FUNCTION 'ID_OF_BACKGROUNDTASK'

IMPORTING TASK-ID = tid.

...

CALL FUNCTION 'STATUS_OF_BACKGROUNDTASK'

EXPORTING

TID      = tid

IMPORTING

ERRORTAB = errtab

EXCEPTIONS

COMMUNICTATION = 01 "Connection not available: will try again later

RECORDED       = 02 "ARFC is scheduled

ROLLBACK       = 03 "Rollback triggered in target system

...

COMMIT WORK.
    
l        联机确认:通过SM58显示并维护事务性RFC的LUW状态
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息