将第三方应用程序(MS Excel)与SAP R/3连接

将第三方应用程序(MS Excel)与SAP R/3连接,excel,vba,saprfc,sap-basis,Excel,Vba,Saprfc,Sap Basis,我正在为MS Excel(VBA宏)与SAP的通信制定一个解决方案。有时很难联系到您所在公司的SAP支持人员,因此最好找到自己的解决方案 关于这个原因,我从基本的“用SAP R/3连接我自己的用户配置文件”开始。通过谷歌的研究,我发现了一个很好的连接方式,下面是代码的关键部分: Dim objBAPIControl As Object 'Function Control (Collective object) Dim sapConnection As Object 'Connection obj

我正在为MS Excel(VBA宏)与SAP的通信制定一个解决方案。有时很难联系到您所在公司的SAP支持人员,因此最好找到自己的解决方案

关于这个原因,我从基本的“用SAP R/3连接我自己的用户配置文件”开始。通过谷歌的研究,我发现了一个很好的连接方式,下面是代码的关键部分:

Dim objBAPIControl As Object 'Function Control (Collective object)
Dim sapConnection As Object 'Connection object
Set objBAPIControl = CreateObject("SAP.Functions")
Set sapConnection = objBAPIControl.Connection

sapConnection.client = "32"
sapConnection.user = "myUser"
sapConnection.Language = "EN"
sapConnection.hostname = "qwerty.example.com"
sapConnection.Password = "myPass"
(和更多用户配置文件值……)

稍后,我执行了第二步,即读取一些表(在本例中,是Users表)

与SAP的连接是相同的,但一旦登录:

If objBAPIControl.Connection.Logon(0, False) <> True Then
    Exit Sub
End If

Set RfcCallTransaction = objBAPIControl.Add("RFC_CALL_TRANSACTION_USING") 
在这一部分之前,我确信有三件事:

1) 它确实连接到SAP R/3

2) 它运行“SE16”事务

3) 它可以从BdcTable接收批输入

缺少的部分是,如何“格式化”BdcTable(我认为它必须是ABAP语言)以上载我希望在SE16上运行的确切数据(表)

编辑: 我找到了一个我正在寻找的“格式化”表的示例:

add_bdcdata BdcTable, "SAPLSETB", "230", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "DATABROWSE-TABLENAME"
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "=ANZE"
add_bdcdata BdcTable, "", "", "", "DATABROWSE-TABLENAME", "KNA1"
add_bdcdata BdcTable, "/1BCDWB/DBKNA1", "1000", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "MAX_SEL"
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "=ONLI"
add_bdcdata BdcTable, "", "", "", "LIST_BRE", "250"
add_bdcdata BdcTable, "", "", "", "MAX_SEL", "5"
add_bdcdata BdcTable, "SAPMSSY0", "120", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "01/02/2012"
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "=%EX"
add_bdcdata BdcTable, "/1BCDWB/DBKNA1", "1000", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "/EE"
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "I1-LOW"
add_bdcdata BdcTable, "SAPLSETB", "230", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "/EBACK"
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "DATABROWSE-TABLENAME"
上述代码仍然是VBA宏的一部分。但我不知道这些填充意味着什么

完成此任务后,第二个挑战是将数据自动保存到MS Excel工作表中

(你能告诉我所有的编辑工作是否正常,还是我应该粘贴新代码并删除历史记录?)

编辑: 我问了与SCN平台中的摘要相同的问题。你可以复习一下

编辑: 我在本次挑战中的目标是通过VBA宏运行事务(我要查找的TCODE是LM02,仓库的仓位到仓位事务),上载从MS Excel文件提取的一些数据并执行事务

-- 上次编辑: 如果没有SAP It支持,这项任务似乎无法完成。 12年9月19日|仍在研究这一主题。25/09/12 |
2012年10月2日-->我将尝试进行日志记录,运行基本Tcode并显示报告。我会在仔细检查后对结果进行评论。

我很抱歉,我的朋友,但你不会得到比这更进一步的结果

您在代码中所做的是调用BAPI(基本上是一个RFC启用函数)。换句话说,SAP提供了标准的函数,可以从不同的系统调用这些函数。你可以认为这是一个老式的API。也可以创建自定义BAPI,但实际上几乎没有人这样做

好消息是,通常,我说过,BAPI通常会带来与标准事务相同的功能。所以从理论上讲,通过事务代码可以做的事情,可以通过BAPI调用来做

