使用RPA处理SAP系统清账操作中选表格指定的行

SAP 系统中进行某些清账操作时,要求只选中金额汇总(黄色的行)为负数和 0 的项目进行清账,效果如图所示:

SAP 中有一个方法可以选中指定的行:

 1 import sys
 2 import win32com.client
 3
 4 SapGuiAuto = win32com.client.GetObject("SAPGUI")
 5 application = SapGuiAuto.GetScriptingEngine
 6 connection = application.Children(0)
 7 session = connection.Children(0)  # 连接SAP服务
 8
 9 e = session.findByID(‘wnd[0]/usr/cntlGRID1/shellcont/shell‘)  # 获取SAP表格
10 e.selectedRows = ‘1‘

如果要选中多行只需要这样写:

e.selectedRows = ‘1,2,3,5‘

如果是连续的行可以更简单:

e.selectedRows = ‘1-5‘

我们运行看一下效果:

需要注意一点,如果表很大时,表后面的部分没有加载,所以直接运行 e.selectedRows 没有效果,因此必须翻页,当翻到最后一页时运行就可以把需要的行都选中了。

翻页部分代码如下:

1 import ubpa.ikeyboard as ikeyboard
2
3 row = e.rowCount # 行数
4 print(row // 44) # 需要翻页的次数,44为当前页面显示的行数
5
6 for j in range(row // 44):
7     ikeyboard.key_send_cs(text=‘{PGDN}‘,waitfor=10)
8     time.sleep(0.4)

现在有个更优秀的翻页方法:http://support.isearch.com.cn/article/1544495156668
因此还是建议少用 pagedown 进行翻页。

下面开始设计算法:

我们需要三个列表,一个存金额汇总所在的行数,一个存每个金额汇总的标记(这边把金额为负和 0 的标记为负号,把金额为正的标记为正号),一个存所有负号的索引。分别命名为 index、type_index、need_index

①首先根据凭证编号遍历整张表,并把凭证编号为空行的索引加入到第一个列表中,这个就是金额汇总所在的行数:

1 for i in range(e.rowCount - 1):
2     value = e.getCellValue(i, e.columnOrder(0))
3     if value == ‘‘:
4         index.append(i)    

②然后给每个金额汇总打上标记并存入第二个列表中:

1 for i in index:
2     if e.getCellValue(i, e.columnOrder(12)).endswith(‘-‘) or e.getCellValue(i, e.columnOrder(12)) == ‘0.00‘:
3         type_index.append(‘-‘)
4     else:
5         type_index.append(‘+‘)    

③接下来只要判断第二个列表中的标记,如果为负就取这个索引与上一个索引中间的值,把所有符合条件的值都加入到第三个列表中:

 1 if type_index[0] == ‘+‘:
 2     for i in range(len(type_index)):
 3         if type_index[i] == ‘-‘:
 4             if index[i - 1] + 1 == index[i] - 1:  # 如果两个金额汇总之间只隔了一行
 5                 need_index.append(str(index[i - 1] + 1))
 6             else:
 7                 need_index.append(str(index[i - 1] + 1) + ‘-‘ + str(index[i] - 1))
 8 elif type_index[0] == ‘-‘:  # 第一个金额汇总为负号的话情况稍微复杂点
 9     if index[0] == 1:  # 第一个金额汇总前面只有一行
10         need_index.append(‘0‘)
11     else:
12         need_index.append(‘0-‘ + str(index[0] - 1))
13     for i in range(len(type_index) - 1):
14         if type_index[i + 1] == ‘-‘:
15             if index[i] + 1 == index[i + 1] - 1:
16                 need_index.append(str(index[i]+1))
17             else:
18                 need_index.append(str(index[i] + 1) + ‘-‘ + str(index[i + 1] - 1))

④need_index 现在包含了所有需要选择的行,接下来把它变成我们需要的字符串格式:

e.selectedRows = ‘,‘.join(need_index)

算法的时间复杂度还是高了点,如果你们有更好的思路也可以分享出来

完整代码

 1 import sys
 2 import win32com.client
 3 import time
 4 import ubpa.ikeyboard as ikeyboard
 5
 6 SapGuiAuto = win32com.client.GetObject("SAPGUI")
 7 application = SapGuiAuto.GetScriptingEngine
 8 connection = application.Children(0)
 9 session = connection.Children(0)  # 连接SAP服务
10
11 e = session.findByID(‘wnd[0]/usr/cntlGRID1/shellcont/shell‘)  # 获取SAP表格
12
13 f = e.columnCount  # 列数
14 row = e.rowCount  # 行数
15 print(‘表格行数为{},表格列数为{}‘.format(row, f))
16 print(‘-‘ * 20)
17 print(int(row / 44)) #需要翻页的次数
18
19 for j in range(int(row / 44)):
20     ikeyboard.key_send_cs(text = ‘{PGDN}‘,waitfor = 10)
21     time.sleep(0.4)
22
23 index = [] #金额汇总所在的行数
24 type_index = [] #每个金额汇总的正负值,若为0也标记为负值
25 need_index = [] #所有负值的索引
26
27 for i in range(e.rowCount - 1):
28     value = e.getCellValue(i, e.columnOrder(0))
29     if value == ‘‘:
30         index.append(i)
31
32 print(‘每个金额汇总所在的索引为{},总共的客户数量为{}‘.format(index, len(index)))
33 print(‘-‘*20)
34
35 for i in index:
36     if e.getCellValue(i, e.columnOrder(12)).endswith(‘-‘) or e.getCellValue(i, e.columnOrder(12)) == ‘0.00‘:
37         type_index.append(‘-‘)
38     else:
39         type_index.append(‘+‘)
40
41 if type_index[0] == ‘+‘:
42     for i in range(len(type_index)):
43         if type_index[i] == ‘-‘:
44             if index[i - 1] + 1 == index[i] - 1:
45                 need_index.append(str(index[i - 1] + 1))
46             else:
47                 need_index.append(str(index[i - 1] + 1) + ‘-‘ + str(index[i]-1))
48 elif type_index[0] == ‘-‘:
49     if index[0] == 1:
50         need_index.append(‘0‘)
51     else:
52         need_index.append(‘0-‘ + str(index[0] - 1))
53     for i in range(len(type_index) - 1):
54         if type_index[i + 1] == ‘-‘:
55             if index[i] + 1 == index[i + 1] - 1:
56                 need_index.append(str(index[i] + 1))
57             else:
58                 need_index.append(str(index[i] + 1) + ‘-‘ + str(index[i + 1] - 1))
59
60 e.selectedRows = ‘,‘.join(need_index)

原文链接:https://support.i-search.com.cn/article/1542766504938

原文地址:https://www.cnblogs.com/isearch/p/11846944.html

时间: 2024-08-01 22:56:21

使用RPA处理SAP系统清账操作中选表格指定的行的相关文章

SAP系统的核心模块

SAP系统核心模块都有哪些?SAP全套15模块(ABAP.BASIS.CRM.CO.FI.MM.PLM.PM.PP.WM.BW.HR.PS.QM.SD) --资料来自网络 SAP公司于1972年在德国创立,初创时的五人公司(SystemalyseundProgrammentwicklung),即为今日的 SAP(Systems,Applications,andProductsinDataProcessing)的前身.SAP定位以企业的角度研发企业应用软件为主,为全球企业应用软件供应商,在全球企业

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 win32c

终于将SAP系统完全配置通过了

花了近10天的时间,每天晚上加班加点,终于将SAP S4 1610 IDES系统从零到有,从头到位配置一遍.目前只启用了一家模拟公司,从基础数据的设置,到销售订单开立(含按单按库需求),跑MRP需求,开立生产订单和采购订单,收货与报工,发料和发货,开票和发票校验,产生的财务凭证也都完全正确!不得不说,过程还是挺艰辛的,但收获极多. 很早之前就想这么干了,但一直没有很合适的时机.整套系统配置下来,记录了三十多个比较大的错误,也都有解决方式.问题主要集中在生产和成本这两个模块,可以说在S4上面都有所

SAP系统修改参数

文章为原创,转载请联系我,欢迎交流[email protected] SAP系统有各项参数可根据实际情况做调整.如dialog进程的数量,默认登录客户端.默认登录语言等等,参数十分多,可调的空间也很大.下面介绍在GUI中怎么参数文件.(不建议直接在操作系统层面直接更改DEFAULT.PFL) T-code:rz10 如果在点击选择之后参数文件不存在,需要先导入参数文件. 导入完成后可以看到参数文件 点击"修改" 点击"新建参数"如下图: 填入需要增加的参数名称和参数

(转)金蝶KIS迷你版、标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系”

金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司联系” 2013-07-10 12:17:51|  分类: 金蝶专题|举报|字号 订阅 金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司的技术支持机构联系” 问题描述:厦门金蝶KIS迷你版.标准版在查询数量金额明细账时提示“发生未知错误,系统当前操作被取消,请与金蝶公司的技术支持机构联系”.但是选择“确定”后仍然可以查询到数据.问题原因: GLQty

SAP系统更改小数点显示问题

在SAP系统中会出现小数点显示的问题,比如123.12,正常情况下是这样显示,但SAP系统是德国的出的系统,德国的书写数字的习惯是将小数点“.”写成“,”逗号,显示为:123,12 这个问题可以使用事务代码SU3来更改,更改步骤如下: 更改十进制计数法就可以了,但要将SAP所有窗口关掉,重新打开就可以生效了

SAP系统更新模块

SAP 系统中,一些单据保存到数据库用的是 update mudule function. 命名是ME_UPDATE_* (业务说明) 例:PR save module: ME_UPDATE_REQUISITION ME_UPDATE_INFORECORD   更新采购主记录数据 ME_UPDATE_AGREEMENT_PO更新采购凭证 ME_UPDATE_SCHEDULE_EKPO计划协议下达 ME_UPDATE_DELIVERY       更新采购凭证 ??? 一些增强如果可以在单据保存时

怎样用U盘装系统的操作

怎样用U盘装系统的操作 1.http://jingyan.baidu.com/article/642c9d34b26392644b46f776.html 2.http://jingyan.baidu.com/album/c45ad29cd23551051753e23a.html?picindex=3 3.http://zhidao.baidu.com/link?url=asmMZ-JQYrlOWd2jf-EgrIPFNITwPgCSuomLfDnasDYHkBoqvIPqMC4tGkV5Cjn5

SAP系统里有很多用来控制密码的参数

SAP系统里有很多用来控制密码的参数,例如: 1.login/password_max_idle_initial  这些参数可以用来控制比如初始密码多久没登录会过期 2.login/password_max_idle_productive productive密码(就是管理员初始化以后用户自己改过的密码)多久不登录会过期 3.login/password_history_size 用户改密码时不可以用最近几次曾用过的密码 转载于SAP学习门户网,原文链接:http://www.sap6.com/