SAP Jobsuche bei DV-Treff
Juergen Mayer
vor 7 Jahre
Hallo GuiXT-Community: Ich habe mich an einem Script versucht, das Werte aus einem Excel-Sheet einliest und damit den TAC "LS01N" wiederholt befüllt. Eigentlich sollte das Script nach der letzten befüllten Excel-Zeile eine Meldung ausgeben, bricht aber immer mit "The Method got an invalid Argument" ab. Die Lagerplätze werden aber "richtig" angelegt. Das Problem ist also ein rein "kosmetisches". Wer kann mir hier eventuell weiterhelfen?

Mein Script:

'**************************************************************

' allg. SAPScript-Parameter

'**************************************************************

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

'**************************************************************

' Aufruf der Transaktion LS01N

'**************************************************************

session.findById("wnd[0]").maximize

session.findById("wnd[0]/tbar[0]/okcd").text = "/nLS01N"

session.findById("wnd[0]").sendVKey 0

'**************************************************************

' Parameter für XLSX-Datei und Befüllen der Felder

'**************************************************************

'Dim ExcelApp, ExcelWB, ExcelWS

set ExcelApp=createobject("Excel.Application")

ExcelApp.visible=true

set ExcelWB=ExcelApp.Workbooks.Open("P:\10062069\guixt\scripts - Entwicklung\Lagerplaetze und Veriffeld\Plaetze.xlsx")

set ExcelWS=ExcelWB.Worksheets("Tabelle1")

for i = 2 to ExcelApp.ActiveCell.SpecialCells(11).Row

for j = 1 to ExcelApp.ActiveCell.SpecialCells(11).Column

if j=1 then LGNUM = ExcelWS.Cells(i,j).Value

if j=2 then LGTYP = ExcelWS.Cells(i,j).Value

if j=3 then LGBER = ExcelWS.Cells(i,j).Value

if j=4 then LPTYP = ExcelWS.Cells(i,j).Value

if j=5 then LGPLA = ExcelWS.Cells(i,j).Value

next

session.findById("wnd[0]/usr/ctxtLAGP-LGNUM").text = LGNUM

session.findById("wnd[0]/usr/ctxtLAGP-LGTYP").text = LGTYP

session.findById("wnd[0]/usr/ctxtLAGP-LGPLA").text = LGPLA

session.findById("wnd[0]/usr/ctxtLAGP-LGPLA").setFocus

session.findById("wnd[0]/usr/ctxtLAGP-LGPLA").caretPosition = 10

session.findById("wnd[0]/usr/btnREFRESH").press

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/usr/tabsFUNC_TABSTRIP/tabpALLG/ssubD0400_S:SAPML01S:4001/ctxtLAGP-LGBER").text = LGBER

session.findById("wnd[0]/usr/tabsFUNC_TABSTRIP/tabpALLG/ssubD0400_S:SAPML01S:4001/ctxtLAGP-LPTYP").text = LPTYP

session.findById("wnd[0]/usr/tabsFUNC_TABSTRIP/tabpALLG/ssubD0400_S:SAPML01S:4001/txtLAGP-VERIF").text = LGPLA

session.findById("wnd[0]/usr/tabsFUNC_TABSTRIP/tabpALLG/ssubD0400_S:SAPML01S:4001/txtLAGP-VERIF").setFocus

session.findById("wnd[0]/usr/tabsFUNC_TABSTRIP/tabpALLG/ssubD0400_S:SAPML01S:4001/txtLAGP-VERIF").caretPosition = 10

session.findById("wnd[0]").sendVKey 0

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

next

msgbox "Alle Lagerplätze wurden angelegt."

ExcelWB.Close

ExcelApp.Quit

ScriptMan
vor 7 Jahre
Hallo Jürgen,

wenn alles ordentlich angelegt wurde, dann kann es nur eine leere Zeile im Excel sein, die nach den tatsächlichen Daten folgt. Diese müsste gelöscht und die Excel-Mappe erneut abgespeichert werden. Zur Kontrolle könnte man STRG/Ende drücken, um zu sehen, dass der Cursor tatsächlich in der letzten Zeile mit einem Inhalt landet.

Grüße,

ScriptMan

Juergen Mayer
vor 7 Jahre
Danke ScriptMan!

Genau das war der Fehler - hatte ich so nicht auf der Pfanne!

Nochmals Danke und gute Zeit!

Okamasi
vor 7 Jahre
Hallo zusammen,

