VBA检测到SAP用户

2020-09-20 02:38发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好!

问题是,我为SAP使用了多个用户,每个用户都可以访问不同的T代码。 因此,我需要vba代码来检测特定用户是否有打开的会话,如果没有为此打开新的会话。

到目前为止,这是我能写的。 此代码将检测是否有打开的SAP会话,否则将打开一个新的SAP会话。 我所缺少的是检测用户(例如GEN1)是否有打开的会话并在该窗口上工作。

设置SapGuiAuto = GetObject(" SAPGUI")

设置SAPApp = SapGuiAuto.GetScriptingEngine

如果SAPApp.Connections.Count()= 0则

调用Shell(" C:\ Program Files(x86)\ SAP \ FrontEnd \ SAPgui \ saplogon.exe",vbNormalFocus)

waitTill = Now()+ TimeValue(" 00:00:05")

While Now()

DoEvents

温特

设置SapGuiAuto = GetObject(" SAPGUI")

设置SAPApp = SapGuiAuto.GetScriptingEngine

设置连接= SAPApp.openconnection(" PRD")

设置会话= Connection.Children(0)

session.findById(" wnd [0]/usr/txtRSYST-MANDT")。Text =" Mandant"

session.findById(" wnd [0]/usr/txtRSYST-BNAME")。Text =" User"

session.findById(" wnd [0]/usr/pwdRSYST-BCODE")。Text =" PW"

session.findById(" wnd [0]/usr/txtRSYST-LANGU")。Text =" EN"

session.findById(" wnd [0]")。sendVKey 0

PS:所有用户都在同一SAP连接中工作= PRD

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好!

问题是,我为SAP使用了多个用户,每个用户都可以访问不同的T代码。 因此,我需要vba代码来检测特定用户是否有打开的会话,如果没有为此打开新的会话。

到目前为止,这是我能写的。 此代码将检测是否有打开的SAP会话,否则将打开一个新的SAP会话。 我所缺少的是检测用户(例如GEN1)是否有打开的会话并在该窗口上工作。

设置SapGuiAuto = GetObject(" SAPGUI")

设置SAPApp = SapGuiAuto.GetScriptingEngine

如果SAPApp.Connections.Count()= 0则

调用Shell(" C:\ Program Files(x86)\ SAP \ FrontEnd \ SAPgui \ saplogon.exe",vbNormalFocus)

waitTill = Now()+ TimeValue(" 00:00:05")

While Now()

DoEvents

温特

设置SapGuiAuto = GetObject(" SAPGUI")

设置SAPApp = SapGuiAuto.GetScriptingEngine

设置连接= SAPApp.openconnection(" PRD")

设置会话= Connection.Children(0)

session.findById(" wnd [0]/usr/txtRSYST-MANDT")。Text =" Mandant"

session.findById(" wnd [0]/usr/txtRSYST-BNAME")。Text =" User"

session.findById(" wnd [0]/usr/pwdRSYST-BCODE")。Text =" PW"

session.findById(" wnd [0]/usr/txtRSYST-LANGU")。Text =" EN"

session.findById(" wnd [0]")。sendVKey 0

PS:所有用户都在同一SAP连接中工作= PRD

付费偷看设置
发送
5条回答
灬番茄
1楼 · 2020-09-20 02:54.采纳回答

朱利安你好,

欢迎使用SAP社区。

下面是一个如何检测与SID和用户进行会话的示例:

'-Begin --------------------------------------------  ---------------------
 '-
 '-显示如何选择特定会话以执行SAP GUI的示例
 '-里面的脚本活动。 它扫描所有的所有连接
 '-会话以根据系统ID(SID)找到正确的会话
 '-交易代码(TAC)。
 '-
 '-------------------------------------------------  ----------------------

   '-指令-----------------------------------------------  -----------
   显式期权

   '-函数FindSession ----------------------------------------------  -
   '-
   '-查找特定的SAP GUI会话
   '-
   '-------------------------------------------------  --------------------
   函数FindSession(SID,USER)

     '-局部变量----------------------------------------------  ---
     Dim SapAppl,SapGuiAuto,CollCon,i,oCon,CollSes,j,oSes
     点心

     设置SapGuiAuto = GetObject(" SAPGUI")
     如果不是IsObject(SapGuiAuto)
       退出功能
     万一

     设置SapAppl = SapGuiAuto.GetScriptingEngine
     如果不是IsObject(SapAppl),则
       退出功能
     万一

     设置CollCon = SapAppl.Connections()
     如果不是IsObject(CollCon)然后
       退出功能
     万一
   
     '-循环连接--------------------------------------------
     对于i = 0到CollCon.Count()-1

       设置oCon = SapAppl.Children(CLng(i))
       如果不是IsObject(oCon)
         退出功能
       万一

       设置CollSes = oCon.Sessions()
       如果不是IsObject(CollSes)然后
         退出功能
       万一
    
       '-结束会话---------------------------------------------
       对于j = 0到CollSes.Count()-1
    
         设置oSes = oCon.Children(CLng(j))
         如果不是IsObject(oSes)则
           退出功能
         万一

         如果oSes.Busy()= vbFalse然后
           设置oSesInf = oSes.Info()
           如果IsObject(oSesInf)然后
             如果oSesInf.SystemName()= SID和_
               oSesInf.User()= USER然后
               设置FindSession = oSes
               退出功能
             万一
           万一
         万一

       下一个

     下一个

     设置FindSession = Nothing
  
   结束功能

   '-Sub Main ----------------------------------------------  --------------
   子Main()

     '-局部变量----------------------------------------------  ---
     点心

     设置oSes = FindSession(" PRD"," GEN1")

     如果TypeName(oSes)<>"无",则

       '-在此处从记录器中插入您的SAP GUI脚本代码-----------
       MsgBox oSes.findById(" wnd [0]/titl")。text

     万一

   结束子

   '-主要 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -  -----------------
   主要()
   
 '-结束 -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - -  --------------------

 

函数FindSession使用给定的SID和用户名传递会话。

让我们知道您的结果。

干杯
斯特凡

Bunny_CDM
2楼-- · 2020-09-20 02:44

你好朱利安,

您的问题:

  1. Sub和Function之间的区别在于Function提供了一个返回值。 使用Sub例程无法做到这一点。
  2. 当然可以。 在这种情况下,只需要确保要使用的连接或会话仍然存在。 与我的示例检测会话的方式几乎相同,您可以检测连接并以您描述的方式使用它。

最诚挚的问候
Stefan

wang628962
3楼-- · 2020-09-20 02:43

您好Stefan,

非常感谢您的帮助! 这真的是帮助和强大的代码!

我还有2个问题会弹出来进行分析。

首先,为什么要使用功能而不是另一个Sub? 我的意思是,使用函数有什么好处?

另一方面,我可能需要多次从SAP转到Excel并形成您的代码,我的想法是每次需要返回SAP时都应该运行它。 那么,有没有一种方法可以将要使用的SAP窗口数保存在变量中,然后使用该变量指定要使用的传送时间?

提前谢谢!

此致

Jules

悠然的二货
4楼-- · 2020-09-20 03:05

你好朱利安,

非常感谢您。

最好的问候
Stefan

Haoba3210
5楼-- · 2020-09-20 03:07

出色的代码Stefan! 非常有用和强大! ;)

一周热门 更多>