如何用VBA调用RFC_CALL_TRANSACTION_USING将SAP事务输出存到假脱机?
问题描述
我尝试使用RFC_CALL_TRANSACTION_USING让SAP ERP执行事务代码FTE_BSM,并将报表结果输出保存到假脱机,最终希望该方案适用于所有可输出到假脱机的事务代码。
SAP连接的VBA代码
If iConnectionStatus <> 1 Then Set ObjR3 = CreateObject("SAP.Functions") Set ObjR3_Connection = ObjR3.Connection With ObjR3_Connection .System = SAP_SystemID .SystemNumber = SAP_SystemNumber .ApplicationServer = SAP_ApplicationServer .Client = SAP_Client .USER = Environ("Username") .password = UserPassword_Temp ' .Language = SAP_Language End With If ObjR3.Connection.Logon(1, False) <> True Then GoTo LogInFailed Exit Sub End If ObjR3_Connection.RFCWithDialog = 1 Call GetIDFromSAP End If
调用RFC函数模块的VBA代码
Dim aExecutionMap As Variant aExecutionMap = ws_map_FTE_BSM.Range("mask_FTE_BSM").Value Set ObjR3_Call_RFC_Transaction = ObjR3.Add("RFC_CALL_TRANSACTION_USING") '定义SAP内部表 With ObjR3_Call_RFC_Transaction .Exports("TCODE") = sReportName .Exports("MODE") = sMode Set ObjR3_Call_RFC_Para = .Tables("BT_DATA") Set ObjR3_Call_RFC_Errors = .Tables("L_ERRORS") End With '加载参数映射 r = 0 For i = LBound(aExecutionMap, 1) To UBound(aExecutionMap, 1) r = r + 1 ObjR3_Call_RFC_Para.AppendRow c = 0 For f = LBound(aExecutionMap, 2) To UBound(aExecutionMap, 2) c = c + 1 ObjR3_Call_RFC_Para(r, c) = aExecutionMap(i, f) Next f Next i CallResult = False CallResult = ObjR3_Call_RFC_Transaction.Call
SHDB录制的参数
aExecutionMap是从Excel命名区域加载的数组,包含通过SAP事务SHDB录制的BT_DATA表参数行。我分别在模拟后台模式开启和关闭的情况下录制了两次事务,但效果无差异。
模拟后台模式开启时的参数
| Program | Dynpro | DynBegin | FNam | FVal |
|---|---|---|---|---|
| RFEBKAMON01 | 1000 | X | ||
| 0000 | BDC_OKCODE | =/BDA | ||
| 0000 | S_BUKRS-LOW | 0105 | ||
| 0000 | P_STDAT | 2020.11.30 | ||
| 0000 | P_VARI | /STATMONI | ||
| SAPMSSY0 | 0120 | X | ||
| 0000 | BDC_OKCODE | =&RNT |
模拟后台模式关闭时的参数
| Program | Dynpro | DynBegin | FNam | FVal |
|---|---|---|---|---|
| RFEBKAMON01 | 1000 | X | ||
| 0000 | BDC_OKCODE | =/BDA | ||
| 0000 | S_BUKRS-LOW | 0105 | ||
| 0000 | P_STDAT | 2020.11.30 | ||
| 0000 | P_VARI | /STATMONI | ||
| SAPLSPRI | 0100 | X | ||
| 0000 | BDC_OKCODE | =PRIN | ||
| 0000 | RADIO0500_1 | X | ||
| 0000 | PRI_PARAMS-PRCOP | 1 | ||
| 0000 | BDC_SUBSCR | SAPLSPRI 0600SUBSCREEN |
错误情况
CallResult返回True,说明Excel与SAP通信正常,但未生成假脱机作业且报错。无论使用.Exports("MODE") = "N"、"E"还是"A"模式,均触发以下错误:
错误信息一
| TCODE | DYNAME | DYNUMB | MSGTYP | MSGSPRA | MSGID | MSGNR | MSGV1 |
|---|---|---|---|---|---|---|---|
| FTE_BSM | RFEBKAMON01 | 1010 | A | E | 00 | 341 | RAISE_EXCEPTION |
错误信息二
| TCODE | DYNAME | DYNUMB | MSGTYP | MSGSPRA | MSGID | MSGNR | MSGV1 |
|---|---|---|---|---|---|---|---|
| FTE_BSM | SAPMSSY0 | 1000 | A | E | 00 | 341 | DYNPRO_SEND_IN_BACKGROUND |
ST22错误详情
- 使用"N"模式时:
RAISE_EXCEPTION CL_GUI_CUSTOM_CONTAINER=======CP
- 使用"E"或"A"模式时:
DYNPRO_SEND_IN_BACKGROUND CX_SY_SEND_DYNPRO_NO_RECEIVER RFEBKAMON01
求助
如何通过RFC_CALL_TRANSACTION_USING运行SAP事务并将结果保存到假脱机?
解决方案
核心问题分析
报错根源在于:
- 事务
FTE_BSM对应的程序RFEBKAMON01依赖GUI容器组件,后台模式(N)或RFC调用场景下无GUI环境,触发异常; - 录制的BDC未正确适配后台假脱机流程,且RFC调用的对话框设置与模式不匹配。
具体修正步骤
重新录制符合后台要求的BDC
- 必须在SHDB的“模拟后台模式”开启状态下录制:
- 执行
FTE_BSM输入选择条件后,通过菜单系统 → 列表 → 保存 → 假脱机触发打印参数界面; - 在打印参数页,明确设置假脱机输出的各项参数(打印机、所有者、文本描述等),确认后完成录制;
- 执行
- 全程避免任何GUI专属操作(如拖拽、弹窗交互),确保BDC步骤仅包含后台可执行的输入。
- 必须在SHDB的“模拟后台模式”开启状态下录制:
调整RFC调用参数
- 固定使用
MODE = "N"(后台模式),"A"或"E"模式需要GUI交互,RFC场景无法支持; - 将
ObjR3_Connection.RFCWithDialog = 0,禁止RFC过程中弹出SAP对话框,否则会触发DYNPRO_SEND_IN_BACKGROUND错误。
- 固定使用
补充完整的假脱机参数BDC行
后台打印必须传递标准假脱机参数,录制的BDC需包含以下关键项(示例):Program Dynpro DynBegin FNam FVal SAPLSPRI 0100 X 0000 BDC_OKCODE =PRIN 0000 PRI_PARAMS-PDEST LP01 0000 PRI_PARAMS-PRCOP 1 0000 PRI_PARAMS-PRONAM YOUR_USER 0000 PRI_PARAMS-PRTXT FTE_BSM报表 处理GUI依赖的替代方案
如果FTE_BSM确实无法在后台执行,可采用以下方案:- 开发自定义RFC函数,直接调用事务对应的后台报表程序,通过
SUBMIT ... TO SAP-SPOOL语句指定假脱机参数; - 使用
RSBDCSUB将BDC提交为SAP后台作业,后台作业运行时拥有独立的假脱机处理环境,避免GUI依赖问题。
- 开发自定义RFC函数,直接调用事务对应的后台报表程序,通过
通用适配规则(适用于所有可假脱机事务)
- 统一在SHDB后台模拟模式下录制BDC,确保步骤兼容后台执行;
- 录制时通过标准后台假脱机路径触发打印,避免GUI弹窗操作;
- RFC调用固定使用
MODE = "N",并关闭RFC对话框选项; - BDC中必须包含完整的假脱机参数,不依赖系统默认值。
内容的提问来源于stack exchange,提问作者Tyro
相关产品推荐
相关产品推荐

