Export einer Excel-Tabelle aus einem SAP-Programm innerhalb einer Transaktion

  • Excel

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ScriptMan.

    Export einer Excel-Tabelle aus einem SAP-Programm innerhalb einer Transaktion

    Hi ich hoffe irgendjemand kann mir hier helfen. Ich habe einen Code geschrieben, der mir zumindest mittlerweile die Tabelle in SAP öffnet und auch bis zu dem Fenster "Speichern unter" funktioniert. Ab hier komme ich allerdings nicht mehr weiter. Das Skript hängt sich jedes mal nach dem im ersten Pop-Up-Fenster "Enter" gedrückt wird und sich das "Speichern unter" Pop-Up öffnet auf.
    Ab hier kann ich nur noch den Task killen.

    SAP bleibt bedienbar, allerdings scheint das Skript hier nicht das richtige Fenster im Fokus zu haben oder Ähnliches...

    Als kurze Beschreibung:

    geöffnet wird die Transaktion "ZSA38" mit einer Variante "1150_DP_PUMPS"
    hier ist ein Timer von 15 Sekunden hinterlegt, da das aufrufen schonmal etwas dauern kann.
    Als nächsten wird der Export Button gedrückt -> Shift+F6 (43)
    Nun öffnet sich das erste Pop-Up zur Wahl der zu exportierenden Datei -> Excel .xlsx
    Als nächstes wird mit "Enter" bestätigt und es öffnet sich das zweite Pop-Up "speichern unter"

    Ab hier hängt sich das Skript auf.

    Mein Skript:

    Visual Basic-Quellcode

    1. Sub SAPScript()
    2. Dim sap_gui_auto As Object
    3. Dim sap_app As Object
    4. Dim connection As Object
    5. Dim session As Object
    6. Dim excel_file_path As String
    7. Dim df_materials As Object
    8. Dim materials As Variant
    9. Dim current_date As Date
    10. Dim start_date As Date
    11. Dim end_date As Date
    12. ' Überprüfen, ob bereits eine SAP-Sitzung geöffnet ist
    13. On Error Resume Next
    14. Set sap_gui_auto = GetObject("Sapgui.ScriptingCtrl.1")
    15. If Err.Number <> 0 Then
    16. ' SAP GUI Automatisierungsobjekt erstellen
    17. Set sap_gui_auto = CreateObject("Sapgui.ScriptingCtrl.1")
    18. End If
    19. On Error GoTo 0
    20. ' SAP GUI Anwendung öffnen
    21. sap_gui_auto.OpenConnection "Production (P14) - Central ERP"
    22. ' SAP GUI Anwendungsskript erstellen
    23. Set sap_app = sap_gui_auto.Children(0)
    24. ' Anmeldedaten eingeben
    25. Set session = sap_app.Children(0)
    26. session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "Benutzername" ' Benutzername
    27. session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "Passwort" ' Passwort
    28. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    29. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    30. session.findById("wnd[0]").sendVKey 3 ' Zurück-Button (F3) drücken
    31. ' Transaktion aufrufen und Programmaufruf tätigen
    32. session.findById("wnd[0]/tbar[0]/okcd").Text = "ZSA38" ' Transaktion "ZSA38" aufrufen
    33. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    34. ' Wartezeit, um sicherzustellen, dass das ZSA38-Fenster vollständig geladen ist
    35. Application.Wait Now + TimeValue("0:00:01")
    36. ' Navigiere zum Programmfeld
    37. session.findById("wnd[0]/usr").SetFocus
    38. session.findById("wnd[0]/usr/ctxtRS38M-PROGRAMM").Text = "ZPPLAP_DISPOLISTE"
    39. ' Button "Ausführen mit Variante" auswählen
    40. session.findById("wnd[0]").sendVKey (18) ' Button "Ausf. m. Variante" anklicken
    41. ' Wartezeit, um sicherzustellen, dass das Fenster vollständig geladen ist
    42. Application.Wait Now + TimeValue("0:00:01")
    43. ' Navigiere zum Textfeld im übergeordneten Popup-Fenster
    44. session.findById("wnd[1]/usr/ctxtRS38M-SELSET").Text = "1150_DP_PUMPS"
    45. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    46. session.findById("wnd[0]").sendVKey (8) ' Ausführen-Button (F8) drücken
    47. ' Wartezeit, um sicherzustellen, dass das Fenster vollständig geladen ist
    48. Application.Wait Now + TimeValue("0:00:15")
    49. ' Liste aller Bestands- und Dispositionsdaten
    50. session.findById("wnd[0]").sendVKey (43) ' Tabellenkalkulation
    51. ' Wartezeit, um sicherzustellen, dass das Fenster vollständig geladen ist
    52. Application.Wait Now + TimeValue("0:00:02")
    53. session.findById("wnd[0]").sendVKey (0) ' Enter-Taste drücken im ersten Pop-up-Fenster
    54. ' Eingabe im zweiten Pop-up-Fenster
    55. session.findById("wnd[1]/usr/txtSXF-FILENAME").Text = "Export_1150_DP_PUMPS.xlsx"
    56. session.findById("wnd[1]").sendVKey 0 ' Enter-Taste drücken
    57. ' SAP abmelden
    58. session.findById("wnd[0]").sendVKey 3 ' F12-Taste drücken
    59. session.findById("wnd[1]/usr/btnSPOP-VAROPTION1").press ' Dialog bestätigen
    60. session.findById("wnd[0]").sendVKey 3 ' F12-Taste drücken
    61. End Sub

    CodeTags gesetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo,

    hast du das script aufgezeichnet von SAP? oder selbst zusammengebastelt? Normalerweise brauchst du kein Wait oder ähnliches, da das Script automatisch wartet, bis SAP weiter macht bzw geladen ist.

    Ich würde dir als erstes mal raten, das script von SAP aufzeichen zu lassen. Also du startest die aufzeichnung und kopierst dann den code (mit ein paar anpassungen, was unnötig ist, wie focus oder caretposition etc...) und dann machst du einfach das, was das script letzendlich machen soll. (bis auf SAP schliessen, weil du willst ja das script noch haben. Dann probier mal den SAP generierten Code.

    Grüße
    nur mal ne idee, mach mal das wait alles raus, und machn haltepunkt bei 63 rein. dann schau was SAP macht. dann teste manuell {ENTER} und schau obs weiter geht.
    wenn ja, dann zweitere durchgang... haltepunkt bei 63, schritt für schritt ausführen und schauen was SAP macht bzw nicht macht.

    Wie gesagt, du kannst den ganzen Code direkt von SAP generieren lassen.

    Der Menupunkt heisst glaube ich Scripting und playback oder sowas in der art.
    Hallo,

    die Transaktion ZSA38 kann leider keiner kennen, weil diese kundenspezifisch ist. Ich würde aber trotzdem ab der besagten Stelle folgendes ausprobieren:

    Quellcode

    1. ' Liste aller Bestands- und Dispositionsdaten
    2. 'session.findById("wnd[0]").sendVKey (43) ' Tabellenkalkulation
    3. session.findById("wnd[0]/tbar[1]/btn[43]").press
    4. ' Wartezeit, um sicherzustellen, dass das Fenster vollständig geladen ist
    5. 'Application.Wait Now + TimeValue("0:00:02")
    6. 'session.findById("wnd[0]").sendVKey (0) ' Enter-Taste drücken im ersten Pop-up-Fenster
    7. session.findById("wnd[1]/tbar[0]/btn[0]").press
    8. ' Eingabe im zweiten Pop-up-Fenster
    9. session.findById("wnd[1]/usr/txtSXF-FILENAME").Text = "Export_1150_DP_PUMPS.xlsx"
    10. 'es ist zu testen, was richtig ist.
    11. 'session.findById("wnd[1]/usr/ctxtDY_FILENAME").text = "Export_1150_DP_PUMPS.xlsx"
    12. 'session.findById("wnd[1]").sendVKey 0 ' Enter-Taste drücken
    13. session.findById("wnd[1]/tbar[0]/btn[11]").press
    14. ' SAP abmelden
    15. 'session.findById("wnd[0]").sendVKey 3 ' F12-Taste drücken
    16. 'session.findById("wnd[1]/usr/btnSPOP-VAROPTION1").press ' Dialog bestätigen
    17. 'session.findById("wnd[0]").sendVKey 3 ' F12-Taste drücken
    18. End Sub


    Aber wie schon rOtzi zuvor gemeint hat, die beste Lösung wäre eine Aufzeichnung des Skriptes über den eigenen SAP GUI Scriptrecorder.

    Grüße, ScriptMan
    Also ich habe nun nochmal ausgiebig getestet. Leider ist es mir nicht möglich den SAP-Eigenen Script-Recorder zu verwenden, da dieser von meiner Firma nicht freigeschaltet ist.

    Allerdings kann ich mit Sicherheit sagen, dass er bei dem Export Befehl aussteigt. Meine Vermutung liegt hier auf dem Pausieren von SAP. Bedeutet sobald sich das Fenster für das Speichern unter öffnet, ist SAP im Hintergrund pausiert (Die Frage ist, ob wirklich nur SAP pausiert ist?). Ersichtlich wird das durch den Ladegreis am Mauszeiger wenn man diesen außerhalb des Speichern unter Fensters bewegt. Ich habe nun zumindest das Format vorgeben können, sodass also immer eine xlsx Datei als export erzeugt wird und somit spare ich mir das eine mal "Enter". Das bedeutet aber auch, dass sich das Script direkt bei dem Befehl (43) [Zeile 63] im obigen Code aufhängt.

    Ebenso bei deiner Variante "ScriptMan" mit dem Button 43 -> session.findById("wnd[0]/tbar[1]/btn[43]").press

    Bedeutet ich schaffe es nicht aus diesem Menü heraus. Jetzt hätte ich 3 Ideen das Ganze zu umgehen:

    1. Das Script im Hintergrund ausführen ohne wirklich SAP als Fenster im Vordergrund zu öffnen. Macht das Sinn? Weiß hier jemand wie ich das bewerkstelligen kann?
    2. Ein vorher getriggertes "Enter" ausführen. Bedeutet ich lasse ein "Enter" Befehl mit 20- Sekunden Verzögerung starten bevor ich die (43) zum speichern unter betätige. Könnte meiner Meinung nach diese Schleife durchbrechen, allerdings ist das nur eine Idee.
    3. Statt des Excel-Exports manuell die Werte aus der ausgegebenen Tabelle in ein Excel-Blatt kopieren. Vielleicht hat auch hier jemand einen Ansatz für mich, denn das Aufrufen der Tabelle und anzeigen der Werte klappt ja tadellos.

    Freundliche Grüße!
    Drish
    Hi, es gibt einige transaktionen wo man das wirklich nicht richtig benutzen kann. dann kannst du vllt einen umweg nehmen...
    ich habe auch 1-2 transaktionen wo das nicht geht, dann speichere ich den output als txt mit tabulatoren und importiere das in ein excel blatt und erledige den rest direkt in excel.

    Schau mal, im menueband oben unter datei, wie du die liste noch speichern kannst.
    Das mag durchaus sein, allerdings befinden wir uns doch hier gerade in einem Forum in dem es genau um Virtual Basic und eben dessen Programmierung und Anbindung an andere Programme geht oder nicht?
    Also versteh mich bitte nicht falsch, aber genau das, ist doch der Reiz an der Ganzen Sache. Das meiste von dem was es bereits auf dem Markt gibt, macht nicht genau das was du möchtest oder einfach zu viele Schritte die man nicht benötigt.

    Für mich macht das absolut Sinn, da ich diese Schritte während meiner Arbeitswoche ständig wiederhole. :)
    Hi,

    über den unkonventionellen .txt Export habe ich es nun geschafft und konnte die Liste exportieren. In einem weiteren Script habe ich dann die Schritte zum kopieren und formatieren in eine neue Excel-Mappe geschrieben.
    Ist zwar etwas umständlich, aber es funktioniert.

    Ich fand auch einen weiteren Hinweis, weshalb der Excel-Export vermutlich scheitert. Dadurch dass das "Speichern unter" Fenster in dem Fall ein Windows Befehl ist, müsste man ein kleines eigenes Script in einer .vbs schreiben, dass das Verzeichnis und den Dateinamen über Windows-shell triggert und einträgt und danach "Enter" bestätigt.

    Man müsste also im Hauptscript dann dieses kleine .vbs Script aufrufen um die Schritte auszuführen, da sich hier SAP und Windows überschneiden.

    Getestet habe ich das nicht, allerdings klingt es mehr als logisch für mich und erklärt auch, weshalb sich das Script an dem Punkt aufhängt.
    ​Das meiste von dem was es bereits auf dem Markt gibt, macht nicht genau das was du möchtest oder einfach zu viele Schritte die man nicht benötigt.

    Völlig richtig. Außerdem müsste man sich in die Tools auch noch einlesen/einarbeiten.

    Ich wollte nur aufzeigen dass es auch noch viele andere Möglichkeiten gibt. Manchmal schießt man sich ja auf einen Weg ein und verfolgt diesen weiter auch wenn es holprig wird.
    Und nebenan ist die geteerte Schnellstraße die man nicht rechtzeitig gesehen hat :)
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!
    Das ist ein schöner Vergleich. Ich vergleiche das noch treffender mit den Mautautobahnen :D.
    Entweder du zahlst das Geld und kommst schnell von A nach B, oder aber du fährst entspannt die Umgehung die eben etwas länger dauert ohne Maut.

    Jedenfalls ist es natürlich immer gut, auch auf andere Straßen hinzuweisen bevor man sich verirrt.
    Hey danke für den Hinweis!
    Werde ich mir definitiv anschauen.

    Ich stehe aktuell vor dem nächsten PRoblem... Nachdem Export 1 nun tadellos funktioniert, hab ich mich an den 2.Export gemacht.

    Dieser soll aus einem Querry die offenen Bestellungen zu bestimmten Materialnummern exportieren. Das funktioniert genau bis zur Variantenauswahl.
    Eigentlich muss hier nur noch die "Enter" Taste gedrückt werden, sprich: session.findById("wnd[1]").sendVKey 0

    Und jetzt kommts:

    Führe ich diesen Befehl aus, öffnet sich die Drucksteuerung? :D Mache ich genau das Selbe in dem geöffneten SAP, das durch das Skript gesteuert wird, öffnet er wie gewollt die Variante. Hat jemand eine Idee was hier jetzt los ist? Das entzieht sich für mich jeder Logik...

    Code:

    XML-Quellcode

    1. Sub SAP_Open_Orders()
    2. Dim sap_gui_auto As Object
    3. Dim sap_app As Object
    4. Dim connection As Object
    5. Dim session As Object
    6. Dim excel_file_path As String
    7. Dim df_materials As Object
    8. Dim materials As Variant
    9. Dim current_date As Date
    10. Dim start_date As Date
    11. Dim end_date As Date
    12. Dim rowCount As Integer
    13. Dim columnCount As Integer
    14. Dim excelsheet As Variant
    15. Dim table As Variant
    16. Dim currentDate As String
    17. ' Überprüfen, ob bereits eine SAP-Sitzung geöffnet ist
    18. On Error Resume Next
    19. Set sap_gui_auto = GetObject("Sapgui.ScriptingCtrl.1")
    20. If Err.Number <> 0 Then
    21. ' SAP GUI Automatisierungsobjekt erstellen
    22. Set sap_gui_auto = CreateObject("Sapgui.ScriptingCtrl.1")
    23. End If
    24. On Error GoTo 0
    25. ' SAP GUI Anwendung öffnen
    26. sap_gui_auto.OpenConnection "Production (P14) - Central ERP"
    27. ' SAP GUI Anwendungsskript erstellen
    28. Set sap_app = sap_gui_auto.Children(0)
    29. ' Anmeldedaten eingeben
    30. Set session = sap_app.Children(0)
    31. session.findById("wnd[0]/usr/txtRSYST-BNAME").Text = "BENUTZERNAME" ' Benutzername
    32. session.findById("wnd[0]/usr/pwdRSYST-BCODE").Text = "PASSWORT" ' Passwort
    33. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    34. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    35. session.findById("wnd[0]").sendVKey 3 ' Zurück-Button (F3) drücken
    36. ' Transaktion aufrufen und Programmaufruf tätigen
    37. session.findById("wnd[0]/tbar[0]/okcd").Text = "SQ00" ' Transaktion "SQ00" aufrufen
    38. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    39. ' Navigiere zum Programmfeld
    40. session.findById("wnd[0]/usr").SetFocus
    41. session.findById("wnd[0]/usr/ctxtRS38R-QNUM").Text = "Z_MM_OFF_BEST"
    42. session.findById("wnd[0]").sendVKey 0 ' Enter-Taste drücken
    43. ' Button "Ausführen mit Variante" auswählen
    44. session.findById("wnd[0]").sendVKey (18) ' Button "Ausf. m. Variante" anklicken
    45. ' Wartezeit, um sicherzustellen, dass das Fenster vollständig geladen ist
    46. Application.Wait Now + TimeValue("0:00:01")
    47. ' Navigiere zum Textfeld im übergeordneten Popup-Fenster
    48. session.findById("wnd[1]/usr/ctxtRS38R-VARIANT").Text = "1150_DP_PUMPS"
    49. ' Drücke die Enter-Taste
    50. session.findById("wnd[0]").sendVKey 0 ' <------------ HIER WIRD DIE DRUCKSTEUERUNG GEÖFFNET, STATT DER GEWOLLTEN GEWÄHLTEN TRANSAKTION UND VARIANTE!
    51. session.findById("wnd[0]").sendVKey 8 ' Enter-Taste drücken
    52. session.findById("wnd[1]").pressEnter
    53. ' Excel-Anwendung anzeigen
    54. ExcelApp.Visible = True
    55. ' Speichern der Excel-Datei mit aktuellem Datum im Dateinamen
    56. currentDate = Format(Date, "dd_MM_yyyy")
    57. ExcelWorkbook.SaveAs "O:\Production_1150_All\Auftragsmanagement\Auftragsmanagement ETA\DISPO\Klose\00_FORECASTS\FORECAST_DP-Pumps\Export-Daten\Export_1150_DP_PUMPS_OPEN_ORDERS" & currentDate & ".xlsx"
    58. ' Abmeldung durchführen
    59. Set session = sap_app.Children(0)
    60. session.findById("wnd[0]").Close ' SAP-Session schließen
    61. 'session.findById("wnd[0]").sendVKey (0) ' Enter-Taste drücken im ersten Pop-up-Fenster
    62. session.findById("wnd[0]/tbar[0]/btn[0]").Press
    63. sap_app.CloseConnection ' SAP-Verbindung trennen
    64. ' Freigabe der Objekte
    65. Set session = Nothing
    66. Set sap_app = Nothing
    67. Set sap_gui_auto = Nothing
    68. ' Aufräumen
    69. Set ExcelWorksheet = Nothing
    70. Set ExcelWorkbook = Nothing
    71. Set ExcelApp = Nothing
    72. MsgBox "Die Daten wurden erfolgreich in eine Excel-Tabelle importiert.", vbInformation

    End Sub

    Gruß Dennis

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Drish-FU8“ ()

    Es ist wirklich schon erstaunlich, was man alles ohne SAP eigenen Skriptrecorder so entwickeln kann. Dadurch können aber manchmal kleine Fehler entstehen, die dann große Wirkung haben. Es könnte sein, dass die nachfolgende Änderung weiterhelfen könnte:

    'nachfolgende Zeile ist deaktiviert
    'session.findById("wnd[0]").sendVKey 0 ' <------------ HIER WIRD DIE DRUCKSTEUERUNG GEÖFFNET, STATT DER GEWOLLTEN GEWÄHLTEN TRANSAKTION UND VARIANTE!

    session.findById("wnd[1]").sendVKey 8 ' Enter-Taste drücken im Fenster für Variantenauswahl
    session.findById("wnd[0]").sendVKey 8 ' Enter-Taste drücken im Transaktionsfenster

    'es ist zu testen, ob es überhaupt noch notwendig ist.
    'entweder
    session.findById("wnd[1]").pressEnter
    'oder
    session.findById("wnd[0]").pressEnter

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ScriptMan“ ()

    session.findById("wnd[1]").sendVKey 8 ' Enter-Taste drücken im Fenster für Variantenauswahl
    session.findById("wnd[0]").sendVKey 8 ' Enter-Taste drücken im Transaktionsfenster
    session.findById("wnd[1]").pressEnter
    session.findById("wnd[0]").pressEnter

    In jedem der Fälle schließt sich SAP sofort und das Skript hängt und muss mit dem Task-Manager beendet werden.

    Bzw. ich muss ergänzen, rufe ich die Transaktion ohne Variantenauswahl auf, dann kann ich mit "sendVKey 8" die Transaktion ausführen, bringt mir nur nichts ohne die Variante. :)
    Ich verstehe nur nicht, weshalb ein "Enter" Befehl der in dem vorherigen und auch diesem VB Skript öfter vorkommt, plötzlich etwas ganz anderes bewirkt als wenn ich selbst auf der Tastatur in dem bis dato ausgeführten Skript "Enter" drücke.