讨论过如何利用工具Scripting Tracker录制python操纵SAP GUI的py脚本。软件的录制和生成的代码界面如下:

场景一:实际业务中,除了一些常规步骤,我们可能会驱动SAP GUI中的一些布局,改变数据的展现形式,如:

譬如这段点击“选择布局”,选中“/GX发出商品"布局的操作,我们用工具得到的python代码如下:

session.findById("wnd[0]/tbar[1]/btn[33]").press() # 点击”选择布局"按钮

session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").setCurrentCell(14, "TEXT") # 选中某个单元格

session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").firstVisibleRow = 3 # 驱动纵向滚动条

session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").selectedRows = "14" # 选中第15行

session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").clickCurrentCell()  # 单击选中的单元格

通过观察实际界面可知,我们要的“/GX发出商品"属于从上至下的第15个布局(索引号从0开始,因此这里的索引号应该是14),但是考虑到很多用户都有权限去设置布局或者变式,导致我们的自动化脚本如果直接以索引号来定位某个布局的做法,非常不稳定,易出错。更稳妥的做法是基于变式的“名称”,这个名称具备唯一性,哪怕将来有新增的布局,或者用户排版布局所用到的排序变了,我们依然可以通过布局的名称来定位它。

通过SAP GuiContainerShell的rowCount和visibleRowCount属性,可以分别得到该布局的shell对应的行数和 可见行数,我们遍历所有的行,然后根据 每个cell的getCellValue方法就能拿到布局的名称,最终找到相应的布局。代码就可以这样写:

session.findById("wnd[0]/tbar[1]/btn[33]").press() #点击”选择布局"按钮

e=session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell")

row_count=e.rowCount

variant="" #变式

for i inrange(row_count):

variant=e.getCellValue(i,"VARIANT")if variant=="/GX发出商品":

e.setCurrentCell(i,"VARIANT") #选中某个单元格

e.clickCurrentCell()if variant=="":print("该布局中没有找到“/GX发出商品”变式,请核实!")

录制代码中以下这两行,在实际中,可以省略,不影响代码的执行:

session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").firstVisibleRow = 3 #驱动纵向滚动条

session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").selectedRows = "14" #选中第15行

场景二:实际业务中,我们可能会碰到这种行数不固定,节点可以逐级展开的sap 界面,我们又该如何取到对应节点对应字段的值呢?

我们逐级展开节点到想要的位置,然后,选中某个值的过程,用tracker录制得到python代码,形式类如:

session.findById("wnd[0]").resizeWorkingPane(234, 40, 0)

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").expandNode("339")

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").expandNode("576")

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").expandNode("608")

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").expandNode("612")

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").expandNode("613")

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").selectItem("614", "C 1")

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").ensureVisibleHorizontalItem("614", "C 1")

session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]").topNode = "2"

这结构,每一个cell可以看作是一个Item对象,我们可以用sap GUI Scripting API手册查到它的GetItemText方法:

这里的Key 和Name就是上面录制得到的脚本中的("        614","C          1")形式:

由于这种含可展开节点的SAP GUI界面,行数都是不确定的,为了一劳永逸,我们还是要先动态得到 key,再基于Key Name,依据getItemText方法,得到节点的名称,如果跟我们要的节点名一样,我们就可找到 对应节点的 其他字段的值。

于是关键问题演化成了,这个"        614"的key是怎么来的,我们大胆猜测,它就是一个变化的数字,前面填充空格,实际的几次试错后,小爬发现这个空格数不是固定的,而Key的长度是却固定的。

所以,我们先用字符串的len("        614")方法得到key的长度为11,假如key中的数字 i 从1往1000(假定最大值不超过1000)变,我们可以计算其长度len(str(i)),来得到该填充的空格数,我们把整个界面用循环遍历一遍,接下来代码验证开始:

col1_value="";col2_value="";col3_value="";node_name=""e=session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]")for i in range(1,1000): #这里如果不清楚具体有多少行,可以设置一个很大的数,最后break跳出循环即可

node_name = e.getItemText(" "*(11-len(str(i)))+str(i), "&Hierarchy") #索引号总共11位,除了数字,开头用多个空格符补齐,数字位数越大,则要补的空格越少

if node_name == "损益表":

col1_value=e.getItemText(" "*(11-len(str(i)))+str(i), "C 1")

col2_value=e.getItemText(" "*(11-len(str(i)))+str(i), "C 3")

col3_value=e.getItemText(" "*(11-len(str(i)))+str(i), "C 5")#我们要获取 含“存货变动”关键字的 科目的cmp金额

elif "存货变动" innode_name:

cmp_value=e.getItemText(" "*(11-len(str(i)))+str(i), "C 5")if col1_value!="" and col2_value!="" and col3_value!="":break

(更新日期:2020-05-31 :感谢评论区的童鞋友情提示,这段字符串右对齐,左边补空格的操作,python中有原生的字符串方法支持:str.rjust(width[,fillchar]),同样也有str.ljust(width[,fillchar])方法,上面代码中的的key可以用 str(i).rjust(11) 来快速得到……)

(更新日期:2020-05-31 :上面的代码中,假定的这个GUI Tree有1000个节点,这还不是最严谨的做法,实际上,我们如果想遍历这个tree的所有节点,只需要遍历所有的key,而SAP其实提供了这样的API来得到tree中所有的节点的key)

于是上面的代码可以改为下面更简单,更严谨的方式,每个节点的key值不再需要去构造:

e=session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell[1]")

