Python結合SAP GUI Script操做sap的簡易教程

  衆所周知,若是要用Python作一些桌面WIN32應用的自動化工做,就須要用到著名的pywin32尤爲是其中的win32com.client模塊,pywin32的安裝不能直接經過pip install方法,奉上pywin32的官方github連接:https://github.com/mhammond/pywin32/releases。選擇與桌面系統版本、python版本對應的版本安裝便可:java

若是一切正常,在Ipython中導入該模塊時不會報異常!如:python

In [1]: import win32com.clientgit

接下拉就是創建與sap GUI的鏈接,以下:github

 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代碼中便可!shell

須要強調的是,腳本錄製功能並不會記錄下全部鼠標鍵盤操做,過程當中若是有些窗口是操做系統自己窗口,依舊須要結合windows句柄的捕獲、結合sendmessage、postmessage等win32 API函數來處理。windows

固然,還須要查閱sap gui script的幫助文件,裏面會列出全部的sap底層對象的屬性、方法、對應的參數類型、數量等,界面以下:api

在個人一項實際工做中,須要得到一個shell表單的某個相似於excel 單元格的值,表格是ALV格式的,可是實際錄製中無法錄製到單元格值,也許你絞盡腦汁,最後經過其餘方法(好比 用sendkey結合 ctrl + Y,CTRL + C)達到了一樣的效果,可是筆者依然推薦用sap script 原生的API來解決。經過查閱SAP GUI知道它屬於「GuiGridView Object」,具備方法「GetCellValue Method」,方法以下:session

Public Function GetCellValue( _
   ByVal Row As Long, _
   ByVal Column As String _
) As String

  其中column參數爲字符串string類型,經過錄制sap腳本,雙擊對應能夠錄製到列名稱,一般錄製代碼相似:app

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:一、實際的sap腳本錄製過程,會錄製大量諸如 setfocus,caretposition,resizeWorkingPane等對程序無實際幫助的語句,爲了提高程序執行效率,建議對錄製的腳本語句進行適當註釋和刪除;

二、本文部分sap script api語句用的VB,須要適當修改才能運用到python中。

相關文章
相關標籤/搜索