SAP Jobsuche bei DV-Treff
Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Hallo,

bin neu beim Scripten in SAP

habe mir gestern ein Script von Scriptmann angepasst. Es liest aus ein Exceltabelle 2 Werte (Materialbezeichung EN und CN) ein und legt dann in SAP ein neue Materialnummer an (MM01). Das klappt wunderbar solange die Bezeichnung KEINE Leerzeichen enthält. Dann wird nur der Text bis zum ersten Leerzeichen eingefügt.

Hier mal der Codeschnipsel aus EXCEL

Sub SAP_starten()

Dim WSHShell As Object

Dim eng As String

Dim chn As String

zeile = ActiveCell.Row

eng = Cells(zeile, 2).Value

chn = Cells(zeile, 3).Value

Set WSHShell = CreateObject("WScript.Shell")

WSHShell.Run """C:\Users\olot\AppData\Roaming\SAP\SAP GUI\Scripts\HIBE Anlage Nantong.vbs""" & " " & eng & " " & chn

Set WSHShell = Nothing

End Sub

und hier der (aufgezeichnete) Scriptteil aus SAP

Eng= wscript.arguments(0)

chn = wscript.arguments(1)

session.findById("wnd[0]").resizeWorkingPane 153,34,false

session.findById("wnd[0]/tbar[1]/btn[30]").press

session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU01/ssubTABFRA1:SAPLMGMM:2110/subSUB2:SAPLMGD1:8000/tblSAPLMGD1TC_KTXT/txtSKTEXT-MAKTX[1,0]").text = Eng

session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU01/ssubTABFRA1:SAPLMGMM:2110/subSUB2:SAPLMGD1:8000/tblSAPLMGD1TC_KTXT/txtSKTEXT-MAKTX[1,1]").text = chn

session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU01/ssubTABFRA1:SAPLMGMM:2110/subSUB2:SAPLMGD1:8000/tblSAPLMGD1TC_KTXT/txtSKTEXT-MAKTX[1,2]").text = Eng

session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU01/ssubTABFRA1:SAPLMGMM:2110/subSUB2:SAPLMGD1:8000/tblSAPLMGD1TC_KTXT/txtSKTEXT-MAKTX[1,1]").setFocus

session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU01/ssubTABFRA1:SAPLMGMM:2110/subSUB2:SAPLMGD1:8000/tblSAPLMGD1TC_KTXT/txtSKTEXT-MAKTX[1,1]").caretPosition = 0

Hat jemand eine Idee? Ich hätte auch gerne die letzte Materialnummer zurück in Excel (Zwischenablage?)

Danke und Gruß

Michel

Förderer

newgui
vor 7 Jahre
Hallo Michel,

kann ehrlich gesagt nicht nachvollziehen warum der String nur bis zum Leerzeichen übergeben wird.

Habe ähnliche Scripte umgesetzt und jetzt auch nochmal einen Test gemacht und ich bekomme immer den ganzen String.

Lass dir mal in deinem Skript eine Textbox ausgeben, damit du siehst ob es an der Übergabe von Excel ins Skript scheitert oder dann bei der Eingabe ins Textfeld in SAP.

msgbox (wscript.arguments(0))

Hab ja auch mal so angefangen wie du 😁 . Heute würde ich das ganze anders lösen. Ich würde das skript direkt über vba laufen lassen. Dazu sind auch lediglich 4 Codezeilen in deinem Makro notwendig.

Sub deinmakro()

Set SapGuiAuto = GetObject("SAPGUI") 'Get the SAP GUI Scripting object

Set SAPApp = SapGuiAuto.GetScriptingEngine 'Get the currently running SAP GUI

Set SAPCon = SAPApp.Children(0) 'Get the first system that is currently connected

Set session = SAPCon.Children(0) 'Get the first session (window) on that connection

hier dann dein scripting code

End sub

Dann ist das Handling und vor allem das Debugging wesentlich einfacher.

Wenn ich davon ausgehe, dass du in deiner excel-Liste eine Materialnr. und dann die beiden Texte hast, könntest du hier ganz einfach eine Schleife einbauen und so x Materialien hintereinander anlegen lassen.

Das ist nur mal ein Vorschlag. Hab ja doch auch einiges von scriptman gelernt 😂

mfg

newgui

ScriptMan
vor 7 Jahre
Hallo Michel,

man könnte u.U. folgendes testen:

WSHShell.Run """C:\Users\olot\AppData\Roaming\SAP\SAP GUI\Scripts\HIBE Anlage Nantong.vbs""" & " " & chr(34) & eng & chr(34) & " " & chr(34) & chn & chr(34)

