Python结合SAP GUI Script操作sap的简易教程

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

如果一切正常,在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.GetScriptingEngine
 6     if not type(application) == win32com.client.CDispatch:
 7       SapGuiAuto = None
 8       return
 9
10     connection = application.Children(0)
11     if not type(connection) == win32com.client.CDispatch:
12       application = None
13       SapGuiAuto = None
14       return
15
16     session = connection.Children(0)
17     if not type(session) == win32com.client.CDispatch:
18       connection = None
19       application = None
20       SapGuiAuto = None
21       return

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

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

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

在我的一项实际工作中,需要获得一个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进行代码提示和自动补充。所以必要时,务必要查阅“帮助文件”。

此处推荐SAP博客站的一个著名博主:Stefan Schnell(他写了很多sap script与其他语言结合的文章,非常受用)以及他开发的免费的sap脚本工具:

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等属性:

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

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

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

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

 1 #-Begin-----------------------------------------------------------------
 2
 3 #-Includes--------------------------------------------------------------
 4 import sys, win32com.client
 5
 6 #-Sub Main--------------------------------------------------------------
 7 def Main():
 8
 9   try:
10
11     SapGuiAuto = win32com.client.GetObject("SAPGUI")
12     if not type(SapGuiAuto) == win32com.client.CDispatch:
13       return
14
15     application = SapGuiAuto.GetScriptingEngine
16     if not type(application) == win32com.client.CDispatch:
17       SapGuiAuto = None
18       return
19
20     connection = application.Children(0)
21     if not type(connection) == win32com.client.CDispatch:
22       application = None
23       SapGuiAuto = None
24       return
25
26     session = connection.Children(0)
27     if not type(session) == win32com.client.CDispatch:
28       connection = None
29       application = None
30       SapGuiAuto = None
31       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 = None
47     connection = None
48     application = None
49     SapGuiAuto = None
50
51 #-Main------------------------------------------------------------------
52 if __name__ == "__main__":
53   Main()
54
55 #-End-------------------------------------------------------------------

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

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

原文地址:https://www.cnblogs.com/new-june/p/NewJune.html

时间: 2024-08-02 01:38:28

Python结合SAP GUI Script操作sap的简易教程的相关文章

不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧

Jerry和SAP成都研究院一些新同事聊天时,谈到ABAP和SAP GUI这个话题.很多新同事在加入SAP成都之前,是做Java和C++开发的,习惯了Eclipse/IntelliJ IDEA/Visual Studio这些现代IDE,对于SAP GUI这个比较"复古"的IDE不太适应. 其实还有一个选择:ABAP Development Tools,最初在SAP内部称为ABAP in Eclipse.这个工具SAP在很多场合简称为ADT,本文后续部分也使用这个简称. 简单地说,SAP

为什么SAP GUI里的传统事务码能通过Fiori Launchpad启动

今天是农历鼠年大年初六,本文是鼠年第6篇文章,也是汪子熙公众号第205篇原创文章. 大家这几天宅得怎么样了? Jerry之前的文章 那些年我用过的SAP IDE 曾经提到,我们可以把SAP GUI里的传统事务码放到SAP Launchpad里启动,并在浏览器里运行. 这是SE80在浏览器里运行的界面: 为响应government号召,尽量少出门,反正也闲着没事,今天我们就来聊聊这一切是怎么实现的. Jerry最初注意到这种将SAP GUI里的事务码运行在浏览器里的做法,是在日常工作的测试时,发现

SAP GUI个性化设置

大概从GUI730开始,GUI品牌化一直不被默认支持,在GUI设置选项里处于灰色状态,如下图: 不过用户还是可以修改注册表的方式来进行修改,让它可以设置! 首先运行Regedit,在目录:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\SAP\General\Appearance 下,右边添加以下REG_DWORD属性: UseBrandingImage_ReadOnly  : 代表是否品牌化,也就是复选框是否只读,1代表只读0代表可以编辑: BrandingIm

SAP GUI Security notice

出现错误提示: Failed to load administrator rule file.Check your Installation. 原因: 电脑缺少MS XML4.0,导致SAP客户端无法正确读取XML文件C:\program files\SAP\FrontEnd\SAPgui\themes\enjoy\theme.xml 解决方法: 安装ms xml 4.0,下载地址如下:http://www.microsoft.com/downloads/en/details.aspx?fami

Mac OS X 中使用SAP GUI的方法

下载sap gui for mac 730 解压后 安装之前需要去oracle 官网下载jdk 6 然后运行 安装完成后配置登陆端 新建连接时,只需要配置Advanced 页签:勾选Expert Mode. 文本框键入如下:conn=/H/192.168.88.*/S/3210 一般的是conn=/H/服务器IP地址/S/连接服务器的端口号 (说明S后面是端口,如果配置实例编号为00,就改成3200)

SAP 本地文件上传到内表 sap gui 安全性弹出框 解决方法 .

本地上传文件到内表时候, 可以使用函数TEXT_CONVERT_XLS_TO_SAP:将xlsx,xls文件导入到内表 也可使用函数GUI_UPLOAD:将TXT文件导入到内表等   系统默认情况下,可能会产生“SAP GUI 安全性”的一个弹出框,如下图所示:   个人研究结果,如下(仅供参考) 产生原因:sap 系统对外部数据导入时候,会有一个自动的安全性提示检查. 在sap 安全性里面有个安全配置,默认的时候用的系统定制的安全配置, 会将已确认过的文件或者文件夹,加入到安全配置列表里面,遇

SAP月结操作讲解

SAP月结操作讲解 https://wenku.baidu.com/view/ac6fe45d312b3169a451a4b9.html 步聚 操作内容 事务码 是否必须 操作时间 月/年结 1 关闭待结期间物料帐,并打开下一期间物料帐 MMPV/MMRV 是 FI月结开始 月年 2 打开下一个会计期间财务帐 OB52 是 FI月结开始 月年 3 确认本期间业务全部入帐,出纳与会计对帐等 F-02,VF01,MIRO等 是 CO月结开始前 月年 4 固定资产折旧运行 是 CO月结开始前 月年 5

ABAP术语-SAP GUI for HTML

SAP GUI for HTML 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/14/1104996.html An ITS implementation model for SAP Internet Applications that emulates R/3 transaction screen dynamically in a Web browser. ----------------------分隔线上面是 SAP 标准文档中提

SAP GUI里Screen Painter的工作原理

我们在SAP GUI里双击一个screen编号: 单击Layout按钮可以打开Screen Painter: 这背后的工作原理是什么? 是这个RFC destination在起作用: Connection Type为T,当Layout按钮被点击后,通过TCP/IP通知执行文件gnetx.exe: 从任务管理器里能查看到这个执行文件的进程: 要获取更多Jerry的原创文章,请关注公众号"汪子熙": 原文地址:https://www.cnblogs.com/sap-jerry/p/9821