Visual Basic Script

Hier könnt Ihr Euch über PC-Spiele und -Probleme sowie Nicht-Nintendo-Konsolen der aktuellen Generation unterhalten.

Moderator: wynk

Benutzeravatar
Link'n Dark
Beiträge: 8284
Registriert: Fr Mär 21, 2003 15:15
Kontaktdaten:

Visual Basic Script

Beitrag von Link'n Dark » Do Jun 27, 2013 14:02

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?

Benutzeravatar
That Guy
Der charismatische Nerd
Beiträge: 37730
Registriert: Fr Mär 21, 2003 15:15
3DS Freundescode: FUUUUUUUUUUUUU
Wohnort: Dortmund
Kontaktdaten:

Re: Visual Basic Script

Beitrag von That Guy » Do Jun 27, 2013 14:07

Den Auftrag an nen externen SAP Consultant weiter geben. :ugly:

Hab leider keine Ahung von SAP und auch nich von VBS. :ucry:
Meine Filmsammlung
Titan im CADR - Destiny Clan

Benutzeravatar
Vernochan
Beiträge: 1841
Registriert: Fr Dez 15, 2006 02:11

Re: Visual Basic Script

Beitrag von Vernochan » Do Jun 27, 2013 14:11

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.
[ externes Bild ][ externes Bild ]
_██_
 o_ರೃ
"Interesting...Let me think on this topic. Done! The answer is no just no."

Benutzeravatar
Link'n Dark
Beiträge: 8284
Registriert: Fr Mär 21, 2003 15:15
Kontaktdaten:

Re: Visual Basic Script

Beitrag von Link'n Dark » Do Jun 27, 2013 15:01

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:

Kleeno
Beiträge: 1050
Registriert: Mi Jun 20, 2012 23:04
Nintendo Network ID: Kleeno
3DS Freundescode: 1719-4571-9573

Re: Visual Basic Script

Beitrag von Kleeno » Do Jun 27, 2013 15:27

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 :-(

Benutzeravatar
Vernochan
Beiträge: 1841
Registriert: Fr Dez 15, 2006 02:11

Re: Visual Basic Script

Beitrag von Vernochan » Do Jun 27, 2013 16:30

@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.
[ externes Bild ][ externes Bild ]
_██_
 o_ರೃ
"Interesting...Let me think on this topic. Done! The answer is no just no."

Benutzeravatar
Simchen
The Godfather
Beiträge: 7935
Registriert: Sa Mai 03, 2003 00:28

Re: Visual Basic Script

Beitrag von Simchen » Do Jun 27, 2013 16:31

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

Benutzeravatar
Link'n Dark
Beiträge: 8284
Registriert: Fr Mär 21, 2003 15:15
Kontaktdaten:

Re: Visual Basic Script

Beitrag von Link'n Dark » Do Jun 27, 2013 19:44

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. ;(

Benutzeravatar
That Guy
Der charismatische Nerd
Beiträge: 37730
Registriert: Fr Mär 21, 2003 15:15
3DS Freundescode: FUUUUUUUUUUUUU
Wohnort: Dortmund
Kontaktdaten:

Re: Visual Basic Script

Beitrag von That Guy » Do Jun 27, 2013 20:00

Sag mal, kann Tobi das nicht in 5 Minuten? :ugly:
Meine Filmsammlung
Titan im CADR - Destiny Clan

Benutzeravatar
Vernochan
Beiträge: 1841
Registriert: Fr Dez 15, 2006 02:11

Re: Visual Basic Script

Beitrag von Vernochan » Do Jun 27, 2013 20:04

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 ;)
[ externes Bild ][ externes Bild ]
_██_
 o_ರೃ
"Interesting...Let me think on this topic. Done! The answer is no just no."

Benutzeravatar
Papierknut
Beiträge: 8803
Registriert: So Jan 02, 2005 22:01
Nintendo Network ID: pprkut
3DS Freundescode: 5300-8921-9901
Kontaktdaten:

Re: Visual Basic Script

Beitrag von Papierknut » Fr Jun 28, 2013 07:29

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 ;)

Benutzeravatar
That Guy
Der charismatische Nerd
Beiträge: 37730
Registriert: Fr Mär 21, 2003 15:15
3DS Freundescode: FUUUUUUUUUUUUU
Wohnort: Dortmund
Kontaktdaten:

Re: Visual Basic Script

Beitrag von That Guy » Fr Jun 28, 2013 09:02

Achso. 8(
Meine Filmsammlung
Titan im CADR - Destiny Clan

Benutzeravatar
Link'n Dark
Beiträge: 8284
Registriert: Fr Mär 21, 2003 15:15
Kontaktdaten:

Re: Visual Basic Script

Beitrag von Link'n Dark » Fr Jun 28, 2013 10:04

@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

Benutzeravatar
Papierknut
Beiträge: 8803
Registriert: So Jan 02, 2005 22:01
Nintendo Network ID: pprkut
3DS Freundescode: 5300-8921-9901
Kontaktdaten:

Re: Visual Basic Script

Beitrag von Papierknut » Fr Jun 28, 2013 10:06


Benutzeravatar
Vernochan
Beiträge: 1841
Registriert: Fr Dez 15, 2006 02:11

Re: Visual Basic Script

Beitrag von Vernochan » Fr Jun 28, 2013 10:34

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.
[ externes Bild ][ externes Bild ]
_██_
 o_ರೃ
"Interesting...Let me think on this topic. Done! The answer is no just no."

Antworten