Grüße,

ScriptMan

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Danke für die Hinweise, das ganze in direkt in Excel VBA zu machen, würde mir besser gefallen, da kenn ich mich aus.

Kann nur leider eure Tipps gerade nicht ausprobieren, ich bin durch und im SAP-Testsystem läuft mein Script nicht??

Muss ich beim nächsten mal ausprobieren.

Melde mich wieder. Habe bestimmt noch ein paar Fragen :-)

Gruß

Michael

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Hey, das mit dem bearbeiten van SAP aus Excel ist cool, habe mal ein bisschen rumprobiert, einfach mal MM03 mit einer Matnummer aus meiner Tabelle.

Jetzt mal ne Frage:

Wie bekomme ich denn eine Wert aus SAP zurück nach Excel, wie also spreche ich das Feld an?

Sagen wir mal ich möchte die Matbezeichung (Feldname MAKTX oder die Warengruppe MATKL auslesen und nach Excel geben.

in Excel also Matbez = ???????

Gruß

Michael

Saptimierer
vor 7 Jahre
Eigentlich ganz einfach:

Cells(zeile, 2).Value = session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU01/ssubTABFRA1:SAPLMGMM:2110/subSUB2:SAPLMGD1:8000/tblSAPLMGD1TC_KTXT/txtSKTEXT-MAKTX[1,0]").text
Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Danke.

kann mir jemand dieses session.findByID... mal kurz erklären. Was machen die einzelnen Codeschnipsel also

/usr/ oder

/tabsTABSPR1/

oder

/tabpZU01/

oder

der ganze Rest.

Saptimierer
vor 7 Jahre
Wenn du in SAP bist, drück mal Alt+F12 und dann den Menüpunkt "Hilfe zu SAP GUI Scripting. Dort findest du schon im Kapitel "Introduction" alles recht detailliert erklärt.

Zu deinem Beispiel:

session.findById("wnd[0]/usr/tabsTABSPR1/tabpZU01/ssubTABFRA1:SAPLMGMM:2110/subSUB2:SAPLMGD1:8000/tblSAPLMGD1TC_KTXT/txtSKTEXT-MAKTX[1,0]").text = Eng

  • Session ist das Objekt des gewählten SAP-Fensters (SAP-Modus)

  • findById ist die Methode des Objekts "Session" zum Identifizieren eines Elements des SAP GUI aufgrund seiner ID (=Pfad zum Element)

Diese ID kannst du dir vorstellen wie eine URL oder einen Dateipfad. Sie setzt sich wieder zusammen aus

  • wnd[0] ist das Hauptfenster (GuiMainWindow)

  • usr ist der Benutzerbereich innerhalb des Hauptfensters (i.d.R. alles zwischen der Button-Bar und der Fusszeile) (GuiUserArea)

  • danach geht es in der Hierarchie weiter über die Tab-Reiter (Tabs), den Tab (Tabp) ZU01 bis zum endgültig benötigten Element, in diesem Beispiel dem Textfeld (txt) SKTEXT-MAKTX aus der 1. Zeile der Tabelle (tbl) SAPLMGD1TC_KTXT

Sämtliche Objekte mit all ihren Eigenschaften und Methoden sind in der Hilfe-Datei ausführlich beschrieben.

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Danke.

Hab heute wieder ein paar Datensätze anzulegen, mal sehen ob das mit dem kopieren inkl. Leerzeichen klappt??

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Moin zusammen, habe jetzt der einfachheit halber mal die Änderung von Scriptman eingebaut, funktioniert... Was macht denn das chr(34) an diesen Stellen?

Der Test mit der Ausgabe in der msgbox geht, da sind die richtigen (kompletten Zellen) kopiert worden.

Danke nochmal an alle die hier geschrieben haben😁

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Tja, was soll ich sagen... Zu früh gefreut. Es hat nur beim ersten mal funktioniert. Bei den folgenden Zeilen wurde nur das erste Wort, bis zum ersten Leerzeichen kopiert und auch nur so an den Script übergeben?

Die Variable "eng" wird von Excel richtig gefüllt, das habe ich überprüft aber im Script kommt dann nur noch das erste Wort an. 😠

hier nochmal der Code in Excel wie er jetzt ist.

Sub SAP_starten()
Dim WSHShell As Object
Dim eng As String
Dim chn As String


zeile = ActiveCell.Row

eng = Cells(zeile, 2).Value
chn = Cells(zeile, 3).Value


Set WSHShell = CreateObject("WScript.Shell")
 WSHShell.Run """C:\Users\olot\AppData\Roaming\SAP\SAP GUI\Scripts\HIBE Anlage Nantong.vbs""" & " " & Chr(34) & eng & Chr(34) & " " & Chr(34) & chn & Chr(34)
 
 Set WSHShell = Nothing

End Sub
ScriptMan
vor 7 Jahre
Hallo Michel,

im nachfolgenden Beispiel funktioniert alles ohne Probleme:

VBA:

myPar_1 = Cells(1, 1).Value

myPar_2 = Cells(2, 1).Value

Set wshell = CreateObject("Wscript.Shell")

wshell.Run "C:\tmp\msgbox.vbs" & " " & Chr(34) & myPar_1 & Chr(34) & " " & Chr(34) & myPar_2 & Chr(34)

msgbox.vbs:

msgbox wscript.arguments(0)

msgbox wscript.arguments(1)

Den Fehler bei dir musst du schon selbst finden.

Zur Erklärung:

chr(34) ist der hexadezimale Code für ". Damit kann man komplette Zeichenketten auch mit Leerzeichen, die normalerweise ein Parameter-Trennzeichen sind, an andere Programme übergeben.

Grüße,

ScriptMan

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Danke nochmal für die Hilfestellung.

Bin jetzt den Weg gegangen, das Script direkt in Excel laufen zu lassen und hat es keine Problem gegeben. Das Einfügen der Texte hat ohne Problem funktioniert und die neue Matnummer habe ich auch noch gleich automatisch in meine Exceltabelle eintragen lassen. Erspart viel Tiparbeit. 🙂

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
@newgui

mh... dachte ich könnte das Script (mit Anpassungen) auch in Access verwenden aber das scheint nicht zu funktionieren. Schade.

Oder gibt es auch diese 4 zeilen Code um das auch in Access zu benutzen??

Set SapGuiAuto = GetObject("SAPGUI") 'Get the SAP GUI Scripting object
Set SAPApp = SapGuiAuto.GetScriptingEngine 'Get the currently running SAP GUI
Set SAPCon = SAPApp.Children(0) 'Get the first system that is currently connected
Set session = SAPCon.Children(0) 'Get the first session (window) on that connection
newgui
vor 7 Jahre
Hallo michel,

sorry, das weiß ich leider auch nicht. Mit Access arbeite ich überhaupt nicht.

Vielleich weiß scriptman weiter.

mfg

newgui

@scriptman - wollte dir noch eine Antwort schicken, dein Posteingang ist aber schon voll

ScriptMan
vor 7 Jahre
@Michel - Ich habe das SAP GUI Scripting noch nicht mit Access verwendet. Es wäre aber interessant, an welcher Stelle und mit welchem Fehler das Programm abbricht.

@newgui - Das Postfach habe ich aufgeräumt.

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Das bekommen wir hin :-)

