1. 程式人生 > >Python結合SAP GUI Script操作sap的簡易教程

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

錄制 include order cap 得到 __name__ get spa image

  眾所周知,如果要用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的連接,如下:

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

技術分享圖片

需要強調的是,腳本錄制功能並不會記錄下所有鼠標鍵盤操作,過程中如果有些窗口是操作系統本身窗口,依舊需要結合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“的簡單示例,供參考:

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

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

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