使用Python完成SAP客户端的打开和系统登陆功能

 更新时间:2022年5月31日 15:36  点击:286 作者:NewJune

最近小爬一直思忖着如何将以前写的一些半自动化程序转为全自动化,这其中就涉及到SAP的打开和登录过程。我们都知道,SAP原生的“脚本录制和回放”功能是在用户进入到某一个SAP”用户指定系统“后才可以启用:

也就是说,从这里开始,您可以通过脚本录制,生成用户名、密码的输入和SAP登录过程的完整代码;

那么我们的重点就转到了,如何通过Python完成SAP应用程序的打开并进入特定的”用户指定系统“,比如下图中红圈所示系统:

  PS:由于SAP启动后选择不同的视图,界面会略有不同,下面演示的方法是在”浏览器视图“、”工作区视图“以及“树视图”下演示的,其他启动视图下无效,所以如果您希望下面提到的方法在您电脑上生效,请务必确保您登陆后视图属于上面提到的视图中的一种。庆幸的是,SAP客户端会记录您的用户习惯,一旦您完成默认浏览视图的设定,下次程序启动时,程序会默认使用此视图。

程序需要首先完成SAP 应用程序的自动启动,python中的方法有很多种,我用到的方法如下:

 sap_app = r"C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe" #您的saplogon程序本地完整路径
    subprocess.Popen(sap_app)

然后是用python完成激活SAP“指定用户系统”,这里需要您的python安装win32com等组件,附上官方下载地址:pywin32 224

有了它,我们可以轻易通过python来连接本地的win32程序并通过捕获相应句柄来控制对应的窗口。当然,我们还要借助MicrosoftSpy++来捕获各个窗口的句柄、ID、类、文本等关键信息,用以简化我们的编程过程。

大体思考过程如下:

比如我现在要进入“R3生产系统”,SAP程序打开后,会默认高亮基于排名规则的第一位的系统,而我们的目标系统“位于第二位,(您可以通过修改排序手段、配合”名称字段“的修改,让您希望的系统默认排在第一位,不过小爬没有这样做),小爬尝试去捕获”R3生产系统“这个元素的句柄,然后完成双击操作,可惜通过win32gui.FindWindow、win32gui.FindWindowEx等都未能定位到它,如果您这样做成功了,也欢迎您留言告知。

我们不妨试试一个更简单直接的方法,对照上图,先捕获到③过滤器的句柄,使用sendmessage方法输入过滤条件(要登陆的系统名称),激活该条件,此时我们的目标系统②就会自然处于第一位且被”高亮“,然后我们捕获左上角①(登陆)的句柄,单击它进入到系统登陆界面,后续的登陆代码通过原生的SAP脚本录制方法得到,您也可以使用”Tracker“工具来快速录制出python下可用的SAP自动化代码(小爬之前的文章中简要介绍过该工具);

PS:

程序中要考虑SAP的启动、系统双击打开等都需要一定的时间消耗,所以要添加延迟来解决,而延迟时间的长短可以通过while True的循环配合Try except方法来灵活调整,整个过程用python实现是这样的:

#-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生产系统")
    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的状态后再退回sap首页的过程"""
    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-------------------------------------------------------------------

到此这篇关于使用Python完成SAP客户端的打开和系统登陆的文章就介绍到这了,更多相关Python SAP登陆内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://www.cnblogs.com/new-june/p/11151458.html

[!--infotagslink--]

相关文章

  • python opencv 画外接矩形框的完整代码

    这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • 最炫Python烟花代码全解析

    2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
  • python中numpy.empty()函数实例讲解

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • python-for x in range的用法(注意要点、细节)

    这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • python实现b站直播自动发送弹幕功能

    这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
  • python Matplotlib基础--如何添加文本和标注

    这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • python 计算方位角实例(根据两点的坐标计算)

    今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
  • python实现双色球随机选号

    这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
  • python中使用np.delete()的实例方法

    在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
  • 使用Python的pencolor函数实现渐变色功能

    这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
  • python自动化办公操作PPT的实现

    这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
  • Python getsizeof()和getsize()区分详解

    这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20
  • 解决python 两个时间戳相减出现结果错误的问题

    这篇文章主要介绍了解决python 两个时间戳相减出现结果错误的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-12
  • python实现学生通讯录管理系统

    这篇文章主要为大家详细介绍了python实现学生通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-25
  • PyTorch一小时掌握之迁移学习篇

    这篇文章主要介绍了PyTorch一小时掌握之迁移学习篇,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-08
  • Python绘制的爱心树与表白代码(完整代码)

    这篇文章主要介绍了Python绘制的爱心树与表白代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-06