node_total=len(e.GetAllNodeKeys()) #得到所有的节点的总数

for key ine.GetAllNodeKeys():

node_name=e.getItemText(key, "&Hierarchy")if node_name == "损益表":

col1_value=e.getItemText(key, "C 1")

col2_value=e.getItemText(key, "C 3")

col3_value=e.getItemText(key, "C 5")elif "存货变动" innode_name:

cmp_value=e.getItemText(key, "C 5")if col1_value!="" and col2_value!="" and col3_value!="":break

这段代码完美运行,上面的col1_value,col2_value,col3_value就对应上图中“tot.rpt.pr  tot.cmp.pr  绝对差异”  三个字段的值。从上面的代码可以看出来,我们手工想要看到某个根节点的值,需要对节点逐级展开(expand node),操作非常繁琐,通过python对过程自动化,后台的代码不需要展开节点本身,只要拿到节点的key 和name,我们原则上就可以取到每个节点的Itemtext,非常高效~~~

各位正在研究python-sap自动化的童鞋,一起来get新技能吧~~~

python获取sap数据_Python驱动SAP GUI完成自动化(选择布局+动态获取节点值)相关推荐

  1. python获取sap数据_python 连接 SAP HANA 数据库

    SAP HANA 是SAP 新的内存数据库: 目前学习python数据处理分析,现在想要连接 SAP HANA 数据库, 发现目前python已经发布了连接 SAP HANA的库 pyhddb 1.需 ...

  2. python tushare获取股票数据_Python 金融: TuShare API 获取股票数据 (1)

    多多教Python 金融 是我为金融同行,自由职业投资人 做的一个专栏.这里包含了我自己作为量化交易员,在做研究时所用到的Python技巧和实用案例.这个栏目专业性会比较强:本人29岁,量化工作5年的 ...

  3. python获取erp数据_python自学之路-数据读取

    人家都说人生苦短, 要学Python.我也是看中计算机快速处理数据的优势,非常想学习这门语言,这真要开始了,确实觉得万事开头难,就此记录下这其中点点滴滴. 系统学习有些大海捞针,还是根据自己的实际需要 ...

  4. python获取游戏数据_Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是.........

    原标题:Python 爬取 3 万条游戏评分数据,原来程序员最爱玩的游戏竟然是...... 作者 |量化小白H 责编 | 胡巍巍 本文爬取了豆瓣游戏网站上所有可见的游戏评分数据进行分析,全文包括以下几 ...

  5. python如何获取股票数据_Python|一行代码获取股票数据

    随着金融行业的发展,金融相关的数据变得越来越有价值.股票的历史数据就是一种非常重要的时间序列数据,本文介绍一个不需要自己动手写爬虫就能够获取各个公司的股票信息的Python库--yfinance. 0 ...

  6. python处理金融数据_Python之获取与简单处理金融数据

    Python的功能不可以说不大,在金融数据分析里面有着很方便的应用.本篇文章给大家分享的内容是Python之获取与简单处理金融数据,有着一定的参考价值,有需要的朋友可以参考一下 1.数据获取panda ...

  7. python获取redis数据_Python之操作redis数据库

    使用redis模块 一.操作redis 1.添加信息 (1)直接建key-value信息: 右键-Add New Key,手动添加key和value 右键-Console,打开控制台,写入命令 (2) ...

  8. python分析股票数据_Python股票分析系列——系列介绍和获取股票数据.p1

    本系列转载自youtuber sentdex博主的教程视频内容 https://www.youtube.com/watch?v=19yyasfGLhk&index=4&list=PLQ ...

  9. python获取天气数据_python获取天气数据

    三.具体实现 """ =================================== -*- coding:utf-8 -*- Author :GadyPu E_ ...

最新文章

  1. 18.2 keepalived介绍
  2. Django-内置用户、权限、分组模块
  3. 《微信小程序开发入门精要》——导读
  4. hive与hbase集成
  5. spring容器扩展功能之一:spring加载ApplicationContext.xml的四种方式
  6. 漫步最优化十五——凸函数优化
  7. Linux.CommanlineTool.grep
  8. springboot实现权限列表_SpringBoot+shiro+mybatis+Thymeleaf实现权限登录
  9. DOA算法1:MUSIC算法(二)
  10. 菜鸟的Hadoop快速入门
  11. Cramer`s Rule 克莱姆法则(克拉默法则)
  12. 介绍一个很好的英语学习软件——单词风暴
  13. tableau度量值计算_度量值与度量名称
  14. Linux——Ubuntu使用个给力的镜像,安装软件速度飞快
  15. Exp3 免杀原理与实践 ——20164316张子遥
  16. 10-22- “知人者智,自知者明”(小结)
  17. java计算机毕业设计二手车商城源码+mysql数据库+系统+lw文档+部署
  18. “测不准原理”在计算机领域的体现
  19. 卡西欧电子计算机怎么换电池,卡西欧电池怎么换
  20. 通过下棋理解面向对象。

热门文章

  1. React中实现插槽效果的方案
  2. oracleclient和plsql安装注意事项
  3. 抖音赚钱,新手如何玩转抖音,每天赚300起(连载二十)
  4. 如何学习python量化交易接口的搭建?
  5. 优秀技术Leader应具备的六项能力!
  6. JS实现自定义折叠树节点展开层数
  7. 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针
  8. 2837xd代码生成模块学习(2)——ADC、ePWM模块、Timer0
  9. mysql 乘积函数_mysql函数积累
  10. docker apache php-fpm AH01071: Got error 'Primary script unknown\n'