SAP Jobsuche bei DV-Treff
beatcode
  • beatcode
  • SAP Forum - User Thema Starter
vor 14 Jahre

Hallo zusammen

Ich habe 2 Mandate und möchte mittels einem Script einen Vorgang möglichst automatisieren.

Ich habe die Connection im Hintergrund mittels .vbs hergestellt dies nützt meines wissens jedoch nicht um im Frontend zu scripten oder doch?

Wie muss ich vorgehen um das einloggen mittels script zu starten?

Gruss Beat

Förderer

ScriptMan
vor 14 Jahre

Hallo Beat,

um einiges im SAP zu automatisieren, nutze ich bei mir folgende Anmeldung per Skript:

If Not IsObject(SAPguiApp) Then
    Set SAPguiApp = CreateObject("Sapgui.ScriptingCtrl.1")
End If
If Not IsObject(Connection) Then
    Set Connection = SAPguiApp.OpenConnection("SystemName", True)
End If
If Not IsObject(Session) Then
    Set Session = Connection.Children(0)
End If
Session.findById("wnd[0]/usr/txtRSYST-MANDT").Text = "123"
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 = "DE"
Session.findById("wnd[0]/usr/txtRSYST-LANGU").SetFocus
Session.findById("wnd[0]/usr/txtRSYST-LANGU").caretPosition = 2
Session.findById("wnd[0]").sendVKey 0
. . .

Hier kann z.B. eine aufgezeichnetes VB-Skript ohne die ersten 14-Zeilen folgen.

Dabei ist noch zu beachten:

1. Die SAP-Session ist automatisch zu Ende, wenn das Skript beendet wird.

2. SAP GUI wird standardmäßig in classic visual design ausgeführt.

3. Über alle Programme -> SAP Front End -> SAP GUI Configuration -> Applikationen -> Hinzufügen -> wscript.exe kann man aber auch das new visual design für diesen Fall einstellen.

Freundliche Grüße

ScriptMan

beatcode
  • beatcode
  • SAP Forum - User Thema Starter
vor 14 Jahre

Hallo Scriptman

Erstmals vielen Dank für die Beantwortung der sich vermutlich ständig wiederholende Anfängerfrage.

Habe noch 2 folgefragen.

Wenn ich das Logonpad geöffnet habe funktioniert es ansonsten bleibt er "Set Connection = SAPguiApp.OpenConnection("SystemName", True)" hängen. Muss ich das Pad vorab noch öffnen?

Wenn ich das GuiXT aktiv habe mekert er mit "Cannot find GuiXT component; check the installation" nach Bestätitgen der Meldung läuft es weiter.

ScriptMan
vor 14 Jahre

Hallo Beat,

das mit GuiXT stimmt leider. Damit kein Hinweis kommt, muss zuerst am FrontEnd die Komponente GuiXT vor einer User-Abmeldung deaktiviert werden. Dann klappt es bei einer Skript-Anmeldung auch ohne einen störenden Hinweis.

Bei mir habe ich das Logonpad nicht geöffnet. Die Skriptanmeldung läuft ohne Probleme durch. Bitte nicht vergessen, dass SystemName, 123, USER und PW mit echten Daten zu bestücken sind.

Freundliche Grüße

ScriptMan

beatcode
  • beatcode
  • SAP Forum - User Thema Starter
vor 14 Jahre

Danke für das Feedback. 

Ich bastle jetzt mal mein Script, vielen Dank.

Gruss Beat

beatcode
  • beatcode
  • SAP Forum - User Thema Starter
vor 14 Jahre

Ich hoffe ich nerv hier niemand.

Das automatische Einloggen funktioniert. Ist es möglich die Daten direkt in eine Zelle zu laden?

Dim xlApp
Dim xlBook
Dim xlSheet
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

xlapp.visible = true

xlsheet.Range("a1") = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").selectColumn "Feldname"

ScriptMan
vor 14 Jahre

Wie wär's mit:

xlsheet.Cells(1,1).Value = . . .

ScriptMan

beatcode
  • beatcode
  • SAP Forum - User Thema Starter
vor 14 Jahre

Im Guixt zeigt er mir nur X[Image_Container] an. Wie kann ich die Felder ansprechen?

xlsheet.Range("a1").value = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").selectColumn "Feldname" klappt nicht

ScriptMan
vor 14 Jahre

O.K.

Ich wusste leider nicht, was genau nicht klappt. In diesem Fall würde ich folgendes probieren:

xlsheet.Range("a1").value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (Zeile, "Feldname")

wobei Zeile = 0, 1, 2 . . .

ScriptMan

beatcode
  • beatcode
  • SAP Forum - User Thema Starter
vor 14 Jahre

Du bist wahrlich der Scriptman. Funktioniert perfekt

Dim xlApp
Dim xlBook
Dim xlSheet
Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

xlapp.visible = true

'schleife abarbeiten der Liste
LastLine = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").rowCount - 1

For i = 0 to LastLine

xlsheet.cells(i + 1,1).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "MATNR")
xlsheet.cells(i + 1,2).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "Feldname")
xlsheet.cells(i + 1,3).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "Feldname")
xlsheet.cells(i + 1,4).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "Feldname")
xlsheet.cells(i + 1,5).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "Feldname")
xlsheet.cells(i + 1,6).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "Feldname")
xlsheet.cells(i + 1,7).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "Feldname")
xlsheet.cells(i + 1,8).value  = session.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").getcellvalue (i, "Feldname")

next

' Spaltenbreite autofit

For s = 1 to 8
      if s = 1 then
          xlsheet.Columns(s).select
          xlapp.selection.numberformat = "0"
      end if
   xlsheet.Columns(s).EntireColumn.AutoFit
next

xlsheet.cells(i + 1,1).select

Gibt es eine Möglichkeit den Feldnamen mittels zahl anzusprechen?  getcellvalue (1, 1) versteht er nicht.

ScriptMan
vor 14 Jahre

Hallo Beat,

es freut mich, wenn ich helfen konnte.

Bei der letzten Frage muss ich leider passen. Laut Definition muss der 2. Parameter bei getcellvalue ein String sein.

Freundliche Grüße

ScriptMan