You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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表参数行。我分别在模拟后台模式开启和关闭的情况下录制了两次事务,但效果无差异。

模拟后台模式开启时的参数

ProgramDynproDynBeginFNamFVal
RFEBKAMON011000X
0000BDC_OKCODE=/BDA
0000S_BUKRS-LOW0105
0000P_STDAT2020.11.30
0000P_VARI/STATMONI
SAPMSSY00120X
0000BDC_OKCODE=&RNT

模拟后台模式关闭时的参数

ProgramDynproDynBeginFNamFVal
RFEBKAMON011000X
0000BDC_OKCODE=/BDA
0000S_BUKRS-LOW0105
0000P_STDAT2020.11.30
0000P_VARI/STATMONI
SAPLSPRI0100X
0000BDC_OKCODE=PRIN
0000RADIO0500_1X
0000PRI_PARAMS-PRCOP1
0000BDC_SUBSCRSAPLSPRI 0600SUBSCREEN

错误情况

CallResult返回True,说明Excel与SAP通信正常,但未生成假脱机作业且报错。无论使用.Exports("MODE") = "N"、"E"还是"A"模式,均触发以下错误:

错误信息一

TCODEDYNAMEDYNUMBMSGTYPMSGSPRAMSGIDMSGNRMSGV1
FTE_BSMRFEBKAMON011010AE00341RAISE_EXCEPTION

错误信息二

TCODEDYNAMEDYNUMBMSGTYPMSGSPRAMSGIDMSGNRMSGV1
FTE_BSMSAPMSSY01000AE00341DYNPRO_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事务并将结果保存到假脱机?


解决方案

核心问题分析

报错根源在于:

  1. 事务FTE_BSM对应的程序RFEBKAMON01依赖GUI容器组件,后台模式(N)或RFC调用场景下无GUI环境,触发异常;
  2. 录制的BDC未正确适配后台假脱机流程,且RFC调用的对话框设置与模式不匹配。

具体修正步骤

  1. 重新录制符合后台要求的BDC

    • 必须在SHDB的“模拟后台模式”开启状态下录制:
      1. 执行FTE_BSM输入选择条件后,通过菜单系统 → 列表 → 保存 → 假脱机触发打印参数界面;
      2. 在打印参数页,明确设置假脱机输出的各项参数(打印机、所有者、文本描述等),确认后完成录制;
    • 全程避免任何GUI专属操作(如拖拽、弹窗交互),确保BDC步骤仅包含后台可执行的输入。
  2. 调整RFC调用参数

    • 固定使用MODE = "N"(后台模式),"A"或"E"模式需要GUI交互,RFC场景无法支持;
    • 将ObjR3_Connection.RFCWithDialog = 0,禁止RFC过程中弹出SAP对话框,否则会触发DYNPRO_SEND_IN_BACKGROUND错误。
  3. 补充完整的假脱机参数BDC行
    后台打印必须传递标准假脱机参数,录制的BDC需包含以下关键项(示例):

    ProgramDynproDynBeginFNamFVal
    SAPLSPRI0100X
    0000BDC_OKCODE=PRIN
    0000PRI_PARAMS-PDESTLP01
    0000PRI_PARAMS-PRCOP1
    0000PRI_PARAMS-PRONAMYOUR_USER
    0000PRI_PARAMS-PRTXTFTE_BSM报表
  4. 处理GUI依赖的替代方案
    如果FTE_BSM确实无法在后台执行,可采用以下方案:

    • 开发自定义RFC函数,直接调用事务对应的后台报表程序,通过SUBMIT ... TO SAP-SPOOL语句指定假脱机参数;
    • 使用RSBDCSUB将BDC提交为SAP后台作业,后台作业运行时拥有独立的假脱机处理环境,避免GUI依赖问题。

通用适配规则(适用于所有可假脱机事务)

  1. 统一在SHDB后台模拟模式下录制BDC,确保步骤兼容后台执行;
  2. 录制时通过标准后台假脱机路径触发打印,避免GUI弹窗操作;
  3. RFC调用固定使用MODE = "N",并关闭RFC对话框选项;
  4. BDC中必须包含完整的假脱机参数,不依赖系统默认值。

内容的提问来源于stack exchange,提问作者Tyro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:25:12