使用Python完成SAP客戶端的打開(kāi)和系統(tǒng)登陸功能
最近小爬一直思忖著如何將以前寫的一些半自動(dòng)化程序轉(zhuǎn)為全自動(dòng)化,這其中就涉及到SAP的打開(kāi)和登錄過(guò)程。我們都知道,SAP原生的“腳本錄制和回放”功能是在用戶進(jìn)入到某一個(gè)SAP”用戶指定系統(tǒng)“后才可以啟用:

也就是說(shuō),從這里開(kāi)始,您可以通過(guò)腳本錄制,生成用戶名、密碼的輸入和SAP登錄過(guò)程的完整代碼;
那么我們的重點(diǎn)就轉(zhuǎn)到了,如何通過(guò)Python完成SAP應(yīng)用程序的打開(kāi)并進(jìn)入特定的”用戶指定系統(tǒng)“,比如下圖中紅圈所示系統(tǒng):



PS:由于SAP啟動(dòng)后選擇不同的視圖,界面會(huì)略有不同,下面演示的方法是在”瀏覽器視圖“、”工作區(qū)視圖“以及“樹(shù)視圖”下演示的,其他啟動(dòng)視圖下無(wú)效,所以如果您希望下面提到的方法在您電腦上生效,請(qǐng)務(wù)必確保您登陸后視圖屬于上面提到的視圖中的一種。慶幸的是,SAP客戶端會(huì)記錄您的用戶習(xí)慣,一旦您完成默認(rèn)瀏覽視圖的設(shè)定,下次程序啟動(dòng)時(shí),程序會(huì)默認(rèn)使用此視圖。

程序需要首先完成SAP 應(yīng)用程序的自動(dòng)啟動(dòng),python中的方法有很多種,我用到的方法如下:
sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" #您的saplogon程序本地完整路徑
subprocess.Popen(sap_app)然后是用python完成激活SAP“指定用戶系統(tǒng)”,這里需要您的python安裝win32com等組件,附上官方下載地址:pywin32 224

有了它,我們可以輕易通過(guò)python來(lái)連接本地的win32程序并通過(guò)捕獲相應(yīng)句柄來(lái)控制對(duì)應(yīng)的窗口。當(dāng)然,我們還要借助MicrosoftSpy++來(lái)捕獲各個(gè)窗口的句柄、ID、類、文本等關(guān)鍵信息,用以簡(jiǎn)化我們的編程過(guò)程。

大體思考過(guò)程如下:

比如我現(xiàn)在要進(jìn)入“R3生產(chǎn)系統(tǒng)”,SAP程序打開(kāi)后,會(huì)默認(rèn)高亮基于排名規(guī)則的第一位的系統(tǒng),而我們的目標(biāo)系統(tǒng)“位于第二位,(您可以通過(guò)修改排序手段、配合”名稱字段“的修改,讓您希望的系統(tǒng)默認(rèn)排在第一位,不過(guò)小爬沒(méi)有這樣做),小爬嘗試去捕獲”R3生產(chǎn)系統(tǒng)“這個(gè)元素的句柄,然后完成雙擊操作,可惜通過(guò)win32gui.FindWindow、win32gui.FindWindowEx等都未能定位到它,如果您這樣做成功了,也歡迎您留言告知。
我們不妨試試一個(gè)更簡(jiǎn)單直接的方法,對(duì)照上圖,先捕獲到③過(guò)濾器的句柄,使用sendmessage方法輸入過(guò)濾條件(要登陸的系統(tǒng)名稱),激活該條件,此時(shí)我們的目標(biāo)系統(tǒng)②就會(huì)自然處于第一位且被”高亮“,然后我們捕獲左上角①(登陸)的句柄,單擊它進(jìn)入到系統(tǒng)登陸界面,后續(xù)的登陸代碼通過(guò)原生的SAP腳本錄制方法得到,您也可以使用”Tracker“工具來(lái)快速錄制出python下可用的SAP自動(dòng)化代碼(小爬之前的文章中簡(jiǎn)要介紹過(guò)該工具);

