SAP Jobsuche bei DV-Treff
newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 9 Jahre
Hallo Forumsgemeinde,

entweder bin ich zu doof oder ich weiß nicht. Ich komme einfach nicht weiter. Rufe aus excel Kalkulationen aus der ck13 ab um diese zu vergleichen. Starte aus excel mit Übergabe der Variablen, danach wird das Ergebnis in eine Datei geschrieben und das Excel Makro läuft weiter. Das funktioniert soferne es eine Kalk gibt ganz gut. Das Problem ist nur, wenn es keine gibt bleibe ich im Excel Makro hängen und kann nur mehr mit ESC abbrechen. Dachte mir daher, wenn ich in SAP auf einen Fehler stoße fange ich den ab und exportiere ein anderes Material in eine neue Datei und arbeite mit diesem Zeitstempel in excel weiter.

Dachte mir, eigentlich sollte Error Handling kein Problem sein aber was soll ich noch sagen.

Hier der Code:

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

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

session.findById("wnd[0]/usr/ctxtCKI64A-KLVAR").text = "GKBA"

session.findById("wnd[0]/usr/ctxtCKI64A-MATNR").text = Materialnr

session.findById("wnd[0]/usr/ctxtCKI64A-WERKS").text = Werk

session.findById("wnd[0]/usr/ctxtCKI64A-KADAT").text = ""

session.findById("wnd[0]/usr/ctxtCKI64A-BIDAT").text = "31.12.9999"

session.findById("wnd[0]/usr/ctxtCKI64A-BIDAT").setFocus

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

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

---hier kommmt der Fehler im Script---- in SAP kommt die Message Kalkulation nicht gefunden

Also dachte ich mir ich mach so weiter

On Error Resume Next

Err.Clear

Standardcode

if Err.Number <> 0 then

Fehlercode

end if

Dieses Spiel habe ich schon auf unterschiedlichste Weisen probiert und ich kriegs nicht hin. Wenn ich das script ausführe komme ich immer auf den Standardcode. Bei anderen Konstellationen wird dann zB der Standardcode ausgeführt aber dann auch der Fehlercode.

Vielleich kann mir ja jemand von euch helfen.

mfg

newgui

Förderer

ScriptMan
vor 9 Jahre
Hallo newgui,

damit du nicht mehr länger verzweifelt bist, kannst du folgendes ausprobieren:

. . .

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

wscript.sleep 1000

if session.findById("wnd[0]/sbar").text = "Kalkulation nicht gefunden" then

Fehlercode

else

Standardcode

end if

oder

if session.findById("wnd[0]/sbar").messageType = "E" then 'weitere Typen: W, I, S, A

Fehlercode

else

Standardcode

end if

. . .

Grüße,

ScriptMan

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 9 Jahre
Hallo scriptman,

also wenn ich jetzt eine Frau wäre, wärst du mein Ritter in der schimmernden Rüstung 😁

Danke, das funktioniert (wie immer).

Jetzt hätte ich da noch eine weitere Frage. Hoffe das ist jetzt nicht unverschämt. Rufe ja aus excel das script auf. Wenn es keinen Fehler gibt dann wird mittels Do while Schleife die Speicherzeit abgerufen und sobald die Datei gespeichert wurde läuft das excel makro weiter.

Set WSHShell = CreateObject("WScript.Shell")

WSHShell.Run """script.vbs""" & " " & Materialnr & " " & Werk & " " & Datum_v1

Set WSHShell = Nothing

Do While Now() > Range("F1").Value

Speicherzeit_Exp_v2 = FileDateTime(Pfad_Exp_v2) + TimeSerial(0, 0, 5)

Range("F1") = Speicherzeit_Exp_v2

Loop

....

Jetzt kommt es natürlich vor, dass es zB die Kalkulation oder die Kalkulation für den gewünschten Zeitraum nicht gibt. Dann bleibt excel ja an und für sich in der Schleife hängen. Die eine Lösung wäre ja jetzt deine Antwort. Mich würde nur interessieren ob es eine direkte Möglichkeit gäbe das excel Makro zu beenden wenn es keine Kalkulation gibt, also so quasi eine direkte Kommunikation zwischen excel makro und SAP gui scripting.

Ehrlich gesagt ich kann es mir zwar nicht vorstellen aber das mag nichts heißen. Oder vielleicht gibt es auch noch eine andere Lösung an die ich nicht kenne. Bin für alles offen.

mfg

newgui

ScriptMan
vor 9 Jahre
Hallo newgui,

zuerst freut es mich, dass es bei dir auch funktioniert. Danke auch für das Kompliment. Wir beide können aber nur mutmaßen, ob sich eine Frau tatsächlich durch unser "Geplänkel" in eine Ekstase bringen lässt. 😕

