精华内容
下载资源
问答
  • python 连接SAP的方法
    千次阅读
    2021-01-12 07:02:20

    前几天在网上找了一下 python 连 SAP 的方法,目前有这个开源项目:

    首先这项目都需要用到 sap 发布的 连接库文件 librfc.dll ( linux : librfccm.so ) .

    librfc.dll 可以在装了sapgui后,在system32 下找到, librfccm.so 可以下载 jco2.x for linux 里面可以找到.

    将库文件按系统要求存放在特定库位置, window是system32 下面,linux 是 /usr/lib 下面

    pysaprfc 则可以直接使用了,saprfc 还需要 sap rfc sdk 的.h头件,这个可以在 sap gui 安装包里面找到.

    现在的问题是这两种方法都有一个不能处理unicode的字符的问题(从sap里取到的中文都是乱码),似乎需要重新下载新的 sap rfc sdk 或 sap netweaver rfc sdk ,目前我没有权限下载这两个东西,如果有朋友可以下载的,请转一份给我, 另外如果有更好的方法也请不吝赐教...

    更多相关内容
  • python连接sap.rar

    2019-08-21 17:12:01
    该文件是python连接sap的必须文件,我在txt中把连接代码写在里面了。方便使用。下载的文件,解压之后,直接安装就可以了。
  • 众所周知,如果要用Python做一些桌面WIN32应用的自动化工作,就需要用到著名的pywin32尤其是其中的win32com.client模块,pywin32的安装不能直接通过pip ...选择桌面系统版本、python版本对应的版本安装即可: 如果...

    众所周知,如果要用Python做一些桌面WIN32应用的自动化工作,就需要用到著名的pywin32尤其是其中的win32com.client模块,pywin32的安装不能直接通过pip install方法,奉上pywin32的官方github链接:https://github.com/mhammond/pywin32/releases。选择与桌面系统版本、python版本对应的版本安装即可:

    417b53fee95279f34c183a7d22ec315f.png

    如果一切正常,在Ipython中导入该模块时不会报异常!如:

    In [1]: import win32com.client

    接下拉就是建立与sap GUI的连接,如下:

    1 SapGuiAuto = win32com.client.GetObject("SAPGUI")2 if not type(SapGuiAuto) ==win32com.client.CDispatch:3 return

    4

    5 application =SapGuiAuto.GetScriptingEngine6 if not type(application) ==win32com.client.CDispatch:7 SapGuiAuto =None8 return

    9

    10 connection =application.Children(0)11 if not type(connection) ==win32com.client.CDispatch:12 application =None13 SapGuiAuto =None14 return

    15

    16 session =connection.Children(0)17 if not type(session) ==win32com.client.CDispatch:18 connection =None19 application =None20 SapGuiAuto =None21 return

    代码的剩余部分可以通过sap原生的“脚本录制与回放”功能生成vbs脚本语句,直接插入python代码中即可!

    ba7b60c16d5fbb514da45363a78c3d0f.png

    需要强调的是,脚本录制功能并不会记录下所有鼠标键盘操作,过程中如果有些窗口是操作系统本身窗口,依旧需要结合windows句柄的捕获、结合sendmessage、postmessage等win32 API函数来处理。

    当然,还需要查阅sap gui script的帮助文件,里面会列出所有的sap底层对象的属性、方法、对应的参数类型、数量等,界面如下:

    bc46dad13b41088a90c1860d1c4d004b.png

    在我的一项实际工作中,需要获得一个shell表单的某个类似于excel 单元格的值,表格是ALV格式的,但是实际录制中没法录制到单元格值,也许你绞尽脑汁,最后通过其他方法(比如 用sendkey结合 ctrl + Y,CTRL + C)达到了同样的效果,但是笔者依然推荐用sap script 原生的API来解决。通过查阅SAP GUI知道它属于“GuiGridView Object”,具有方法“GetCellValue Method”,方法如下:

    Public Function GetCellValue( _

    ByVal Row As Long, _

    ByVal Column As String _

    ) As String

    其中column参数为字符串string类型,通过录制sap脚本,双击对应可以录制到列名称,通常录制代码类似:

    session.findById("wnd[0]/usr/cntlCTRL_CONTAINERBSEG/shellcont/shell").currentCellColumn = "SGTXT"

    所以如果想要取得某个单元格(sap中称之为cell)的值,语法如下:

    sgtxt = Table.GetCellValue(0, "SGTXT")

    需要注明的是,SAP底层的ALV格式表格中行号是从 0开始的,如果想要知道表格共有多少数据行,两行代码即可搞定(表格的ID通过脚本录制即可得到):

    Set Table = session.findById("wnd[0]/usr/cntlCTRL_CONTAINERBSEG/shellcont/shell")

    tableRowCount= Table.RowCount

    如果要获取sap窗口标题来辅助程序判断,语法也很简单,直接调用session对象的text属性即可,如:

    window_caption=session.findById("wnd[0]").Text

    这些属性方法的操作看似简单,但是如果不查阅相关sap gui script API文档,对API不了解,你自己很难实验出来,也许勉强用别的方法实现,却难免走了弯路或者牺牲了稳定性。毕竟无论是VB、还是Python的编译器,都不会对sap底层的api进行代码提示和自动补充。所以必要时,务必要查阅“帮助文件”。

    Scripting Tracker – Development Tool for SAP GUI Scripting,附上博客链接:https://blogs.sap.com/2014/11/20/scripting-tracker-development-tool-for-sap-gui-scripting/

    内含scripting Tracker的下载链接:https://tracker.stschnell.de/

    该工具比原生的sap script更加可视化更加易用,其中Analyser模块界面如下,依靠它可以清晰捕获到sap界面的树形结构和对应的元素id等属性:

    b0b436a3a1b5675da035de10d45a8256.png

    你们关心的脚本录制工具recorder长这样,它支持录制脚本,且支持vb、python、java、powerShell等多种脚本语言的导出:

    bedad60c5d2734c54ddc16f0a1233f49.png

    实在是良心应用,强烈推荐!

    有了这些,用Python 控制操作SAP,从此不再是难事!

    下面为一个python 操作sap打开T-code ”mm03“的简单示例,供参考:

    1 #-Begin-----------------------------------------------------------------

    2

    3 #-Includes--------------------------------------------------------------

    4 importsys, win32com.client5

    6 #-Sub Main--------------------------------------------------------------

    7 defMain():8

    9 try:10

    11 SapGuiAuto = win32com.client.GetObject("SAPGUI")12 if not type(SapGuiAuto) ==win32com.client.CDispatch:13 return

    14

    15 application =SapGuiAuto.GetScriptingEngine16 if not type(application) ==win32com.client.CDispatch:17 SapGuiAuto =None18 return

    19

    20 connection =application.Children(0)21 if not type(connection) ==win32com.client.CDispatch:22 application =None23 SapGuiAuto =None24 return

    25

    26 session =connection.Children(0)27 if not type(session) ==win32com.client.CDispatch:28 connection =None29 application =None30 SapGuiAuto =None31 return

    32

    33

    34 #session.findById("wnd[0]").resizeWorkingPane(65, 19, 0)

    35 session.findById("wnd[0]/tbar[0]/okcd").text = "mm03"

    36 session.findById("wnd[0]").sendVKey(0)37 session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text="9000000000012"

    38 session.findById("wnd[0]").sendVKey(0)39 session.findById("wnd[1]/tbar[0]/btn[0]").press()40 session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP02").select()41

    42 except:43 print(sys.exc_info()[0])44

    45 finally:46 session =None47 connection =None48 application =None49 SapGuiAuto =None50

    51 #-Main------------------------------------------------------------------

    52 if __name__ == "__main__":53 Main()54

    55 #-End-------------------------------------------------------------------

    PS:1、实际的sap脚本录制过程,会录制大量诸如 setfocus,caretposition,resizeWorkingPane等对程序无实际帮助的语句,为了提升程序执行效率,建议对录制的脚本语句进行适当注释和删除;

    2、本文部分sap script api语句用的VB,需要适当修改才能运用到python中。

    展开全文
  •  我们使用Python驱动SAP时,经常会需要导出一些SAP报表数据至本地Excel文件。这个看似简单的问题背后,其实暗藏玄机,今天小爬就带各位同学好好捋捋。 以事务代码FB03(凭证清单)为例,进入清单界面后,SAP会为...

    写在前面

      我们使用Python驱动SAP时,经常会需要导出一些SAP报表数据至本地Excel文件。这个看似简单的问题背后,其实暗藏玄机,今天小爬就带各位同学好好捋捋。

    以事务代码FB03(凭证清单)为例,进入清单界面后,SAP会为我们加载默认布局,布局决定了我们报表中显示哪些字段,以什么样式来显示,最后我们导出的表格样式也大抵如此。

    问题一:

      倘若默认布局不是我们当前想要的(每个用户的SAP界面针对特定事务代码,默认布局不尽相同,如果我们导出数据前不统一布局,后续导出的excel文件模板就没法统一,给后续的数据批量处理带来诸多不便),我们又不想修改默认布局,该怎么做呢?

    回答一:

      我们可以先预设一个统一的全局布局,每次数据加载完后,我们的自动化脚本先设置布局至我们想要的,然后再执行数据的导出;

    问题二:

      为啥SAP的布局在不同账号下呈现两种界面样式,该如何处理(示例界面:FAGLB03)?

    回答二:

      我们可以点击【选择布局】后,判断弹窗的窗口标题,因为两种布局界面下的标题不一样。我们可以判断当前布局所属的样式,再决定是否自动点击SAP菜单栏的【设置】-【切换清单】。将布局样式一调整为样式二之后,再来进行后续的自动化操作。

    问题三:

      为啥布局要先自动切换到【界面样式二】模式,该模式方便在哪儿?

    回答三:

      我们通过之前系列【python驱动SAP完成自动化】文章中提到的Tracker工具,利用其Analyser功能,得到两者的布局界面(ID:/app/con[0]/ses[2]/wnd[1])的分布:

     由于布局样式二的界面主体是GridView,它可以通过GetCellValue方法快速得到某个Cell(类似于单元格)的值,从而方便我们快速基于布局名称,定位并切换到想要的布局;与之对应,布局样式一的主体是GuiLabel对象,遍历每行布局相对没有那么方便。

    数据导出的注意事项

    我们可以通过如下方式进行导出:

    其中方法一与方法三并无本质差别,最终都是可以脚本录制或者快捷键(Ctrl+Shift+F7)得到,点击导出按钮后,界面【选择电子表格】如下:

    但是假如用户曾经勾选过上图中的【始终使用选定的格式】,那么则不会弹出上图所示窗口,直接进入如下界面:

    注意一:

    如果用户执行操作前没有点击【脚本录制】,则会弹出如下windows【另存为】界面:

    由于该界面是windows系统窗体,无法通过脚本录制得到自动化脚本代码,所以我们务必要提前进行脚本录制动作,才能确保文件保存的界面可通过录制脚本得到代码。

    注意二:

    如果我们一开始选择的方法二 进行数据导出,则无论用户是否勾选【始终使用选定的格式】选项,SAP均会弹出【选择电子表格】界面。

    因此,为了避免操作界面不一致带来的代码兼容问题,小爬建议大家使用方法二来执行数据导出。

    最后的导出界面,用户可以设置保存的路径和文件名,最后基于各自的情况点击【生成】或者【替代】按钮(【替代】按钮,意味着如果设定目录中如果提前有同名文件,则会被新文件覆盖)。

    点击完导出后,SAP会默认调用Excel进程,生成一个Excel文件,持续往该文件中传输值,待传输完毕后,SAP左下角会有消息显示:已传输***个字节。且该Excel文件会被excel自动打开。

    那么问题来了,如果我们要通过脚本批量下载多个报表数据,则SAP会自动创建并打开N个excel文件,此举很有可能导致系统内存紧张甚至excel文件崩溃。因此我们有必要及时自动关闭Excel文件。这该如何处理呢?

    显然,我们必须借助于windows系统api来实现,python下就必须依托于pywin32库。同时我们还要借助SPY++提前捕获窗口信息。

    可以看到当系统是否隐藏了文件扩展名,最后窗口标题是有差别的,而FindWindow函数本身不支持基于窗口标题模糊查找,我们代码里不得不特殊化处理。

    基于前文提到的方法二导出的,具体的示例代码如下(FB03为例):

     1 import sys, win32com.client,os,win32gui,win32con,time
     2 def Main():
     3   try:
     4     SapGuiAuto = win32com.client.GetObject("SAPGUI")
     5     application = SapGuiAuto.GetScriptingEngine
     6     connection = application.Children(0)
     7     if connection.DisabledByServer == True:
     8       print("Scripting is disabled by server")
     9       application = None
    10       SapGuiAuto = None
    11       return
    12 
    13     session = connection.Children(0)
    14     if session.Busy == True:
    15       print("Session is busy")
    16       session = None
    17       connection = None
    18       application = None
    19       SapGuiAuto = None
    20       return
    21 
    22     if session.Info.IsLowSpeedConnection == True:
    23       print("Connection is low speed")
    24       session = None
    25       connection = None
    26       application = None
    27       SapGuiAuto = None
    28       return
    29 
    30     session.findById("wnd[0]").maximize()
    31     session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").contextMenu()
    32     session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectContextMenuItem("&XXL")
    33     session.findById("wnd[1]/tbar[0]/btn[0]").press()
    34     session.findById("wnd[1]/usr/ctxtDY_PATH").text = os.getcwd() #保存路径
    35     session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = "reportList.xlsx" #保存文件名
    36     session.findById("wnd[1]/tbar[0]/btn[11]").press() #点击【替代】,覆盖可能的原文件
    37     sapInfo=session.findById("wnd[0]/sbar").text #由于SAP脚本自身的特性,当程序读到左下角消息时,意味着数据已经传输完成!
    38 
    39     '''找到打开的excel文件,并自动关闭它'''
    40     excelHwnd=0
    41     while ExcelHwnd==0:
    42         time.sleep(0.2)
    43         excelHwnd=max(win32gui.FindWindow("XLMAIN","reportList.XLSX - Excel"),win32gui.FindWindow("XLMAIN","reportList - Excel"))
    44 
    45     '''以防SAP没有完全释放Excel进程,建议等待excel窗口可见后,再关闭它'''
    46     isVisible=False
    47     while isVisible==False:
    48         time.sleep(0.2)
    49         isVisible=win32gui.IsWindowVisible(excelHwnd)
    50 
    51     '''关闭excel进程'''
    52     win32gui.SendMessage(excelHwnd,win32con.WM_CLOSE,None,None)
    53 
    54 
    55   except Exception as e:
    56     print(e)
    57     print(sys.exc_info()[0])
    58 
    59   finally:
    60     session = None
    61     connection = None
    62     application = None
    63     SapGuiAuto = None
    64 
    65 Main()
    展开全文
  • SAPRFC与PYTHON集成开发.pdf
  • 前几天在网上找了一下 pythonSAP 的方法,目前有这个开源项目:首先这项目都需要用到 sap 发布的 连接库文件 librfc.dll ( linux : librfccm.so ) .librfc.dll 可以在装了sapgui后,在system32 下找到, librfccm...

    前几天在网上找了一下 python 连 SAP 的方法,目前有这个开源项目:

    首先这项目都需要用到 sap 发布的 连接库文件 librfc.dll ( linux : librfccm.so ) .

    librfc.dll 可以在装了sapgui后,在system32 下找到, librfccm.so 可以下载 jco2.x for linux 里面可以找到.

    将库文件按系统要求存放在特定库位置, window是system32 下面,linux 是 /usr/lib 下面

    pysaprfc 则可以直接使用了,saprfc 还需要 sap rfc sdk 的.h头件,这个可以在 sap gui 安装包里面找到.

    现在的问题是这两种方法都有一个不能处理unicode的字符的问题(从sap里取到的中文都是乱码),似乎需要重新下载新的 sap rfc sdk 或 sap netweaver rfc sdk ,目前我没有权限下载这两个东西,如果有朋友可以下载的,请转一份给我, 另外如果有更好的方法也请不吝赐教...

    展开全文
  • 适用于PythonSAP HANA数据库客户端 重要通知 此公共存储库是只读的,不再维护。 主动维护的替代方案是SAP HANA Python客户端: : 基于的的纯Python客户端。 pyhdb支持Python 2.7、3.3、3.4、3.5、3.6以及...
  • windows使用python通过pyrfc连接SAP使用的nwrfcsdk nwrfc750P_6-70002755.zip
  • SAP HANA 是SAP 新的内存数据库:目前学习python数据处理分析,现在想要连接 SAP HANA 数据库,发现目前python已经发布了连接 SAP HANA的库 pyhddb1、需要安装pyhdbpip install pyhdb2.获取 Connection 对象import ...
  • python调用sapRFC接口案例

    万次阅读 2022-03-01 09:09:54
    # -*- coding: utf-8 -*- # @Time : 2021-08-10 14:42 ...###SAP批量审核采购单 import pyrfc conn_params = { "user": "SAPUSER", #用户 "passwd": "XXXX", #密码 "ashost": "192.168.8.1", #IP "sysnr": "01",
  • python获取sap数据Today we are seeing the daily increase of Machine Learning (ML) development and the largest development tool is Python and each day more and more people are trying to return the ...
  • Python 二次开发 SAP2000 概述

    千次阅读 2019-09-26 09:12:15
    SAP2000......Python......API......二次开发......新建模型......保存模型......打开已有模型......
  • Can Python be used to query a SAP database?解决方案Pysaprfc is a wrapper around SAP librfc (librfc32.dll on Windows, librfccm.so or librfc.so on Linux). It uses the excellent ctypes extension package ...
  • python 操作sap

    2021-01-23 17:07:42
    https://blogs.sap.com/2020/06/09/connecting-python-with-sap-step-by-step-guide/ alex baker写的 三个教程 http://www.alexbaker.me/code/python-and-sap-part-2-getting-data-from-sap windows安装pyrfc ...
  • 基于PythonSAP流程自动化

    千次阅读 2020-12-29 07:10:46
    财务的自我修养,微信公众号:机智出品...工具:Python pywin32库win32com.client模块结合SAP GUI Script;说明:以下代码来源网络参考思路,无实际意义;推荐阅读:SAP博客博主Stefan Schnell文章;(SAP脚本工具:...
  • Python 二次开发 SAP2000 定义

    千次阅读 2020-04-06 16:42:31
    目 录Blog Links一、前沿二、定义材料三、截面属性四、定义坐标系五、定义组六、荷载模式七、荷载工况八、荷载组合九、示例十、尾声 Blog Links ...Python语言 SAP2000二次开发 —— 指定 (未完待...
  • 基于Python驱动的SAP流程自动化(二)-如何安装Scripting Tracker SAP脚本录制工具
  • 工作的时候需要往HANA数据库插入一些测试数据,我使用的连接HANA的工具DBeaver又不能像Mysql那样批量执行多条插入语句,就想用python连接HANA往里循环插入数据,由于代码水平有限,尝试了好久才解决,下面记录一下...
  • Python-SAP流程自动化,从录制SAP脚本到打包生成本地安装包 基于Python驱动的SAP流程自动化(一) 搭建Python开发环境 基于Python驱动的SAP流程自动化(二) 下载安装Scripting Tracker脚本录制工具 基于Python...
  • 关于python 连接 SAP rfc接口的新思路

    千次阅读 2020-01-03 14:13:25
    前言:为了提高SAP二次开发的效率,想用python写个简单的脚本工具,与SAP 中frc的接口自动对接。但是,国内的博客中有关此内容的博文很少,且时间久远。查了国外的文章,有一些文章有涉及此内容,不过在python这一块...
  • 版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。...下面分别介绍Windows、Linux 操作系统的配置示例:Windows:把下载好的SAP NW RFC SDK程序解压在本地,配置环境变量:新建环境变量:SAP
  • ''' 登录SAP, 输入T-code, 返回获取的session :return: session ''' kill_sap() sap_app = sap_path # 您的saplogon程序本地完整路径 subprocess.Popen(sap_app) time.sleep(int(wait_time)) flt = 0 while flt ==...
  • 讨论过如何利用工具Scripting Tracker录制python操纵SAP GUI的py脚本。软件的录制和生成的代码界面如下:场景一:实际业务中,除了一些常规步骤,我们可能会驱动SAP GUI中的一些布局,改变数据的展现形式,如:譬如...
  • 各位高手大家好: 我尝试使用Python 控制SAP 完成一些常规操作: 根据网上的方法:使用 SAP 自带的 Record 功能。 ![图片说明](https://img-ask.csdn.net/upload/201910/12/1570871591_812449.png) 得到SAP 操作背后...
  • 最近小爬一直思忖着如何将以前写的一些半自动化程序转为全自动化,这其中就涉及到SAP的打开和登录过程。我们都知道,SAP原生的“脚本...那么我们的重点就转到了,如何通过Python完成SAP应用程序的打开并进入特定的...
  • 代码 from pyrfc import Connection import datetime import sys """ imp = dict( RFCINT1=0x7F, # INT1: Integer value (1 byte) RFCINT2=0x7FFE, # INT2: Integer value (2 bytes) RFCINT4=0x7FFFFFFE, # INT:...
  • 小爬最近为了提升自己的常见编程算法...不过最近工作中遇到这样一个场景,我们在利用Python驱动SAP GUI时,可能希望多开SAP窗口,实现多个页面同时作业,对自动化脚本进行加速。SAP中的Session就是我们认知中的一个S...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,004
精华内容 3,201
关键字:

python与sap