Seite 1 von 2

Visual Basic Script

Verfasst: Do Jun 27, 2013 14:02
von Link'n Dark
Ich bräuchte mal Hilfe mit einem Visual Basic Script. Um genau zu sein handelt es sich hier um VBS für die SAP GUI.

Hier ist der Code, den ich per "Record" Funktion erstellt habe:

If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
If Not IsObject(session) Then
Set session = connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "/nmm02"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "Material1"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "Wert1"
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").caretPosition = 3
session.findById("wnd[0]").sendVKey 11

Sinn des Ganzen: Ich gehe in "Material1" und hinterlege in den Stammdaten den "Wert1".
Um den Wert eines Weiteren Materials direkt im Anschluss zu pflegen, kann ich einfach folgenden Code anhängen, wobei ich das Material und den Wert manuell überschreibe.


session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "Material2"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "Wert2"
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").caretPosition = 3
session.findById("wnd[0]").sendVKey 11

Da ich das ganze für ca. 300 Materialien mit ca. 5 verschiedenen Werten machen möchte, ist es mir zu umständlich jeden Codeabschnitt per Copy&Paste zu duplizieren und die Variablen manuell einzusetzten.

Gibt es irgend eine Möglichkeit das zu automatisieren?

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 14:07
von That Guy
Den Auftrag an nen externen SAP Consultant weiter geben. :ugly:

Hab leider keine Ahung von SAP und auch nich von VBS. :ucry:

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 14:11
von Vernochan
Wenn du die Daten in irgendeineer organisierten Form da hast, geht das bestimmt. Weiss zwar nicht genau wie das mit dem SAP Krams aussieht, aber wenn du ne Excel Datei einlesen kannst oder so, kannst du das bestimmt in einer Schleife laufen lassen.

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 15:01
von Link'n Dark
Die Daten habe ich als Excel Tabelle in organisierte Form vorliegen. In SAP selbst kann ich da nichts einlesen bzw hab keine Berechtigungen. Ich habe nur die Möglichkeit das Script oben nach belieben zu verändern.

