文章目录
前言
Python 在我们工作中的作用还是有很多的,尤其是在数据处理方面和自动化等等,可以说是无所不能,这篇文章来给大家介绍一下 Python 如何连接 SAP 并调用 SAP 的 RFC 接口。首先给大家简单介绍一下 Pyrfc 这个包,Pyrfc 是 Python 语言的一个包,是用于连接 SAP 系统并执行 SAP 的 RFC 函数模块。这包为我们提供了 Python 语言与 SAP 系统之间的桥梁,使得 Python 开发者可以在 Python 中方便地调用 SAP 的 RFC 函数模块,我们也可以配合 django 或者其他 web 框架搭建一个 web 网站实现与sap系统的集成。
一、案例介绍/笔者需求
这个案例我们会先进行依赖的下载和环境的配置,以及 Python 所需包的下载。然后再使用 Python 连接 SAP 并调用 SAP 的一个标准函数。至于笔者为什么会研究学习这个是因为我本身就是 Python 和 .Net 出身对 BS 架构的软件很感兴趣,后来因为领导有想对 SAP 数据可视化的需求,所以我个人第一时间想到的就是 Python。因为它搭建 web 服务的速度非常快,我的想法是用 Python 提取 SAP 中的数据,并对数据进行处理然后再使用 ECharts 对数据进行可视化展示。ECharts官网
二、依赖 包 下载 环境配置
这篇文章中的这个步骤二是最重要的,因为这个个案例主要就是介绍如何下载资源如何配置,我在最刚开始的时候就在环境的配置上踩了好多坑。所以下面环境的配置大家还是要仔细的看一看,代码的话其实都很简单的。
a.
下载连接SAP所需的SDK
这个依赖的全称叫做 SAP Netweaver RFC SDK <版本号>,它的下载方式有很多种 如果有SAP账号的还是建议去官网下载的。笔者这里也为大家介绍多种下载方式。
1.资源绑定下载
笔者的这篇文章已经绑定了这个资源大家可以免费下载。
2.SAP官网下载
下载链接 点击下方图片箭头的地方可以跳转对应下载页面首先会让你登录。
3.直接找现成的
我们也可以在各大搜索引擎中直接找现成的下载。或者在 Github 和 Gitee 中也有,Gitee的下载连接在这 Gitee下载
3.百度云
笔者也怕大家嫌麻烦,或者下载的不对,所以贴心的准备了百度云分享。
链接:https://pan.baidu.com/s/1wYddd6W_dQdVPrt-vXNT5g?pwd=ba69
提取码:ba69
b.
SDK环境变量的配置
1.需要配置的目录
我们需要将下载的 sdk 文件中的 bin 目录和 lib 目录配置到环境变量中。如下图所示
2.环境变量的配置
这里需要注意的是配置这两个目录的环境变量不像我们配置 Python 的环境变量哪样直接到系统变量的 path 下新建,而是先要在系统变量中新建一个 SAPNWRFC_HOME 变量,变量值就是 nwrfcsdk 目录也就是 bin 或者 lib 的上级目录,再去系统变量 path 中依据我们刚才在系统变量新建的 SAPNWRFC_HOME 变量基础上再去新建 bin 变量 和 lib 变量。具体原因稍后解释。
a.首先配置系统变量
b.在path中配置bin和lib目录变量
这一步其实可以忽略,不用去配置 看看了解了解就行了,具体原因在下面有解释。但是上面那个步骤必须配置。
3.这样配置的具体原因
为什么要这样配置?直接在系统变量 path 中配置 lib bin目录的绝对路径不行吗?这个原因和 Pyrfc 这个包的源码有关系,具体原因如下图所示。
a.查看源码
我们可以按住 ctrl 鼠标左键点击 pyrfc 这个包跳入源码界面。
b.源码如何引入的组件
我们可以看到这一行代码是依据 SAPNWRFC_HOME 系统变量引入了这个 lib 目录中的 dll 组件,所以我们配置环境变量的时候要像上面那样配置才可以成功使用此sdk。
4.加载模块包出错的解决方法
注意如果这样配置完成之后跑代码出现加载模块包错误 ImportError: DLL load failed: 找不到指定的模块。 就重启Pycharm或者重启电脑让环境变量重置然后再试一下,笔者亲测有用。
5.确保SDK正确配置
根据下图操作可以检测你环境变量是否配置正确路径是否完整,是否能正确加载SDK。其实按照这个pyrfc版本加载DLL的逻辑环境变量是不用去path中配置bin和lib目录变量。可能之前跟早1.0的版本和现在加载DLL路径的逻辑有点不一样应该是没有去拼接Lib这个字符的,所以需要去path中配置bin和lib目录变量。
现在的pyrfc版本都有 versions: 2.4.0, 2.4.1, 2.4.2, 2.5.0, 2.5.1, 2.7.0, 2.7.1, 2.7.2, 2.8.0, 2.8.1, 2.8.2, 2.8.3, 3.0.dev1, 3.0, 3.1, 3.2, 3.3, 3.3.1 这些版本都是下图所示的加载逻辑,所以可以忽略去path中配置bin和lib目录变量。
print(os.path.join(os.environ["SAPNWRFC_HOME"], "lib"))#能正常打印出lib所在完整路径 就证明环境变量没问题
print(os.add_dll_directory(os.path.join(os.environ["SAPNWRFC_HOME"], "lib")))#能打印出东西就证明能引入SDK
c.
Pyfrc包的下载
包的下载还是比较简单的也不用你自己配置只要使用了对应 python 虚拟环境即可,包的下载 主要就是镜像源的使用 和 pip 版本的问题。如果没有镜像源那么下载速度就会很慢,因为它默认是从国外的服务器下载资源的,如果pip版本比较低的话也会下载失败。有些冷门包是很难下载的大家可以去网上看看如何手动下载并导入虚拟环境的文章教程。
1.国内的镜像源
个人平时喜欢使用 中国科技大学的镜像源 因为我觉得这个没出现过什么问题。
Name | Url |
---|---|
中国科技大学 | https://pypi.mirrors.ustc.edu.cn/simple/ |
阿 里 云 | http://mirrors.aliyun.com/pypi/simple/ |
清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple |
豆 瓣 | http://pypi.douban.com/simple/ |
华中理工大学 | http://pypi.hustunique.com/ |
山东理工大学 | http://pypi.sdutlinux.org/ |
2.使用镜像源下载
直接在终端中输入 pip install pyrfc==3.3.1 -i https://pypi.mirrors.ustc.edu.cn/simple/
==3.3.1 是下载指定版本,可以不用加但是最好还是和我的版本一样,最新版可能会和我这篇文章的源码中的 类名 方法 有所改动。
3.包的异常
好多人运行的时候会报错AttributeError: module 'pyrfc' has no attribute 'Connection
,这个的根本原因是 pyrfc 包中的 _cyrfc.cp39-win_amd64.pyd 加载失败会报错 DLL load failed while importing _cyrfc
, _cyrfc.cp39-win_amd64.pyd 这是一个编译后的 C/C++ 扩展模块,.pyd 文件本质上是一个 Windows 专用的动态链接库(DLL),Python 可以将其作为模块导入,但是要调用这个模块的时 _cyrfc.cp39-win_amd64.pyd 可能依赖于特定版本的 Microsoft Visual C++ 运行时库(例如 Visual C++ Redistributable)。如果这些运行时库缺失或版本不匹配,可能会导致加载失败。尤其是win11。。。。
_cyrfc.cp39-win_amd64.pyd 文件名中的 cp39 表示该文件是为 Python 3.9 编译的,win_amd64 表示这是一个 64 位 Windows 系统上的版本。如果你使用的是其他版本的 Python(例如 Python 3.8 或 Python 3.10),也可能会导致加载失败。
也可以看看这个链接内容 https://github.com/SAP/PyRFC/issues/319
三、连接SAP调用RFC
a.
直接上代码
这里的先直接上全部代码 稍后再详细解释。代码中的注释也写的很清楚。
1.源码
import pyrfc
ASHOST = 'xx.xx.xx.xx'
CLIENT = 'xxx'
SYSNR = 'xx'
USER = 'xxxxxxx'
PASSWD = 'xxxxxxx'
# 创建链接Connection方法的参数 ashost=应用服务器 sysnr=实例编号 client=客户端 user=登录对应客户端的用户名 passwd=密码
conn = pyrfc.Connection(ashost=ASHOST, sysnr=SYSNR, client=CLIENT, user=USER, passwd=PASSWD)
# 使用call方法调用RFC 第一个参数是需要调用的函数模块,后面是RFC导入的参数,注意一定要用参数名=参数值的方式
# call方法的返回值是字典形式键值对是:{'ET_DATA':[],'DATA':[], 'FIELDS': [],'OPTIONS':[]}
result = conn.call("RFC_READ_TABLE", QUERY_TABLE='TCURR')
# print(result)
# 数据简单展示一下
for i in result['DATA']:
print(i)
2.运行效果
b.
代码实现的详细解释
1.连接参数的查看
Connection这个类实例化对象的时候传入的参数其实就是我们SAP系统连接的参数,我们可以在sap的登录界面右击登录条目点击属性即可查看到 如下图所示
2.call方法多参数使用
上面案例我们 call 方法我们调用的是 sap 中的标准函数 RFC_READ_TABLE 这个函数是用来读取 SAP 透明表的一个函数,我们查的是 TCURR 这个表。这个表是存储了各个货币之间的汇率的数据。
a.se37查看函数
下图所示是这个函数的一些入参出参的介绍,query_table 是我们需要查询的表名,表传入传出的 fields 是我们要查询对应表的字段、option 是我们的查询条件、data 是查询最终返回的数据。输入完了之后点击左上角的执行我们数据就可以被我们所设置的条件取到data中。
b.call方法设置调用条件
这里的 option 以及 fields 参数我们可以在代码中这样写。示例 1,2 运行结果就是只取 TCURR 表中的 FCURR 字段并且 FCURR 字段还必须等于 USD,示例2 跟 示例1 效果一样 只是把运算符 = 换为了 EQ,其中示 例3 需要注意一下,我看其他文章都是逗号分隔每个筛选条件,但是我试过了不行,也可能跟包的版本有关系,我的 pyrfc 包版本是__version__ = “2.7.0”,后来我还是在se37里面发现是要用 and 连接在 python 这里我也试了一下确实是需要用 and 去连接多个条件。
#示例1
options = [{'TEXT': "FCURR = 'USD'"}]
fields = ['FCURR']
#示例2
options = [{'TEXT': "FCURR EQ 'USD'"}]
fields = ['FCURR']
#示例3
options = [
{'TEXT': "FCURR = 'USD'"} and
{'TEXT': "TCURR = 'RMB'"}
]
fields = ['FCURR', 'TCURR']
#使用call方法并传入相应参数
result = conn.call("RFC_READ_TABLE", QUERY_TABLE='TCURR', OPTIONS=options, FIELDS=fields)
c.运行效果
示例1 2
示例3
四、数据格式化
如果对数据打印格式有要求的大家可以去了解 python 中 tablib 这个包,这个包是专门格式化数据的,打印出来的数据格式是比较规整的,如果有 web 开发经验的可以直接使用 html 配合 js 做成表格也可以,或者用一些前端的框架,我们只需要处理成对应的数据格式传给前端就可以了。
a.
tablib 包
1.tablib包 数据处理效果展示
五、总结
以上就是今天要讲的内容,本文仅仅简单介绍了python如何去连接我们的sap并如何调用sap中的RFC函数模块,大家也可以尝试着和web开发结合起来,也可以和处理 excel 的包 openpyxl 结合起来直接从表中取的我们的数据,再处理成我们想要的数据结果,等等,感觉这篇文章自己有学到东西或者在今后的工作中能派上用场,可以点赞收藏支持!!!制作不易非常感谢,当然如果有说错或者不好的地方还望大家提出来见谅,欢迎大家评论指出不好的地方。谢谢!