SAP Jobsuche bei DV-Treff
Maxemilan
  • Maxemilan
  • SAP Forum - Neuling Thema Starter
vor 12 Jahre
Hallo Leute,

ich stehe gerade vor einem Problem, hier schonmal der Code, wichtig ist das markierte am Ende:

Public Sub SAP()
    On Error GoTo Fehler
    Application.DisplayAlerts = False
    
    Dim SapGuiApp As Object
    Dim oConnection As Object
    Dim SAPSesi As Object
    
    If SapGuiApp Is Nothing Then
        Set SapGuiApp = CreateObject("Sapgui.ScriptingCtrl.1")
    End If
    
    If oConnection Is Nothing Then
        Set oConnection = SapGuiApp.OpenConnection(sapSystem, True)
    End If
    
    If SAPSesi Is Nothing Then
       Set SAPSesi = oConnection.Children(0)
    End If
    
    With SAPSesi
        .findById("wnd[0]/usr/txtRSYST-MANDT").Text = sapClient
        .findById("wnd[0]/usr/txtRSYST-BNAME").Text = SAPForm.BoxUser.Text
        .findById("wnd[0]/usr/pwdRSYST-BCODE").Text = SAPForm.BoxPass.Text
        .findById("wnd[0]/usr/txtRSYST-LANGU").Text = "DE"
        .findById("wnd[0]").sendVKey 0
        
        '----------------------------------------------------------------
        'SAP SKRIPT
        '----------------------------------------------------------------
        'CO02 ausführen
        .findById("wnd[0]/tbar[0]/okcd").Text = "CO02"
        .findById("wnd[0]").sendVKey 0
        
        'Daten eingeben & ausführen
        For i = 2 To Sheets(1).UsedRange.Rows.Count
            If Cells(i, 3).Value = "" Then
                'Auftrag eingeben
                .findById("wnd[0]/usr/ctxtCAUFVD-AUFNR").Text = Cells(i, 1).Value
                .findById("wnd[0]").sendVKey 0
                
                'String suchen
                On Error GoTo Weiter
                .findById("wnd[0]/mbar/menu[1]/menu[1]").Select
                .findById("wnd[1]/usr/txtRSYSF-STRING").Text = Cells(i, 2).Value
                .findById("wnd[1]/usr/txtRSYSF-STRING").caretPosition = 10
                .findById("wnd[1]").sendVKey 0
                
                'Gesuchten Auftrag auflisten
                .findById("wnd[2]/usr/lbl[16,2]").SetFocus
                .findById("wnd[2]/usr/lbl[16,2]").caretPosition = 7
                .findById("wnd[2]").sendVKey 2
                .findById("wnd[0]/tbar[1]/btn[18]").press
                
Weiter:
                'Datum ändern
                On Error Resume Next
                .findById("wnd[0]/usr/tabsTABSTRIP_0115/tabpKOZE/ssubSUBSCR_0115:SAPLCOKO1:0120/ctxtCAUFVD-GLTRP").Text = Range("E1").Value
                .findById("wnd[0]/usr/tabsTABSTRIP_0115/tabpKOZE/ssubSUBSCR_0115:SAPLCOKO1:0120/ctxtCAUFVD-GLTRP").SetFocus
                .findById("wnd[0]/usr/tabsTABSTRIP_0115/tabpKOZE/ssubSUBSCR_0115:SAPLCOKO1:0120/ctxtCAUFVD-GLTRP").caretPosition = 10
                .findById("wnd[0]").sendVKey 0
                .findById("wnd[0]").sendVKey 0
                .findById("wnd[0]").sendVKey 0
                .findById("wnd[0]").sendVKey 0
                
                'Speichern
                '.findById("wnd[0]").sendVKey 12
                .findById("wnd[0]/tbar[0]/btn[11]").press
                Cells(i, 3).Value = "Ok"
[h]                .findById("wnd[1]/usr/btnSPOP-OPTION1").press[/h]
                'Range(Cells(i, 1), Cells(i, 2)).Interior.Color = 6
            End If
        Next
    End With
Beenden:
    Application.DisplayAlerts = True
    Set SAPSesi = Nothing
    Set oConnection = Nothing
    Set SapGuiApp = Nothing
    Exit Sub
    
Fehler:
    MsgBox Err.Description, vbCritical, "Fehler"
    GoTo Beenden
End Sub

Ab und zu wirft SAP eine Warnmeldung beim speichern, diese Meldung kann ich mit dem gelb markierten Befehl bestätigen. Wenn diese Meldung allerdings nicht kommt, stürzt alles ab.

Was nun? Errorhandling scheint hier nicht zu funktionieren. Kann ich irgendwie prüfen, ob wnd[1] existiert? oder gar der Button existiert?

Bitte helft mir, sonst darf ich heute noch drei Stunden manuell Daten ändern.

Danke & Grüße aus Regensburg!

ScriptMan
vor 12 Jahre
Hallo Maxemilan,

die Antwort auf deine Frage findest du unter:

http://scn.sap.com/thread/3263889 

Freundliche Grüße

ScriptMan

Maxemilan
  • Maxemilan
  • SAP Forum - Neuling Thema Starter
vor 12 Jahre
Hallo SkriptMan, danke für die Antwort.

Leider ist das Problem, dass das Error-Handling nicht zu funktionieren scheint. VBA hat nach wie vor das kommando zum Error Handling.

Kann es sein, dass das bei Signalen an den Scripting Host nicht funktioniert? Daher mein Überlegung, zunächst zu prüfen, ob der Button existiert. Geht das?

Maxemilan
  • Maxemilan
  • SAP Forum - Neuling Thema Starter
vor 12 Jahre
Ich habs endlich hinbekommen.

Merkwürdigerweise hat alles wunderbar funktioniert, als ich die oberen Error-Handling-Anweisungen gelöscht habe und nur noch einmal mit On Error Resume Next gearbeitet habe.

Warum kann ich nicht mehrere Error-Handling-Funktionen benutzen?

ScriptMan
vor 12 Jahre
Hallo Maxemilan,

das Abfangen von Fehlern in einem Programm ist die hohe Schule der Programmierung. Wenn man es selber machen will, muss man wissen was man tut. Vorallem wenn man die Anweisung

on error goto weiter verwendet.

Nicht so kompliziert ist dagegen die Verwendung von dem Pärchen:

on error resume next

und

on error goto 0

Dazwischen stehen einfach Befehle, die u.U. einen Fehler verursachen können. Das Skript soll trotzdem weiter ohne eine Fehleranzeige fortgesetzt werden. Wenn der Befehl on error goto 0 kommt, soll das Skript beim 1. Fehler wieder anhalten.

Alles klar?

Freundliche Grüße

ScriptMan

Maxemilan
  • Maxemilan
  • SAP Forum - Neuling Thema Starter
vor 12 Jahre
Klar wir Klosbrühe 😉 Danke!