PS:
程序中要考慮SAP的啟動(dòng)、系統(tǒng)雙擊打開(kāi)等都需要一定的時(shí)間消耗,所以要添加延遲來(lái)解決,而延遲時(shí)間的長(zhǎng)短可以通過(guò)while True的循環(huán)配合Try except方法來(lái)靈活調(diào)整,整個(gè)過(guò)程用python實(shí)現(xiàn)是這樣的:
#-Begin-----------------------------------------------------------------
#-Includes--------------------------------------------------------------
import sys, win32com.client
import win32api,win32gui,win32con,win32ui,time,os,subprocess
#-Sub Main--------------------------------------------------------------
def Main():
sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" #您的saplogon程序本地完整路徑
subprocess.Popen(sap_app)
time.sleep(1)
flt=0
while flt==0:
try:
hwnd = win32gui.FindWindow(None,"SAP Logon 740")
flt=win32gui.FindWindowEx(hwnd,None,"Edit", None) #capture handle of filter
except:
time.sleep(0.5)
win32gui.SendMessage(flt,win32con.WM_SETTEXT,None,"R3生產(chǎn)系統(tǒng)")
win32gui.SendMessage(flt,win32con.WM_KEYDOWN,win32con.VK_RIGHT,0)
win32gui.SendMessage(flt,win32con.WM_KEYUP,win32con.VK_RIGHT,0)
time.sleep(0.1)
dlg = win32gui.FindWindowEx(hwnd,None,"Button", None) #登陸(0)
win32gui.SendMessage(dlg,win32con.WM_LBUTTONDOWN,0)
win32gui.SendMessage(dlg,win32con.WM_LBUTTONUP,0)
SapGuiAuto = win32com.client.GetObject("SAPGUI")
if not type(SapGuiAuto) == win32com.client.CDispatch:
return
application = SapGuiAuto.GetScriptingEngine
if not type(application) == win32com.client.CDispatch:
SapGuiAuto = None
return
connection = application.Children(0)
if not type(connection) == win32com.client.CDispatch:
application = None
SapGuiAuto = None
return
time.sleep(2)
flag=0
while flag==0:
try:
session = connection.Children(0)
flag=1
except:
time.sleep(0.5)
if not type(session) == win32com.client.CDispatch:
connection = None
application = None
SapGuiAuto = None
return
session.findById("wnd[0]/usr/txtRSYST-BNAME").text = "username" #此次放入您的SAP登陸用戶名
session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = "password" #此次放入您的SAP登陸密碼
session.findById("wnd[0]").sendVKey(0)
"""下面演示了使用mm03查看物料1000000000000的狀態(tài)后再退回sap首頁(yè)的過(guò)程"""
session.findById("wnd[0]/tbar[0]/okcd").text = "mm03"
session.findById("wnd[0]").sendVKey(0)
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "1000000000000"
session.findById("wnd[0]").sendVKey(0)
session.findById("wnd[1]").sendVKey(0)
session.findById("wnd[0]/tbar[0]/okcd").text = "/n"
session.findById("wnd[0]").sendVKey(0)
#>Insert your SAP GUI Scripting code here<
#-Main------------------------------------------------------------------
if __name__ == "__main__":
Main()
#-End-------------------------------------------------------------------到此這篇關(guān)于使用Python完成SAP客戶端的打開(kāi)和系統(tǒng)登陸的文章就介紹到這了,更多相關(guān)Python SAP登陸內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python利用Django如何寫restful api接口詳解
這篇文章主要給大家介紹了關(guān)于Python利用Django如何寫restful api接口的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
python 動(dòng)態(tài)獲取當(dāng)前運(yùn)行的類名和函數(shù)名的方法
這篇文章主要介紹了python 動(dòng)態(tài)獲取當(dāng)前運(yùn)行的類名和函數(shù)名的方法,分別介紹使用內(nèi)置方法、sys模塊、修飾器、inspect模塊等方法,需要的朋友可以參考下2014-04-04
詳解python實(shí)現(xiàn)讀取郵件數(shù)據(jù)并下載附件的實(shí)例
這篇文章主要介紹了詳解python讀取郵件數(shù)據(jù)并下載附件的實(shí)例的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下2017-08-08
python subprocess pipe 實(shí)時(shí)輸出日志的操作
這篇文章主要介紹了python subprocess pipe 實(shí)時(shí)輸出日志的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
關(guān)于Python的GPU編程實(shí)例近鄰表計(jì)算的講解
本文主要講解了Python的GPU編程實(shí)例近鄰表計(jì)算,通過(guò)一個(gè)近鄰表計(jì)算的案例,給出了適用于GPU加速的計(jì)算場(chǎng)景。需要了解的朋友可以參考一下這篇文章2021-08-08
使用python將圖片按標(biāo)簽分入不同文件夾的方法
今天小編就為大家分享一篇使用python將圖片按標(biāo)簽分入不同文件夾的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

