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

來源:互聯網
上載者:User

標籤:元素   提升   錄製   系統版本   imp   container   pre   pos   clu   

  眾所周知,如果要用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 = None13       SapGuiAuto = None14       return15 16     session = connection.Children(0)17     if not type(session) == win32com.client.CDispatch:18       connection = None19       application = None20       SapGuiAuto = None21       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       return14 15     application = SapGuiAuto.GetScriptingEngine16     if not type(application) == win32com.client.CDispatch:17       SapGuiAuto = None18       return19 20     connection = application.Children(0)21     if not type(connection) == win32com.client.CDispatch:22       application = None23       SapGuiAuto = None24       return25 26     session = connection.Children(0)27     if not type(session) == win32com.client.CDispatch:28       connection = None29       application = None30       SapGuiAuto = None31       return32 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 = None47     connection = None48     application = None49     SapGuiAuto = None50 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的簡易教程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.