我尝试使用RFC_CALL_TRANSACTION_USING
让SAP ERP软件运行事务代码FTE_BSM
,并将报告结果打印到假脱机。我尝试使用的事务是FTE_BSM
,但最终我希望能够将其与任何可以将输出打印到假脱机的事务代码一起使用。
我可以使用以下代码连接到SAP:
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功能模块:
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")
'Define SAP interal Tables
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
'Load Map
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
aExecutionMap是一个数组,它是从一个命名的表范围中加载的,该表范围包含使用SAP的事务SHDB
记录的BT_DATA
表参数的行。我记录了两次事务,一次是在“模拟后台模式”打开的情况下,一次是在它关闭的情况下。这似乎没有什么区别。
在“Simulate Background Mode”(模拟后台模式)打开时,该表为:
请注意,空单元格意味着该字段为空。而且,日期的格式与对话框用户输入的格式相同。为了调试,我遍历了BT_DATA
表以仔细检查参数。参数如下所示:
| 项目|丁普罗|动力开始|财务名称|F值|
| - -|- -|- -|- -|- -|
| RFEBKAMON 01参考文献|千|X轴|||
| | 千||BDC_确定代码|=/百达|
| | 千||S_缓冲器-低|小行星0105|
| | 千||P_标准日期|二零二零年十一月三十日|
| | 千||P_瓦里|/STATMONI公司|
| SAPMSSY 0系统|小行星0120| X轴|||
| | 千||BDC_确定代码|=&RNT|
在“Simulate Background Mode”(模拟后台模式)关闭时,该表为:
发送以构建BT_DATA
表的参数如下:
| 项目|丁普罗|动力开始|财务名称|F值|
| - -|- -|- -|- -|- -|
| RFEBKAMON 01参考文献|千|X轴|||
| | 千||BDC_确定代码|=/百达|
| | 千||S_缓冲器-低|小行星0105|
| | 千||P_标准日期|二零二零年十一月三十日|
| | 千||P_瓦里|/STATMONI公司|
| 萨普里|0100年|X轴|||
| | 千||BDC_确定代码|=打印|
| | 千||无线电0500_1|X轴|
| | 千||主参数-PRCOP|一个|
| | 千||BDC_订阅SCR|SAPLSPRI 0600SUBSCREEN
|
我确实在CallResult上得到了True结果,所以很明显我确实让Excel与SAP通信,但是,我也确实得到了错误,并且从未创建spooljob。
无论使用.Exports("MODE") = "N"
、.Exports("MODE") = "E"
还是.Exports("MODE") = "A"
运行事务,我总是收到错误:
我得到的错误是:
| T代码|代名|动态麻木|消息类型|消息SPRA|消息标识|消息|消息V1|
| - -|- -|- -|- -|- -|- -|- -|- -|
| 全职员工_BSM| RFEBKAMON 01参考文献|小行星|A级|E级|00分|三百四十一|升高_异常|
或:
| T代码|代名|动态麻木|消息类型|消息SPRA|消息标识|消息|消息V1|
| - -|- -|- -|- -|- -|- -|- -|- ------|
| 全职员工_BSM| SAPMSSY 0系统|千|A级|E级|00分|三百四十一|DYNPRO_发送_输入_背景|
检查ST 22中的错误,如果在“N”模式下运行,则显示“RAISE_EXCEPTION CL_GUI_CUSTOM_CONTAINER=======CP”;如果在“E”或“A”模式下运行,则显示“DYNPRO_SEND_IN_BACKGROUND CX_SY_SEND_DYNPRO_NO_RECEIVER RFEBKAMON 01”。
有人知道我做错了什么吗?或者说:是否有人可以提供一个工作示例,说明如何使用RFC_CALL_TRANSACTION_USING
运行SAP事务并将结果保存到假脱机中,以便我进行分析并从中学习?
1条答案
按热度按时间tzxcd3kk1#
这里有三个大问题,每个问题都应该单独提出,以便获得详细的答案:
FTE_BSM
的工作原理(SAP ERP的交易代码部分,即SAP R/3、SAP ECC、S/4 HANA版本)我解释了更多关于
FTE_BSM
是如何工作的,以及如何通过Batch Input运行它。我无法深入了解Batch Input是如何工作的,以及如何通过RFC提取spool数据,如果你需要更多关于这两个的帮助,请问另一个问题。您正在通过Excel VBA和SAP GUI for Windows中包含的RFC客户端(用于显示Dynpro屏幕)运行功能模块
RFC_CALL_TRANSACTION_USING
,但您的问题仅是由于传递给参数BT_DATA
的自动化数据,该参数特定于事务代码FTE_BSM
。所谓的交易代码都运行(99%)采用Dynpro技术/ ABAP,因此通常可以使用事务记录器记录用户操作(交易代码
SHDB
),并使用功能模块RFC_CALL_TRANSACTION_USING
,更具体地说,使用底层ABAP语句CALL TRANSACTION ... USING ...
进行操作。这种UI自动化被正式称为Batch Input。根据每个交易代码中的确切Dynpro和ABAP逻辑,存在许多限制。您需要对Dynpro和ABAP有良好的了解,才能理解所有细微之处。在交易记录器中,“模拟后台模式”选项用于模拟在后台运行的交易代码,从技术上讲,它设置了系统字段(环境变量的种类)
sy-batch = 'X'
,ABAP代码可能会或可能不会考虑此字段来显示屏幕,以便允许批量输入。如果在使用“模拟后台模式”时完成记录,必须使用也模拟背景模式的适当模式来播放该记录:| 模式|sy-batch =“”|sy-batch = 'X'(“模拟后台”)|
| - -|- -|- -|
| 无屏幕|不|Q值|
| 显示从错误开始的屏幕|E级|高|
| 显示所有屏幕|A级|D级|
当用户运行
FTE_BSM
而不使用自动化时,会出现以下屏幕:SP01
查看假脱机数据:x1c4d 1x指令集
如果通过事务记录器记录用户操作,我将获得
BT_DATA
的以下值:指令集
sy-batch = 'X'
,并将数据显示为“ABAP列表”(字符显示),而不是网格视图(图形显示):BDC_OKCODE =%PRI
)如果您使用以下命令,则可以进行批量输入:
MODE = 'Q'
(Q
与N
相同,但它设置sy-batch = 'X'
)BT_DATA
包含与后台模拟模式相关的上述记录L_ERRORS
将包含一行假脱机请求编号;消息编号SY 355
是“创建了假脱机请求(编号&1),但没有立即输出”,其中假脱机请求编号在字段MSGV1
中:|总编码|代名|动态麻木|消息类型|消息SPRA|消息标识|消息|消息V1||--|--|--|--|--|--|--|--|--|--|--||全职员工_BSM|萨普里|0100年|一个|E级|压力变送器|小零四四|X_65_1024/四号||全职员工_BSM|SAPMSSY 0系统|小行星0120|标准|E级|SY系列|三百五十五|第0000907758号|您需要运行其他支持RFC的函数模块来提取假脱机数据。我建议使用XBP,因为BAPI是官方支持的API =函数模块
BAPI_XMI_LOGON
,带有参数INTERFACE = 'XBP'
、BAPI_XBP_JOB_SPOOLLIST_READ
和BAPI_XMI_LOGOFF
。虽然您的问题与ABAP无关,但我在此提供一个适用于ABAP的示例: