SAP öffnen bei mehreren offenen Systemen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: SAP öffnen bei mehreren offenen Systemen
von: Patrick
Geschrieben am: 30.10.2015 11:32:32

Hallo,
ich nutze zwei verschiedene SAP Systeme die sich im Fenstername gut unterscheiden lassen. Jetzt möchte ich per VBA (oder VBS) ein Script ausführen, das entscheided, ob das richtige SAP Systme offen ist und gegebenenfalls ein Anmeldescript ausführt.
Das Anmeldescript habe ich mir entsprechend konfiguriert:


'***** Parameter für SAP - Anmeldung *****
PFAD = "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe"
myConnection = "CAE - CSE - Production System Europe Central"
Name = "USER"
Passwort = "PASSW"
Mandant = "600"
'******
'***** Auto-Start *****
set wshell = createObject("Wscript.Shell")
on error resume next
Number_Session = 0
Set SapGuiAuto = GetObject("SAPGUI")
Set SAP_Application = SapGuiAuto.GetScriptingEngine
Set SAP_Connection = SAP_Application.Children(0)
Set session = SAP_Connection.Children(0)
Number_Session = session.info.sessionnumber
on error goto 0 
if Number_Session = 0 then
Number_Process = 0
Dim objWMIService, colItems, objItem, strComputer
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.InstancesOf("Win32_Process")
For Each objItem In colItems
'WScript.Echo objItem.ProcessId & ":" & objItem.Name
if right(objItem.Name,12)="saplogon.exe" then Number_Process = Number_Process + 1
Next
Set objWMIService = Nothing
Set colItems = Nothing
If Number_Process = 0 Then
do
wshell.run chr(34) & PFAD & chr(34)
wscript.sleep 4000 
error = 0
On Error Resume Next
If Not IsObject(SAP_Application) Then
Set SapGuiAuto = GetObject("SAPGUI") 
Set SAP_Application = SapGuiAuto.GetScriptingEngine
End If
error = Err.Number
if error = 0 then exit do
Anzahl = Anzahl + 1
if Anzahl = 5 then exit do 
On Error GoTo 0
loop
If error <> 0 Then
MsgBox "SAP Logon ist nicht installiert." , vbInformation
end if
end if
on error resume next
If Not IsObject(SAP_connection) Then
Set connection = SAP_Application.Children(0)
error = err.number
msgbox error
End If
If Not IsObject(session) Then
Set session = SAP_connection.Children(0)
error = err.number
msgbox error
End If
on error goto 0 
if error <> 0 then
Set SAP_Connection = SAP_Application.openconnection(myConnection)
Set session = SAP_Connection.Children(0)
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/txtRSYST-MANDT").Text = Mandant
session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = Name
session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = Passwort
session.findById("wnd[0]").sendVKey 0
wscript.sleep 2000
else
'	msgbox "Sie sind bereits im SAP angemeldet.", vbinformation, "SAP - Anmeldung"
end if
end if
Klar, das Script habe ich mir nicht selbst zusammengebastelt, es handelt sich auch schon um eine Übernahme von "Scriptman."
Mein Problem ist jetzt:
Bin ich bereits in einem anderen System angemeldet (z.B Name "CFR") schlagen alle if not is object Connection oder Session Prüfungen fehl, weil ja eben schon Verbindungen und Sessions offen sind, aber nicht die richtigen.
Aus lauter Verzweifelung habe ich schon probiert über Appactive und den Fensternamen Fehler zu provozieren, die ich dann auswerte und entscheide, ob die Anmelderoutine durchlaufen werden muss oder nicht.
Hat jemand eine gute Idee für mich?
Gruß,
Patrick

Bild

Betrifft: AW: SAP öffnen bei mehreren offenen Systemen
von: Esmo
Geschrieben am: 30.10.2015 18:54:21
Moin Patrick,
Du kannst doch den Namen der Verbindung prüfen - siehe http://scn.sap.com/thread/3496707:

Set SAP_Application = SapGuiAuto.GetScriptingEngine
For i = 0 To SAP_Application.Connections.Count() - 1
      Set Connection = Application.Children(i)
      Conn = Connection.Description()
      If Conn = "CAE" Then
        Flag = True
        Exit For
      End If
    Next

Falls Du nicht im richtigen System bist, baust Du dann eine Verbindung auf...
Schönes Wochenende
Ralph

Bild

Betrifft: AW: SAP öffnen bei mehreren offenen Systemen
von: Patrick
Geschrieben am: 02.11.2015 16:12:07
Hallo Ralph,
Connection.Description() spuckt mir eine Zahl aus und nicht wie gehofft den Fenster-, oder Systemname.
Gibt es da vielleicht etwas anderes (so wie .name, oder .wasweißich)?
Gruß,
Patrick

Bild

Betrifft: AW: SAP öffnen bei mehreren offenen Systemen
von: Patrick
Geschrieben am: 02.11.2015 17:34:49
Hallo,
ich bin jetzt schon ein gehöriges Stück weiter. VBA spuckt mir mit Hilfe folgenden Codes die Systemnamen aus:

Debug.Print SAPapplication.Connections(0).Children(0).info.systemname
Debug.Print SAPapplication.Connections(1).Children(0).info.systemname
For i = 0 To SAPapplication.Connections.Count
If SAPapplication.Connections(i).Children(0).info.systemname = "CSE" Then MsgBox "Juhuuu"
Next i
Aber warum geht die for-Schleife nicht, während das normale Durchnummerieren wunderbar funktioniert? Und ja, ich habe den Index geprüft (bei zwei Verbindungen ist er 0 bis 1).
Die Syntax .info.systemname habe ich im Internet gefunden. Gibt es eine Chance solche Methoden als Hilfe angedient zu bekommen, oder sind diese Programm spezifisch?
Gruß,
Patrick

 Bild

Beiträge aus den Excel-Beispielen zum Thema "SAP öffnen bei mehreren offenen Systemen"