RPAを使用してSAPシステムの清算操作で選択した表に指定された行を処理する

5082 ワード

SAPシステムでいくつかの清算操作を行う場合、金額の要約(黄色の行)が負の数と0の項目だけを選択して清算することを要求する.効果は図のように:SAPの中で1つの方法で指定の行を選択することができる.
import sys
import win32com.client

SapGuiAuto = win32com.client.GetObject("SAPGUI")
application = SapGuiAuto.GetScriptingEngine
connection = application.Children(0)
session = connection.Children(0)  #   SAP  

e = session.findByID('wnd[0]/usr/cntlGRID1/shellcont/shell')  #   SAP  
e.selectedRows = '1'

複数行を選択するには、次のように書く必要があります.
e.selectedRows = '1,2,3,5'

連続する行の場合は、次のように簡単です.
e.selectedRows = '1-5'

効果を見てみましょう.
完璧です.また、この選択行は0から始まることを知っています.
テーブルが大きい場合、テーブルの後ろの部分がロードされていないため、e.selectedRowsを直接実行しても効果がないため、ページをめくる必要があります.最後のページに戻ると、必要な行をすべて選択できます.
ページをめくる部分のコードは次のとおりです.
import ubpa.ikeyboard as ikeyboard

row = e.rowCount  #   
print(row // 44)  #        ,44          

for j in range(row // 44):
    ikeyboard.key_send_cs(text='{PGDN}',waitfor=10)
    time.sleep(0.4)

より優れたページをめくる方法があります.http://support.isearch.com.cn...そのためpagedownでページをめくるのはやめたほうがいいです.
次に、アルゴリズムの設計を開始します.
3つのリストが必要です.1つの預金金額の要約がある行数、1つの預金金額の要約があるマーク(こちらでは金額が負と0のマークを負、金額を正のマークを正)、すべての負のマークを保存するインデックスが必要です.それぞれindex、type_と名付けられましたindex、need_index
①まず、証憑番号に基づいて表全体を巡回し、証憑番号が空の行のインデックスを最初のリストに追加します.これが金額要約の行数です.
for i in range(e.rowCount - 1):
    value = e.getCellValue(i, e.columnOrder(0))
    if value == '':
        index.append(i)

②次に、各金額の要約にマークを付けて、2番目のリストに保存します.
for i in index:
    if e.getCellValue(i, e.columnOrder(12)).endswith('-') or e.getCellValue(i, e.columnOrder(12)) == '0.00':
        type_index.append('-')
    else:
        type_index.append('+')

③次に、2番目のリストのタグを判断し、負の場合はそのインデックスと前のインデックスの間の値をとり、条件に合致するすべての値を3番目のリストに追加します.
if type_index[0] == '+':
    for i in range(len(type_index)):
        if type_index[i] == '-':
            if index[i - 1] + 1 == index[i] - 1:  #                
                need_index.append(str(index[i - 1] + 1))
            else:
                need_index.append(str(index[i - 1] + 1) + '-' + str(index[i] - 1))
elif type_index[0] == '-':  #                    
    if index[0] == 1:  #              
        need_index.append('0')
    else:
        need_index.append('0-' + str(index[0] - 1))
    for i in range(len(type_index) - 1):
        if type_index[i + 1] == '-':
            if index[i] + 1 == index[i + 1] - 1:
                need_index.append(str(index[i]+1))
            else:
                need_index.append(str(index[i] + 1) + '-' + str(index[i + 1] - 1))

④need_indexには、選択する必要があるすべてのローが含まれています.次に、必要な文字列フォーマットにします.
e.selectedRows = ','.join(need_index)

アルゴリズムの時間の複雑さはやはり少し高くて、もしあなた达がもっと良い構想があれば分かち合うことができます
完全なコード
import sys
import win32com.client
import time
import ubpa.ikeyboard as ikeyboard

SapGuiAuto = win32com.client.GetObject("SAPGUI")
application = SapGuiAuto.GetScriptingEngine
connection = application.Children(0)
session = connection.Children(0)  #   SAP  

e = session.findByID('wnd[0]/usr/cntlGRID1/shellcont/shell')  #   SAP  

f = e.columnCount  #   
row = e.rowCount  #   
print('     {},     {}'.format(row, f))
print('-' * 20)
print(int(row / 44)) #       

for j in range(int(row / 44)):
    ikeyboard.key_send_cs(text = '{PGDN}',waitfor = 10)
    time.sleep(0.4)

index = [] #         
type_index = [] #          ,  0      
need_index = [] #       

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

print('            {},        {}'.format(index, len(index)))
print('-'*20)

for i in index:
    if e.getCellValue(i, e.columnOrder(12)).endswith('-') or e.getCellValue(i, e.columnOrder(12)) == '0.00':
        type_index.append('-')
    else:
        type_index.append('+')

if type_index[0] == '+':
    for i in range(len(type_index)):
        if type_index[i] == '-':
            if index[i - 1] + 1 == index[i] - 1:
                need_index.append(str(index[i - 1] + 1))
            else:
                need_index.append(str(index[i - 1] + 1) + '-' + str(index[i]-1))
elif type_index[0] == '-':
    if index[0] == 1:
        need_index.append('0')
    else:
        need_index.append('0-' + str(index[0] - 1))
    for i in range(len(type_index) - 1):
        if type_index[i + 1] == '-':
            if index[i] + 1 == index[i + 1] - 1:
                need_index.append(str(index[i] + 1))
            else:
                need_index.append(str(index[i] + 1) + '-' + str(index[i + 1] - 1))
                
e.selectedRows = ','.join(need_index)

原文リンク:https://support.i-search.com.cn/article/1542766504938