excel 使用VBA打印到假脱机的RFC_CALL_TRANSACTION_USING工作示例

k2fxgqgv  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(169)

我尝试使用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事务并将结果保存到假脱机中,以便我进行分析并从中学习?

tzxcd3kk

tzxcd3kk1#

这里有三个大问题,每个问题都应该单独提出,以便获得详细的答案:

  • 批输入的工作原理
  • FTE_BSM的工作原理(SAP ERP的交易代码部分,即SAP R/3、SAP ECC、S/4 HANA版本)
  • 如何通过RFC提取假脱机数据

我解释了更多关于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而不使用自动化时,会出现以下屏幕:

  • 第一个屏幕是经典的选择屏幕(屏幕RFEBKAMON 01 1000):

  • 下一个屏幕使用ALV Grid视图显示数据(屏幕RFEBKAMON 01 1010):

  • 如果用户点击“打印”按钮,将显示一个屏幕,以选择打印选项(屏幕SAPLSPRI 0100):

  • 然后创建包含ALV数据的假脱机请求:

  • 用户可以通过运行交易代码SP01查看假脱机数据:

x1c4d 1x指令集
如果通过事务记录器记录用户操作,我将获得BT_DATA的以下值:

  • 不模拟背景:

  • 我们可以看到,单击ALV网格视图上方的“打印”按钮未被记录(应在6之前插入)。这是因为ALV网格视图及其上方的工具栏控件是SAP GUI控制框架的一部分,事务记录器和批处理输入不支持该框架。
  • 通过模拟背景:


指令集

  • 我们可以看到,ALV网格视图未显示,而是显示字母数字,这是因为ALV框架检测到sy-batch = 'X',并将数据显示为“ABAP列表”(字符显示),而不是网格视图(图形显示):

  • 我们可以看到ABAP列表对应于屏幕SAPMSSY 0 0120。
  • 我们可以看到ABAP列表屏幕中的“打印”被记录(BDC_OKCODE =%PRI

如果您使用以下命令,则可以进行批量输入:

  • 参数MODE = 'Q'QN相同,但它设置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_READBAPI_XMI_LOGOFF
虽然您的问题与ABAP无关,但我在此提供一个适用于ABAP的示例:

REPORT.
DATA(tbl) = VALUE bdcdata_tab(
  ( program = 'RFEBKAMON01' dynpro = '1000' dynbegin = 'X' fnam = '' fval = '' )
  ( program = '' dynpro = '0000' dynbegin = '' fnam = 'BDC_OKCODE' fval = 'ONLI' )
  ( program = 'SAPMSSY0' dynpro = '0120' dynbegin = 'X' fnam = '' fval = '' )
  ( program = '' dynpro = '0000' dynbegin = '' fnam = 'BDC_OKCODE' fval = '=%PRI' )
  ( program = 'SAPLSPRI' dynpro = '0100' dynbegin = 'X' fnam = '' fval = '' )
  ( program = '' dynpro = '0000' dynbegin = '' fnam = 'BDC_OKCODE' fval = '=PRIN' )
  ( program = '' dynpro = '0000' dynbegin = '' fnam = 'PRI_PARAMS-PDEST' fval = 'LP01' )
  ( program = 'SAPMSSY0' dynpro = '0120' dynbegin = 'X' fnam = '' fval = '' )
  ( program = '' dynpro = '0000' dynbegin = '' fnam = 'BDC_OKCODE' fval = '=&F03' )
  ( program = 'RFEBKAMON01' dynpro = '1000' dynbegin = 'X' fnam = '' fval = '' )
  ( program = '' dynpro = '0000' dynbegin = '' fnam = 'BDC_OKCODE' fval = '/EE' )
    ).
DATA(bdcmsgcoll_tab) = VALUE tab_bdcmsgcoll( ).
CALL TRANSACTION 'FTE_BSM' USING tbl MODE 'Q' MESSAGES INTO bdcmsgcoll_tab.

相关问题