ich bin was Scripting in SAP angeht relativ neu, sehe bei uns im Unternehmen aber das Potenzial dafür. Scripte mit dem Recorder aufzeichnen um Daten zu exportieren, diese in Excel über Makros weiterverarbeiten lassen, etc. klappt schon ziemlich gut. Als Nächstes möchte ich mich mit dem Import von Daten von Excel nach SAP befassen.

Mein Script basiert auf Jürgens. Der Debugger gibt mir jedoch jedes Mal an, dass er mit der Methode "session.findById" nicht zurecht kommt. Habt ihr irgendeine Vermutung woran das liegen könnte?

Anbei der Code:

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 = "/ncor2"

session.findById("wnd[0]").sendVKey 0

'Dim ExcelApp, ExcelWB, ExcelWS

set ExcelApp=createobject("Excel.Application")

ExcelApp.visible=true

set ExcelWB=ExcelApp.Workbooks.Open("C:\usw.\Mappe1.xlsx")

set ExcelWS=ExcelWB.Worksheets("Tabelle1")

Bis hierhin funktioniert alles gut

for i = 2 to ExcelApp.ActiveCell.SpecialCells(11).Row

for j = 1 to ExcelApp.ActiveCell.SpecialCells(11).Column

if j=1 then AUFNR = ExcelWS.Cells(i,j).Value

if j=2 then USR01 = ExcelWS.Cells(i,j).Value

next

session.findByld("wnd[0]/usr/ctxtCAUFVD-AUFNR").text=AUFNR

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

session.findById("wnd[0]/usr/tblSAPLCOVGTCTRL_5100/txtAFVGD-VORNR[0,9]").setFocus

session.findById("wnd[0]/usr/tblSAPLCOVGTCTRL_5100/txtAFVGD-VORNR[0,9]").caretPosition = 2

session.findById("wnd[0]").sendVKey 2

session.findById("wnd[0]/usr/tabsTABSTRIP_5110/tabpVOUS").select

session.findByld("wnd[0]/usr/ctxtAFVGD-USR01").text=USR01

session.findById("wnd[0]/usr/tabsTABSTRIP_5110/tabpVOUS/ssubSUBSCR_5110:SAPLCOVF:5159/txtAFVGD-USR01").setFocus

session.findById("wnd[0]/usr/tabsTABSTRIP_5110/tabpVOUS/ssubSUBSCR_5110:SAPLCOVF:5159/txtAFVGD-USR01").caretPosition = 6

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

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

next

msgbox"Alle Ladedaten eingetragen"

Ziel ist, dass fortlaufend Prozessauftragsnummern aus Excel in die TAC COR2 eingelesen werden, dann in die Vorgänge gesprungen wird und dort in einem Benutzerfeld eine Datumsangabe, wiederum aus Excel, importiert wird.

Danke im Voraus für eure Ideen.

Viele Grüße

Okamasi

Saptimierer
vor 7 Jahre
Schau doch mal, ob dies dein Probelm löst:

Set session = connection.Children(0)
geht davon aus, dass du in der ersten Session arbeiten willst. Falls du mehrere Modi geöffnet hattest und dann irgendwann den ersten geschlossen hast, gibt es connection.Children(0) und damit "Session" einfach nicht.

Okamasi
vor 7 Jahre
Hallo Saptimierer,

danke für den Ansatz. Das hat aber leider nichts bewirkt. Die Fehlermeldung ist nach wie vor dieselbe.

Saptimierer
vor 7 Jahre
Zitat von: Okamasi 

session.findById("wnd[0]").maximize

session.findById("wnd[0]/tbar[0]/okcd").text = "/ncor2"

session.findById("wnd[0]").sendVKey 0

Das wundert mich jetzt ein wenig, da die o.a. Zeilen ja noch korrekt verarbeitet werden. Oder?

Okamasi
vor 7 Jahre
Hallo Saptimierer,

sorry, dass ich erst jetzt antworte. Die letzten 2 Wochen ging es drunter und drüber.

Ja, die Transaktion wird noch korrekt aufgerufen.

Saptimierer
vor 7 Jahre
Dann weiss ich auch nicht weiter. Warum sollte das Session-Objekt in der Schleife nicht mehr existieren, davor aber schon? Dafür gib es ja eigentlich keinen vernünftigen Grund. Es sei denn, dein geposteter Code entspricht nicht 1:1 deinem echten.

Wir bevorzugen für solche (und andere) Datenimporte SimDia². Da muss man sich um solche Probleme keinen Kopf machen und hat das Ganze in 2 Minuten fertig.

Okamasi
vor 7 Jahre
Danke für deine Hilfe. Ich werde es einfach weiter versuchen.

Habe kürzlich den Job gewechselt und Simdia ist das Tool, dass ich am schmerzlichsten vermisse 🙂