Aber jetzt zu deiner neuen Anfrage. Ich habe es auch noch nicht machen müssen. Auf diese Weise habe ich nun eine eigene Weiterbildung absolviert. Das Ergebnis meiner Recherche folgt hier:

- Die Run-Methode erlaubt kein Return aus VBA heraus.

z.B. folgender Code ist nicht zulässig:

return = wshshel.run("""script.vbs""" & " " & Materialnr & " " & Werk & " " & Datum_v1, 1, True)

- Stattdessen muss man die Exec-Methode verwenden.

z.B. wie folgt:

Dim WSHShell as Object

Dim WSHSHell_Execute as Object

Set WSHShell = CreateObject("Wscript.Shell")

Set WSHShell_Execute = WSHShell.Exec("wscript.exe c:\tmp\script.vbs" & " " & Materialnr & " " & Werk & " " & Datum_v1)

Do While WSHShell_Execute.Status = 0

DoEvents

Loop

Return = WSHShell_Execute.StdOut.ReadAll

Set WSHShell_Execute = Nothing

Set WSHShell = Nothing

if Return <> "Fehler" then

Do While Now() > Range("F1").Value

Speicherzeit_Exp_v2 = FileDateTime(Pfad_Exp_v2) + TimeSerial(0, 0, 5)

Range("F1") = Speicherzeit_Exp_v2

Loop

end if

....

In deinem VBS-Script musst du nun an einer geeigneter Stelle folgendes ergänzen:

z.B.

on error resume next

myError_Text = session.findById("wnd[0]/sbar").text

on error goto 0

if left(myError_Text,11) = "Kalkulation" then wscript.stdout.writeLine "Fehler"

Grüße,

ScriptMan

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 9 Jahre
Hallo scriptman,

da magst du schon Recht haben, dass sich zumindest maximal eine handvoll Frauen aufgrund unseres Geplänkels in Extase versetzen lassen 😂

Danke für dein Selbsstudium. Habe mal den Code in excel eingefügt. Leider bekomme ich bei

Return = WSHShell_Execute.StdOut.ReadAll

immer einen Syntaxfehler.

Habe das Return dann mal rausgenommen, damit ich mal sehe was der Rest macht.

Do While WSHSHell_Execute.Status = 0

Hier bekomme ich dann einen Scripftfehler (Index außerhalb des Bereiches). Was macht dieses Ding eigentlich, oder muss ich den scriptcode von dir vorher noch ins vbs schreiben das es funktionier - da habe ich jetzt noch nicht gemacht?

Weiter konnte ich es jetzt nicht testen da ich da nicht drüber komme.

Finde es aber trotzdem total faszinierend wie du sowas immer weißt.

Übrigens wir hatten ja vor längerer Zeit in einem anderen Thread mal die Diskussion wg. guixt Lizenzen. Da wusste ich noch nicht ob wir die bekommen. War total überrascht, dass ich aus einem kleinen Fachbereich volle Unterstützung unserer Zentral IT erhalten habe. Lizenzen konnten wir uns dann selbst besorgen. Inzwischen sind schon fast 70 Lizenzen verbraucht und ich habe sogar für Kollegen in den USA schon eine eigene Bildschirmmaske mit direkten Absprüngen in div. Transaktionen/Prozessvereinfachungen usw. erstellt. Die sind total happy damit. Bekomme auch immer die RM meiner Kollegen, dass sie sich SAP ohne die guixt Maske und Vereinfachungen gar nicht mehr vorstellen könnten 😁.

Bin echt der Meinung das guixt in Verbindung mit gui scripting und excel extrem viel Potential hatund eigentlich, wie man auch anhand des Forums merkt, viel zu wenig Beachtung findet.

Danke nochmal für deine Unterstützung.

mfg

newgui

ScriptMan
vor 9 Jahre
Hallo newgui,

es ist mein Fehler. Ich habe die letzte Version nicht getestet und einfach nur hingeschrieben. Das Wort "Return" ist aber wahrscheinlich in VBA ein geschütztes Wort und daher musst du noch eine Änderung machen:

z.B.:

Dim WSHShell as Object

Dim WSHSHell_Execute as Object

Set WSHShell = CreateObject("Wscript.Shell")

Set WSHShell_Execute = WSHShell.Exec("wscript.exe c:\tmp\script.vbs" & " " & Materialnr & " " & Werk & " " & Datum_v1)

Do While WSHShell_Execute.Status = 0

DoEvents

Loop

myReturn = WSHShell_Execute.StdOut.ReadLine

Set WSHShell_Execute = Nothing

Set WSHShell = Nothing

if myReturn <> "Fehler" then

Do While Now() > Range("F1").Value