Im Prinzip brauche ich ein Script um das Script automatisch zu schreiben. :ugly:

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 15:27
von Kleeno
Mhm, kenn mich mit Visaul Basic jetzt nicht so aus, aber im grunde brauchst du ja nur über eine Schleife Arrays erstellen die dann mit den Werten gefüttert wird. Heißt das Material wirklich Material1,Material2,Material3 oder haben die unterschiedliche Namen? Ansonsten müsste man wirklich ein kleines Script erstellen das dir die eingabe erleichtert. Könnte dir eins in Java machen :ugly: weiß aber nicht ob dir das weiterhilft... Sry :-(

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 16:30
von Vernochan
@Link: Die Idee war ja auch im Script Excel zu oeffnen.

Ich hab halt noch nie mit SAP gearbeitet, daher hab ich auch keine Ahnung, wie/wo/womit das Script ausgefuehrt wird.

Sind das einfach nur .vbs Dateien, die man per Doppelklick ausfuehrt (windows scripting host)? Werden die im SAP Tool selbst gestartet? Denn je nach dem koennte es sein, dass es ja eine art Programmierschnittstelle zu Excel gibt. Oder Kannst du wenigstens Textdateien von der Festplatte einlesen? Dann koennte man die Daten aus Excel exportieren (csv) und dann in dem Script importieren und per Schleife durchlaufen lassen.

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 16:31
von Simchen
Also so wie ich das sehe sind ja nur diese Schnipsel hier anders?
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "Material2"

session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "Wert2"

Also wie schon gesagt würd ichs mal mit ner Schleife versuchen. Sorry wenn der Code nicht funzt, aber ich hab die VB-Syntax nicht mehr im Kopf, aber als Pseudocode müsst es ja hinhauen, dann einfach die richtige Syntax benutzen.

Code: Alles auswählen


For i=1 to 300

For j=1 to 5

session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "Material"+CStr(i)
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "Wert"+CStr(j)


Next
Next

Das CStr steht für Integer zu String konvertieren.

Die übrigen session.findById-Dinges-Zeilen dann auch noch reinwurschteln wie dus eben brauchst.


K.a. ob das hilft :zuck: Bin jetzt davon ausgegangen dass du dieses Muster abarbeiten willst:

Material1, Wert1
Material1, Wert2
Material1, Wert3
Material1, Wert4
Material1, Wert5

Material2, Wert1
Material2, Wert2
Material2, Wert3
Material2, Wert4
Material2, Wert5

.
.
.


Material300, Wert1
Material300, Wert2
Material300, Wert3
Material300, Wert4
Material300, Wert5

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 19:44
von Link'n Dark
Kleeno hat geschrieben:Mhm, kenn mich mit Visaul Basic jetzt nicht so aus, aber im grunde brauchst du ja nur über eine Schleife Arrays erstellen die dann mit den Werten gefüttert wird. Heißt das Material wirklich Material1,Material2,Material3 oder haben die unterschiedliche Namen? Ansonsten müsste man wirklich ein kleines Script erstellen das dir die eingabe erleichtert. Könnte dir eins in Java machen :ugly: weiß aber nicht ob dir das weiterhilft... Sry :-(
Die Materialien bestehen jeweils aus einer nicht fortlaufenden Zahlenkombination mit 8 Stellen. Jedem Material ist ein Wert zugeteilt, der aus einer dreistelligen Buchtaben und Zahlenkombination besteht.

Ein Java Script wäre Nice, aber letztendlich sollte ich das auch reproduzieren bzw für andere Anwendungsfälle selbst anpassen können. Den aktuellen Fall kann ich in einer halben Stunde auch manuell erledigen. Allgemein möchte ich durch das ganze etwas lernen um mir in Zukunft einige Arbeiten zu erleichtern.

Vernochan hat geschrieben:@Link: Die Idee war ja auch im Script Excel zu oeffnen.

Ich hab halt noch nie mit SAP gearbeitet, daher hab ich auch keine Ahnung, wie/wo/womit das Script ausgefuehrt wird.

Sind das einfach nur .vbs Dateien, die man per Doppelklick ausfuehrt (windows scripting host)? Werden die im SAP Tool selbst gestartet? Denn je nach dem koennte es sein, dass es ja eine art Programmierschnittstelle zu Excel gibt. Oder Kannst du wenigstens Textdateien von der Festplatte einlesen? Dann koennte man die Daten aus Excel exportieren (csv) und dann in dem Script importieren und per Schleife durchlaufen lassen.

Ja, das sind einfach nur VBS Dateien die mit Windows Scripting Host außerhalb von SAP ausgeführt werden. Ob es eine Programmierschnittstelle zu Excel gibt, oder ob ich Textdateien einlesen kann, ist mir nicht bekannt. Bin ja leider nur Enduser und habe eigentlich keine Erfahrung mit Programmieren, außer vielleicht mit Basic als Grundschüler. :ugly:
Das ganze Script bildet eigentlich auch nur ab, was ich in der GUI selbst zusammengeklickt und "recorded" hab. Das VBS welches am Ende bei rauskommt, kann ich dann im Notepad bearbeiten und mit WSH ausführen.

Letztendlich ist es aber auch egal wie das Script an sich funktioniert. Mir ist ja bekannt, wie der Code am Ende aussehen soll. Hier ein Beispiel:
5x Materialnummern + Wert

65671016 4FK
65785020 W1Z
65785023 4FG
99564888 W7K
99603609 W2Y




If Not IsObject(application) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
Set connection = application.Children(0)
End If
If Not IsObject(session) Then
Set session = connection.Children(0)
End If
If IsObject(WScript) Then
WScript.ConnectObject session, "on"
WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").text = "/nmm02"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "65671016"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "4FK"
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").caretPosition = 3
session.findById("wnd[0]").sendVKey 11
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "65785020"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "W1Z"
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").caretPosition = 3
session.findById("wnd[0]").sendVKey 11
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "65785023"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "4FG"
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").caretPosition = 3
session.findById("wnd[0]").sendVKey 11
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "99564888"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "W7K"
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").caretPosition = 3
session.findById("wnd[0]").sendVKey 11
session.findById("wnd[0]/usr/ctxtRMMG1-MATNR").text = "99603609"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").text = "W2Y"
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").setFocus
session.findById("wnd[0]/usr/tabsTABSPR1/tabpSP12/ssubTABFRA1:SAPLMGMM:2000/subSUB3:SAPLMGD1:2482/ctxtMARC-DISPO").caretPosition = 3
session.findById("wnd[0]").sendVKey 11

@Simchen: Da hab ich mich bisher wohl etwas unglücklich ausgedrückt. Material plus fortlaufende Nummer hilft mir hier nicht. ;(

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 20:00
von That Guy
Sag mal, kann Tobi das nicht in 5 Minuten? :ugly:

Re: Visual Basic Script

Verfasst: Do Jun 27, 2013 20:04
von Vernochan
Also, wenn ich das richtig sehe, kann man "ganz einfach" auf die COM Schnittstelle von Excel zugreifen und darueber ein Spreadsheet lesen.
Muesste in etwa so sein:

Code: Alles auswählen

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open _
    ("C:\Scripts\New_users.xls")

intRow = 2

Do Until objExcel.Cells(intRow,1).Value = ""
    Wscript.Echo "CN: " & objExcel.Cells(intRow, 1).Value
    Wscript.Echo "sAMAccountName: " & objExcel.Cells(intRow, 2).Value
    Wscript.Echo "GivenName: " & objExcel.Cells(intRow, 3).Value
    Wscript.Echo "LastName: " & objExcel.Cells(intRow, 4).Value
    intRow = intRow + 1
Loop

objExcel.Quit
Ist mehr oder minder selbsterklaerend/einfach. Kann es nur leider nicht testen, da ich derzeit auf Linux unterwegs bin bzw zu faul bin umzubooten ;)

Re: Visual Basic Script

Verfasst: Fr Jun 28, 2013 07:29
von Papierknut
That Guy hat geschrieben:Sag mal, kann Tobi das nicht in 5 Minuten? :ugly:
Nein Tobi kennt leider kein Visual Basic :ugly: , Prinzipiell hat das ja auch nicht mit einem SAP-Problem zu tun ;)

Re: Visual Basic Script

Verfasst: Fr Jun 28, 2013 09:02
von That Guy
Achso. 8(

Re: Visual Basic Script

Verfasst: Fr Jun 28, 2013 10:04
von Link'n Dark
@Verno: Danke, aber ich verstehe es leider nicht so ganz. :ugly:

Hab mich gestern Abend noch an einem Excel Makro versucht. Auch wenn ich nicht weit gekommen bin, glaube ich, dass mir das auch helfen könnte.
Dabei ist mir aufgefallen, dass auch die Excel Makro mit Visual Basic laufen.

Da ich am häufigsten mit SAP und Excel arbeite, wäre es daher sinnvoll wenigstens die Grundkenntnisse in Visual Basic zu beherrschen. Hat jemand einen gute Quelle mit Lernmaterial für Anfänger? :D

Re: Visual Basic Script

Verfasst: Fr Jun 28, 2013 10:06
von Papierknut

Re: Visual Basic Script

Verfasst: Fr Jun 28, 2013 10:34
von Vernochan
Ich hab ehrlich gesagt keine Ahnung wo man nen guten Einstieg macht. Als passionierter Programmierer reichte mir ein bisschen google-FU aus um mir alle meine probleme zu loesen. (Wobei meine Probleme meistens darin bestanden einer Freundin zu helfen :ugly: )

Wobei ich auch den Vorteil hatte, dass ich die API im Grunde schon durch C# kannte, mit dem ich bereits excel AddIns geschrieben habe. Die API is da naemlich die selbe^^'


Aber wenn du mal nich weiter kommst, frag ruhig hier nach. Ich bin immer bereit zu helfen.