Sub Matbezeichnung_aus_SAP()
'-- Matbezeichung und Warengruppe mit MM03 auslesen

Dim Matnummer As String
Dim Wrg As String, MatBez1 As String, MatBez2 As String

Set SapGuiAuto = GetObject("SAPGUI") 'Get the SAP GUI Scripting object
Set SAPApp = SapGuiAuto.GetScriptingEngine 'Get the currently running SAP GUI
Set SAPCon = SAPApp.Children(0) 'Get the first system that is currently connected
Set Session = SAPCon.Children(0) 'Get the first session (window) on that connection

Der Fehler kommt hier:

Set Session = SAPCon.Children(0) 'Get the first session (window) on that connection

Die Fehlermeldung:

Laufzeitfehler 440

Die Eigenschaft ist schreibgeschützt.

ScriptMan
vor 7 Jahre

Ich habe es im Access getestet. Ich konnte bei keine Probleme feststellen. Er geht durch ohne einen Fehler und zeigt mir anschließend eine Systeminfo.

z.B.

msgbox session.info.SystemName

Vielleicht liegt es an irgendwelchen Verweisen, die benötigt werden. Schau mal im Excel nach, ob man dort was erkennen kann.

Michel01
  • Michel01
  • SAP Forum - User Thema Starter
vor 7 Jahre
Tja, das es verweisen liegt habe ich auch vermutet, aber welche?

In Excel ist nicht angehakt war irgendwie mit SAP zu tun hat. In Access gibt es "hunderte" von SAPxxxxx- Verweisen, keine Ahnung welche da die richtigen sind?

Gruß

Michael