Speicherzeit_Exp_v2 = FileDateTime(Pfad_Exp_v2) + TimeSerial(0, 0, 5)

Range("F1") = Speicherzeit_Exp_v2

Loop

end if

....

Bemerkung:

Die oberen Zeilen befinden sich alle innerhalb eines VBA-Programmes.

WSHShell_Execute.Status hat nur 2 Zustände: 0 oder 1. Der Zustand = 1 tritt ein, wenn die auszuführende Applikation beendet ist.

script.vbs:

. . .

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

wscript.sleep 1000

on error resume next

myError_Text = session.findById("wnd[0]/sbar").text

on error goto 0

if left(myError_Text,11) = "Kalkulation" then wscript.stdout.writeLine "Fehler"

'Fehlercode

else

'Standarcode

end if

. . .

Ich kann mich an die Diskussion noch gut erinnern. Schön, dass die zentrale IT einen aus der Fachabteilung ernstgenommen und unterstützt hat. Das passiert eigentlich sehr selten. Im Unterschied zu dir, bin ich ein Teil der IT. Meine Kollegen können und wollen auch nicht mehr ohne die ganzen Zusatzapplikation auskommen. Und das ist bei uns auch eine ganze Menge. Vielwichtiger als die IT ist die Leitung des Unternehmens. Die muss auch dahinter stehen. Irgendwann wirst du aber auch an deine Grenzen kommen, weil alles was du kreierst, man dann auch supporten muss.

Ich wünsche dir dabei viel Durchstehvermögen!

Grüße,

ScriptMan

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 9 Jahre
Hallo scriptman,

danke wieder mal für deine Hilfe. Das klappt super und an und für sich erspare ich mir jetzt mit dem Do Events loop im script in excel die Schleife für die Speicherzeit, den die kann ich ja dann direkt nach My Return <> "Fehler" wegschreiben. Du bist einfach genial.

Das stimmt schon, dass die Unternehmensführung dahinter stehen muss. Bei uns am Standort ist es sicherlich kein Thema aber ganz oben im Konzern ist es wichtig. Nur die wissen von mir zum Glück nichts 😁 .

Das mit dem Support ist sicherlich auch so eine Sache. Da ich inzwischen schon jenseits der 100 queries gemacht und das ganze Monatsreporting und einige Prozesse übers scripting automatisiert habe kommt da natürlich immer wieder mal was rüber. Einige queries werden sicherlich öfters verwendet als viele Transaktionen (eins meiner queries hatte bereits vor 3 Jahren mehr als 100.000 Abrufe)

Guixt ist zum Glück nicht so viel Aufwand, den das erstellt man einmal und dann kommt nur ab und an mal was dazu. Über excel läuft halt auch sehr viel (inzwischen halt schon sehr vieles in Verbindung mit dem scripting).

Das Problem ist halt, dass bei uns am Standort viele Dinge ein bisserl anders laufen als im restlichen Konzern. Daher dauern Änderungen oder Neuerungen oft ewig. Nur mal so als Beispiel, wenn ich nicht vor langer Zeit ein query für den Istumsatz gemacht hätte könnten wir den korrekten Umsatz in der offiziellne Transaktion seit mehr als 1 Jahr nicht mehr darstellen.

Darüber nachdenken darf man eigentlich nicht wenn mal was mit mir sein sollte bin aber dabei eine Kollegin aufzubauen.

Wie ist das eigentlich bei dir? Auch wenn du in der IT bist, dein Wissen ist ja auch sehr spezifisch. Und das Lesen eines Codes ist ja das eine, den Hintergrund zu verstehen das andere.

mfg

newgui

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 9 Jahre
Hallo scriptman,

eine Frage ist da jetzt doch noch aufgetaucht.

session.findById("wnd[0]/mbar/menu[5]/menu[5]/menu[1]").select

session.findById("wnd[1]/usr/txtRSYSF-STRING").text = Datum1

session.findById("wnd[1]/usr/txtRSYSF-STRING").caretPosition = 7

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

Hier kann es passieren, dass es die Kalkulation zwar gibt aber nicht mit mit dem gewünschtem Datum1.

Dann kommt eine Information "Suche erfolglos....."

Jetzt hätte ich den Text ausgelesen, mit einem code von dir.

MESSAGE_TEXT = session.findById("wnd[1]").text

Soweit so gut. Problem ist nur beim Text kommt jetzt "Suchen" raus und das unabhängig ob das Datum gefunden wird oder nicht. Es wird anscheinend nur der Text vom ursprünglichen Suchfenster gelesen.

Jetzt weiß ich nicht ob es für ein Informationsfenster das aufpoppt noch einen eigenen code gibt?