BAPI与交易代码的关系不是一对一。例如,您可以使用单个事务来插入、搜索、删除和编辑特定类型的文档,但要使用BAPI调用实现这一点,您将需要许多事务(一个用于创建文档,一个用于删除,一个用于检索等)


有一个名为“BAPI”的事务(可能是唯一一个名称合适的tx代码),其中包含系统中的所有BAPI、其参数和(一些糟糕的)文档。

注意:这是@fabiopagoti答案的另一个建议,完全不同的方法


如果——正如你在另一篇评论中所建议的那样——你想将数据导入到R/3应用程序中,你最好不要试图绕过该公司。相反,您可以尝试与他们交谈并访问(LSMW)。这是一个功能强大的工具包,允许您录制对话步骤(在特定条件下),导入一些数据(例如,从CSV文件),然后将录制和数据结合起来,以不同的数据“重播”相同的步骤-所有这些都使用标准功能,而无需绕过任何安全检查

好吧,让我引用我得到的最佳答案。我把它贴在这里是因为我想其他人会有和我一样的问题

第一步是了解您的客户是否有RFC或BAPI 事务,但您没有ABAP事务的权限, 所以我不知道你怎么知道

理论上,您可以尝试在WEB或SAP中查找它 文档,但是(如果存在)您需要检查接口 其中定义了导入/导出参数…因此您应该 拥有SE37的授权

下一步取决于能否找到RFC函数 对于LM02:

如果有函数,您需要了解如何运行它

如果没有函数。你需要明白,如果你是个骗子或骗子 可以开发一个定制的

马克斯


感谢您的研究工作。

谢谢您的建议。另外,在没有SAP it支持和ABAP编码的帮助下,是否可以将一些数据从Excel“加载”到SAP?这是真的@vwegert。我忘了那个。@fabiopagoti Set RfcCallTransaction=Functions.Add(“RFC_CALL_TRANSACTION”)仍在工作或现在已过时?@fabiopagoti“新”功能模块现在是我稍后将用此代码更新编辑我的问题。@BrOSs据我所知(我在SAP出版社的官方C_TAW12_70书上读过此内容)所有的BAPI:1)都是RFC 2)以“BAPI”开始3)有一个“BAPIRETURN”返回参数4)在不检查BAPI txcode的情况下处理业务对象我假设RFC#U调用#U事务#U使用的不是BAPI,因为它违反了#2和#4(可能是#3)。它们很难达到(可能是因为在我们的制造公司,IT SAP支持实际位于另一个国家/地区),但谢谢你的建议。你是对的,我正在寻找从Excel自动导入一些信息到R/3应用程序。@fabiopagoti你没有建设性-你总是把运行ERP软件的内部组织的失败归咎于软件本身吗?@vwegert我将删除我的评论。不过我是在开玩笑。正如常见问题解答说,“带上你的幽默感”——我试过这么做。如果我失败了,很抱歉。信用:
If objBAPIControl.Connection.Logon(0, False) <> True Then
    Exit Sub
End If

Set RfcCallTransaction = objBAPIControl.Add("RFC_CALL_TRANSACTION_USING") 
    RfcCallTransaction.exports("tcode") = "SE16"
    RfcCallTransaction.exports("mode") = "N"
Set BdcTable = RfcCallTransaction.Tables("bt_data")
add_bdcdata BdcTable, "SAPLSETB", "230", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "DATABROWSE-TABLENAME"
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "=ANZE"
add_bdcdata BdcTable, "", "", "", "DATABROWSE-TABLENAME", "KNA1"
add_bdcdata BdcTable, "/1BCDWB/DBKNA1", "1000", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "MAX_SEL"
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "=ONLI"
add_bdcdata BdcTable, "", "", "", "LIST_BRE", "250"
add_bdcdata BdcTable, "", "", "", "MAX_SEL", "5"
add_bdcdata BdcTable, "SAPMSSY0", "120", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "01/02/2012"
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "=%EX"
add_bdcdata BdcTable, "/1BCDWB/DBKNA1", "1000", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "/EE"
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "I1-LOW"
add_bdcdata BdcTable, "SAPLSETB", "230", "X", "", ""
add_bdcdata BdcTable, "", "", "", "BDC_OKCODE", "/EBACK"
add_bdcdata BdcTable, "", "", "", "BDC_CURSOR", "DATABROWSE-TABLENAME"