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的连接,如下:
SapGuiAuto = win32com.client.GetObject("SAPGUI")
if not type(SapGuiAuto) == win32com.client.CDispatch:
return application = SapGuiAuto.GetScriptingEngine
if not type(application) == win32com.client.CDispatch:
SapGuiAuto = None
return connection = application.Children(0)
if not type(connection) == win32com.client.CDispatch:
application = None
SapGuiAuto = None
return session = connection.Children(0)
if not type(session) == win32com.client.CDispatch:
connection = None
application = None
SapGuiAuto = None
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“的简单示例,供参考:
#-Begin----------------------------------------------------------------- #-Includes--------------------------------------------------------------
import sys, win32com.client #-Sub Main--------------------------------------------------------------
def Main(): try: SapGuiAuto = win32com.client.GetObject("SAPGUI")
if not type(SapGuiAuto) == win32com.client.CDispatch:
return application = SapGuiAuto.GetScriptingEngine
if not type(application) == win32com.client.CDispatch:
SapGuiAuto = None
return connection = application.Children(0)
if not type(connection) == win32com.client.CDispatch:
application = None
SapGuiAuto = None
return session = connection.Children(0)
if not type(session) == win32com.client.CDispatch:
connection = None
application = None
SapGuiAuto = None
return #session.findById("wnd[0]").resizeWorkingPane(65, 19, 0)
session.findById("wnd[0]/tbar[0]/okcd").text = "mm03"
session.findById("wnd[0]").sendVKey(0)
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").Text=""
session.findById("wnd[0]").sendVKey(0)
session.findById("wnd[1]/tbar[0]/btn[0]").press()
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP02").select() except:
print(sys.exc_info()[0]) finally:
session = None
connection = None
application = None
SapGuiAuto = None #-Main------------------------------------------------------------------
if __name__ == "__main__":
Main() #-End-------------------------------------------------------------------
PS:1、实际的sap脚本录制过程,会录制大量诸如 setfocus,caretposition,resizeWorkingPane等对程序无实际帮助的语句,为了提升程序执行效率,建议对录制的脚本语句进行适当注释和删除;
2、本文部分sap script api语句用的VB,需要适当修改才能运用到python中。
Python结合SAP GUI Script操作sap的简易教程的更多相关文章
- sap gui 使用方法, sap logon
1:打断点:在程序保存并激活之后,可以打内部或外部断点. 如图示. 2: display 展示程序,不能修改. 3: 查看创建的类的结构,使用more>display object list ...
- 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
Jerry和SAP成都研究院一些新同事聊天时,谈到ABAP和SAP GUI这个话题.很多新同事在加入SAP成都之前,是做Java和C++开发的,习惯了Eclipse/IntelliJ IDEA/Vis ...
- VBA驱动SAP GUI实现办公自动化(一)
小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...
- VBA驱动SAP GUI完成界面元素值初始化
小爬日常利用VBA完成SAP GUI自动化时,经常被这个问题困扰:我们进入一个事务代码界面时,如FBL1N(供应商行项目显示),很多的 GuiTextField(文本框)对象.GuiCheckBox( ...
- SAP GUI的配置文件
GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...
- SAP GUI SAPLOGON.INI
GUI是SAP系统最常用的客户端,在一台客户机上,利用GUI可以连接多套SAP系统(连接方法参见<客户端连接配置(SAP GUI 710)>),也可以设置多个快捷方式登录(参见<用快 ...
- 更改SAP GUI 登陆背景
您也可以定制初始屏幕(SAP Easy Access): 所有用户的全局设置:o 更改位于初始屏幕右侧的登录 - 如果希望将登录放置在初始屏幕右侧,请按如下处理: 使用事务 SW ...
- Mac OS X 中使用SAP GUI的方法
下载sap gui for mac 730 解压后 安装之前需要去oracle 官网下载jdk 6 然后运行 安装完成后配置登陆端 新建连接时,只需要配置Advanced 页签:勾选Expert Mo ...
- SAP GUI 750 安装包 及 补丁3 共享
SAP GUI 750 安装包 及 补丁3 共享 链接: https://pan.baidu.com/s/1hstkfUs%20 密码: ggbz -------------------------- ...
随机推荐
- Windows Internals 笔记——进程的权限
1.大多数用户都用一个管理员账户来登录Windows,在Vista之前,这样的登录会创建一个安全令牌.每当有代码试图使用一个受保护的安全资源时,操作系统就会出示这个令牌.从包括Windows资源管理器 ...
- jquery动态添加的元素不能直接应用事件方法的时候
对于由 jQuery 动态生成的元素,如用 jQuery 给元素添加 class,或者直接添加一对 p 标签,不能直接绑定常用的事件,如 click.因为这些元素属于动态生成,除非采用 onclick ...
- 使用BITSADMIN下载文件
BITSADMIN /RAWRETURN /TRANSFER D /PRIORITY HIGH http://127.0.0.1:80/file.exe C:\ProgramData\file.exe
- git HEAD detached from origin 问题的解决
这个问题是因为分支选错了,所以说后续的提交都提交到了一个匿名分支之上,整个状态是游离了的 下面说一下我解决问题的步骤 1.查看在游离状态下提交的最新commit号 git branch -v 2.创建 ...
- PAT Basic 1032
1032 挖掘机技术哪家强 (20 分) 为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 ...
- (64)Wangdao.com第十天_JavaScript 对象的 toString() 方法改变输出
JavaScript 对象的 toString() 方法改变输出 在平常,我们 console.log(对象); // 会打印 [Object Object] 但是我们想要更详细的输出,此时,我 ...
- C++类中的Static关键字二
静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问,而静态成员函数可不建立对象就可以被使用. 或者说静态函数与一般函数没有太大的区别,只是访问有限制,静态变量跟一般的全局变量的区别 ...
- 逆向工程-获得IPsearch的注册码
1)运行软件点击File->register 2)随便输入用户名和密码 3)记录弹窗的的关键字 4)发送到PEID查壳 4.1)未找到加密的壳 4.2)发送到OD打开,在反汇编目录下右键菜单找到 ...
- vue发送请求----vue-resource
使用插件vue-resource 官方提供的接口,在vue官网找不到 但在github中可以找到 安装:cnpm install vue-resource --save 第一步:注意要加--save, ...
- 理解es6 中 arrow function的this
箭头函数相当于定义时候,普通函数.bind(this)箭头函数根本没有自己的this,导致内部的this就是定义时候的外层代码块中的this.外层代码块中的this,则取决于执行时候环境上下文cont ...