Im Prinzip geht es darum, dass wenn das Datum nicht gefunden wird, das script wie bei der ursprünglichen Fragestellung im Thread abbricht.

Ich hoffe du kannst mir da nochmals helfen. Danke.

mfg

newgui

ScriptMan
vor 9 Jahre
Hallo newgui,

ich kann es nur mutmaßen, wie es bei dir in dem geschilderten Fall aussieht. Leider habe ich keinen Zugriff auf die TA = ck13.

Mit dem Code MESSAGE_TEXT = session.findById("wnd[1]").text

liest du den Text aus dem blauen Balken eines Fensters heraus. Wenn aber der Text innerhalb eines Info-Fensters erscheint, könntest du folgendes ausprobieren:

Message_Text1 = Trim(session.findById("wnd[1]/usr/txtMESSTXT1").text)

Message_Text2 = Trim(session.findById("wnd[1]/usr/txtMESSTXT2").text)

Wenn das auch nicht zum Erfolg führen sollte, dann muss man den Fehlerfall mit dem Scriptrecorder aufzeichnen und an der Stelle beenden, indem man mit der Maus in den Infotext reinklickt. Dann nimmt man die letzte Zeile aus dem Skript und ergänzt diese mit ".text". Fertig.

Viel Spaß beim Testen!

Grüße,

ScriptMan

newgui
  • newgui
  • SAP Forum - Experte Thema Starter
vor 9 Jahre
Hallo scriptman,

der Tipp mit dem Infotext im script recorder war Gold wert. Jetzt funktioniert das ganze endlich dank deiner Hilfe. 😁

Übrigens hast du schon mal den Scripting Tracker von Stefan Schnell probiert? Der ist echt super, da kann man aufzeichnen und das Ergebnis gleich wieder abspielen und ggf. mit ergänztem Coding auch gleich testen. Nur falls du den noch nicht kennst.

Findest du auf seiner Homepage.

http://www.stschnell.de/ 

mfg

newgui

RonsSambarobics
vor 3 Jahre
Hallo Scriptman (hoffentlich gibt es dich noch) ich habe leider auch ein Problem mit meinem Script. ich möchte gerne bei mehreren Bestellungen das Obligo schließen. allerdings kann er den Speicherdialog nicht handlen, da er den Dialog umgeht und dann einfach nicht speichert. Wenn ich ihm jedoch sage, dass er den Dialog bestätigen soll, kommt das Problem auf, dass der Speicherdialog nicht immer kommt und er dann den Befehl als Fehler ausgibt. hier ein Auszug aus meinem Script.

Zitat:

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

session.findById("wnd[0]/tbar[0]/okcd").Text = "/nME22N"

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

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

session.findById("wnd[1]/usr/subSUB0:SAPLMEGUI:0003/ctxtMEPO_SELECT-EBELN").Text = EB

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

session.findById("wnd[0]/usr/subSUB0:SAPLMEGUI:0010/subSUB2:SAPLMEVIEWS:1100/subSUB2:SAPLMEVIEWS:1200/subSUB1:SAPLMEGUI:1211/btnSCHNELLAEND").press

session.findById("wnd[1]/usr/btnB_SEARCH").press

session.findById("wnd[2]/usr/txtGD_SEARCHSTR").Text = "endlieferung"

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

session.findById("wnd[1]/usr/btnAPP_WL_SING").press

session.findById("wnd[1]/usr/btnB_SEARCH").press

session.findById("wnd[2]/usr/txtGD_SEARCHSTR").Text = "endrechnung"

session.findById("wnd[2]/usr/txtGD_SEARCHSTR").caretPosition = 11

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

session.findById("wnd[1]/usr/btnAPP_WL_SING").press

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

session.findById("wnd[1]/usr/subSUB1:SAPLMEGUI:0051/subSUB1:SAPLMMDV:0010/ctxtMEGUI_MASSCH_ALLOWED_FIELDS-ELIKZ").Text = "X"

session.findById("wnd[1]/usr/subSUB1:SAPLMEGUI:0051/subSUB3:SAPLMMDV:0020/ctxtMEGUI_MASSCH_ALLOWED_FIELDS-EREKZ").Text = "X"

session.findById("wnd[1]/usr/subSUB1:SAPLMEGUI:0051/subSUB3:SAPLMMDV:0020/ctxtMEGUI_MASSCH_ALLOWED_FIELDS-EREKZ").SetFocus

session.findById("wnd[1]/usr/subSUB1:SAPLMEGUI:0051/subSUB3:SAPLMMDV:0020/ctxtMEGUI_MASSCH_ALLOWED_FIELDS-EREKZ").caretPosition = 1

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

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

session.findById("wnd[1]/usr/btnSPOP-VAROPTION1").press

On Error Resume Next