Autor Thema: On Error Befehl wird ignoriert  (Gelesen 4921 mal)

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
On Error Befehl wird ignoriert
« am: 06.04.06 - 12:27:07 »
Moin, moin alle zusammen.

seit zwei drei Monaten befasse ich mich auch mit der Notes-Entwicklung. Bisher habe ich nur unter Excel, Word und Visual .Net programmiert.

Ich habe mir in Notes eine Prozedur geschrieben, um alle Kontakte in eine Excel-Tabelle auszulesen.

Ich musste jedoch feststellen, dass er die On Error anscheinend nur einmal ausführt und beim zweiten Fehler einfach ignoriert.

Hier erst mal mein Code:

Sub Click(Source As Button)
   On Error Goto Fehler
   
   'Allgemein
   Dim s As New NotesSession
   Dim db As NotesDatabase   
   Dim view As NotesView
   Dim doc As NotesDocument
   Dim feld As NotesItem   
   'Schleife
   Dim i As Long
   'Sonstiges
   Dim ex    
   
   Set db = s.GetDatabase("", "Names.nsf")
   Set view = db.GetView("People")      
   
   Set ex = getobject(,"Excel.Application")
   
Weiter:   
   ex.workbooks.add
   ex.visible = True
   
   With ex.range("a1")
      .value = "Anrede"
      .font.bold = True
   End With   
   With ex.range("b1")
      .value = "Vorname"
      .font.bold = True
   End With
   With ex.range("c1")
      .value = "Nachname"
      .font.bold = True
   End With
   With ex.range("d1")
      .value = "Straße"
      .font.bold = True
   End With
   With ex.range("e1")
      .value = "PLZ"
      .font.bold = True
   End With
   With ex.range("f1")
      .value = "Ort"
      .font.bold = True
   End With
   
   ex.Range("a2").Select
   Set doc = view.GetFirstDocument   
   
   For i = 0 To db.AllDocuments.Count
      Set feld = doc.GetFirstItem("Title")
      If feld.Text = "Mr." Then ex.ActiveCell.Value = "Herrn"
      If feld.Text = "Ms." Then ex.ActiveCell.Value = "Frau"
      If feld.text = "Mrs." Then ex.ActiveCell.Value = "Frau"
      If feld.text = "Miss" Then ex.ActiveCell.Value = "Frau"
      Set feld = doc.GetFirstItem("Firstname")
      ex.ActiveCell.Offset(0, 1).Value = feld.Text
      Set feld = doc.GetFirstItem("Lastname")
      ex.ActiveCell.Offset(0, 2).Value = feld.Text
      Set feld = doc.GetFirstItem("Streetaddress")
      ex.ActiveCell.Offset(0, 3).Value = feld.Text
      Set feld = doc.GetFirstItem("ZIP")
      ex.ActiveCell.Offset(0, 4).Value = feld.Text
      Set feld = doc.GetFirstItem("City")
      ex.ActiveCell.Offset(0, 5).Value = feld.Text
      
      ex.ActiveCell.Offset(1, 0).Select
      Set doc = view.GetNextDocument(doc)
   Next i   
   Exit Sub
   
Fehler:   
   If  Err() = 208 Then
      Set ex =createobject("Excel.Application")
      Goto Weiter
   Else
      Exit Sub
   End If   
End Sub


Der 1. Fehler (Nr.:208) tritt auf, wenn Excel nicht gestartet ist. Er springt dann wunderbar in die Fehlerprozedur, führt diese aus und springt zurück.

Der 2. Fehler (Nr.:91) tritt in der Schleife auf, weil in der Kontaktdatenbank Zertifikate sind, die natürlich nicht über die  angegebenen Felder wie Anrede usw. verfügen. Hier soll er den Code einfach unterbrechen.

Genau das tut er aber nicht, sondern wirft eine Notes-Fehlermeldung aus, die sich nicht abfangen lässt.

Wenn Excel jedoch schon gestartet ist, und somit der 1. Fehler ausbleibt, funktioniert die Fehlerroutine einwandfrei.

Für mich sieht das so aus, als würde er die On Error Meldung nur einmal ausführen, aber das wäre ja fatal.

Ich hoffe, dass jemand schon mal einen ähnlichen Fall hatte, bzw. weiß woran es liegt und wie man es umgehen kann.

Für eure Hilfe im Voraus vielen Dank.

Gruß
Demian



 
Gruß
Demian

Glombi

  • Gast
Re: On Error Befehl wird ignoriert
« Antwort #1 am: 06.04.06 - 12:59:35 »
Wegen
 Exit Sub
wird ja der Code beendet. Notes handelt also korrekt (auch wenn man es kaum glauben mag).

Es muss also so sein:

Fehler:   
   If  Err() = 208 Then
      Set ex =createobject("Excel.Application")
      Goto Weiter
   Else
Resume next
   End If   
End Sub


Andreas

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: On Error Befehl wird ignoriert
« Antwort #2 am: 06.04.06 - 16:06:22 »
Hallo Glombi,

der Code soll ja bei dem Fehler 91 beendet werden, aber genau das tut er nicht. Der Code läuft weiter und in der ersten Zeile innerhalb der For-Schleife kommt die Fehlermeldung 91, weil das Feld Anrede in den Zertifikaten nicht vorhanden ist. Die Notesfehlermeldung soll ja mit exit sub unterdrückt werden. Aber er springt erst gar nicht mehr in die Fehlerroutine. Nur wenn Excel schon vor Beginn der Prozedur gestartet war, tut er das. Anscheinend, weil es dann der 1. Fehler und nicht der 2. innerhalb der Prozedur ist.

Gruß
Demian

Gruß
Demian

Offline Axel

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: On Error Befehl wird ignoriert
« Antwort #3 am: 06.04.06 - 16:22:02 »
Schau mal hier: Best Practices: Error Handling in Lotus Script

Vielleicht findest du hier noch Infos, die dir weiterhelfen.


Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: On Error Befehl wird ignoriert
« Antwort #4 am: 06.04.06 - 17:37:01 »
Hallo Demian (heisst Du wirklich so?),

Andreas aka "Glombi" hat es schon geschrieben: Mit einem simplen "Exit Sub" in einer Fehlerroutine löst Du den Fehler nicht auf - Du schickst ihn "ungebremst" an die aufrufende Instanz (hier: Der Notes-Client).
Ein simples "Resume" vor dem Exit Sub oder die Abfrage von Err (mit einer Ausgabe der Meldung zum Beispiel - aber das wäre hier ungeschickt) würde Err wieder auf 0 setzen.

Insgesamt ist Dein Code aber ungeschickt. Warum überprüftst Du die instantiierten Items nicht auf Verfügbarkeit?
Code
Set feld = doc.GetFirstItem("Title")
If not (feld Is Nothing) Then ...

Aber es geht noch einfacher:
Statt
Code
Set feld = doc.GetFirstItem("Firstname")
ex.ActiveCell.Offset(0, 1).Value = feld.Text

Code
szReadString = doc.FirstName (0)
ex.ActiveCell.Offset(0, 1).Value = szReadString
Wenn das Item jetzt nicht existiert, bekommst Du einen Leerstring zurück - die Excelsheet-Zelle bleibt leer.

Was mir allerdings unklar ist: Warum erwartest Du Zertifikate in der Ansicht "People"? Die kommen dort doch gar nicht vor.
By the way: Dein Script scheiterte bei mir ausgerechnet beim Adressbucheintrag von Andreas Glombitza, weil es dort das Item "StreetAddress" nicht gibt (irgendwie mal importiert)  ;D

Noch ein Hinweis: Deine Fehlerbehandlungsroutine wegen nicht laufenden Excel ist "etwas" blauäugig: Was machst Du, wenn ein Anwender Excel gar nicht oder falsch installiert hat? Dann heisst es: "In Ewigkeit - Amen!" sprach die Endlosschleife ...

HTH.
Bernhard

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: On Error Befehl wird ignoriert
« Antwort #5 am: 07.04.06 - 08:20:54 »
Hallo Bernhard,

zu deinem Hinweis. Es handelt sich um Code, der in der Firma ausgeführt wird. Excel ist überall installiert. Selbst wenn dem nicht so wäre, der Button ist beschriftet mit: "Adressbuch in Excel auslesen", so das ein Anwender, der kein Excel hat, es hoffentlich auch nicht probieren würde.

Wo wir grad bei Endlosschleife sind: Kann man die Codeausführung in Notes nicht manuell mit Tastenkombination stoppen??? In Excel geht das mit Strg + Entf.

Wie gesagt, ich kenne das so aus Excel und hatte nie Probleme mit exit sub innerhalb der Fehlerbehandlung -> Der Code ist dann einfach kommentarlos augelaufen. Nur unter Notes reagiert er anders.

Das Problem ist, dass er ja gar nicht erst in die Fehlerbehandlung springt. Der Code in der Schleife läuft einfach weiter und erzeugt eine Fehlermeldung.

Habe es jetzt auch mit:

"Set feld = doc.GetFirstItem("Title")
If feld Is Nothing Then Exit Sub"

probiert, genau dasselbe Problem.

Selbst wenn ich statt "exit sub", "msgbox err()" eingebe, kommt keine Fehlermeldung mit der Nummer des Fehlers (91), sondern "Object Variable not set", was definitv bedeutet, dass er die Routine nicht anspringt. Der Fehler liegt also nicht in der Fehlerbehandlungsroutine -> die kommt ja gar nicht zum tragen.

Für mich stellt sich das so dar, dass Notes innerhalb einer Prozedur nur einen Fehler abfangen kann, und bei allen weiteren den Code so behandelt, als wäre überhaupt keine Fehlerroutine vorhanden.

Habe in meinem Kontaktbuch auch Personen, bei denen keine Straße hinterlegt ist, und er lässt die entsprechende Zellen in Excel einfach leer und macht ganz normal weiter. Ohne Fehlermeldung.

Die Zertifikate sind zwar nicht in der Ansicht enthalten, aber er hat sie im Zähler der Schleife mit drin. Irgendwann ist halt kein Dokument mehr da, bei dem er die Felder abfragen kann, was zum Fehler 91 führt, bei dem der Code einfach beendet werden soll.

Wenn er die Fehlerroutine ja anspringen würde, könnte ich das Problem mit einer Meldung umgehen, die den Anwender darauf hinweist, dass alles übertragen wurde.

Ich hoffe ihr wisst was ich meine.

Gruß
Demian

PS: Ja ich heiße wirklich so.

Zu Axel: Werde mir das heute Abend mal genauer durchlesen.

Und vielen Dank euch allen für eure Unterstützung.




« Letzte Änderung: 23.07.12 - 00:56:54 von Demian »
Gruß
Demian

Offline Axel

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: On Error Befehl wird ignoriert
« Antwort #6 am: 07.04.06 - 08:30:14 »
Hallo Bernhard,

zu deinem Hinweis. Es handelt sich um Code, der in der Firma ausgeführt wird. Excel ist überall installiert. Selbst wenn dem nicht so wäre, der Button ist beschriftet mit: "Adressbuch in Excel auslesen", so das ein Anwender, der kein Excel hat, es hoffentlich auch nicht probieren würde.

Da bist aber ziemlich blauäugig. Die Anwender klicken auf so ziemlich alles was nach Button oder Menüpunkt aussieht. In der Programmierung ist es so, dass der Code nur zu einem Drittel aus wirklichem Code zu Programmbearbeitung besteht, der Rest ist Fehlerbehandlung.


Wo wir grad bei Endlosschleife sind: Kann man die Codeausführung in Notes nicht manuell mit Tastenkombination stoppen??? In Excel geht das mit Strg + Entf.


Wenn du ein Programm in eine Endlosschleife schickst, dann kannst du es nur im Taskmanager abschießen. Das ist auch in Excel so.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re: On Error Befehl wird ignoriert
« Antwort #7 am: 07.04.06 - 08:37:54 »
Ich bin nicht sicher, aber ich denke, es könnte an dem Goto liegen.
Laut Hilfe
Zitat
An error-handling routine begins with a labeled statement. The routine ends when LotusScript encounters a Resume, Exit Sub, Exit Property, or Exit Function statement. If an error occurs in the error-handling routine, execution ends.
endet eine Fehlerbehandlungsroutine nicht mit Goto. Das heißt, dass du, wenn der zweite Fehler auftritt, quasi immer noch in deiner Fehlerbehandlung bist. Und das weiß ich jetzt sicher, ein Fehler in der Fehlerbehandlung wird nicht von der Fehlerbehandlung bearbeitet.
Tausche doch mal Goto Weiter mit Resume Weiter aus, bitte.
« Letzte Änderung: 07.04.06 - 08:39:52 von Thomas Völk »
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Demian

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 569
  • Geschlecht: Männlich
Re: On Error Befehl wird ignoriert
« Antwort #8 am: 07.04.06 - 09:35:56 »
Hallo Thomas,

du hast es erfasst, funktioniert einwandfrei. Die Fehlerbehandlungsroutine sieht jetzt folgendermaßen aus:

   If  Err() = 208 Then
      Set ex =createobject("Excel.Application")
      Resume Weiter
   Else
      Exit Sub
   End If
   

Es kommt zu keiner Fehlermeldung, der Code läuft einfach aus. So wie es auch sein soll. Vielen Dank.

Zu Axel:

Zitat
Da bist aber ziemlich blauäugig. Die Anwender klicken auf so ziemlich alles was nach Button oder Menüpunkt aussieht. In der Programmierung ist es so, dass der Code nur zu einem Drittel aus wirklichem Code zu Programmbearbeitung besteht, der Rest ist Fehlerbehandlung.

Wie gesagt, es haben definitiv alle Excel. Zumal selbst die VBA-Autoren wie Bernd Held, es so machen. Wüsste ehrlich gesagt auch gar nicht, wie man das anders machen könnte????? Ich programmiere auch erst gut ein Jahr.

Zitat
Wenn du ein Programm in eine Endlosschleife schickst, dann kannst du es nur im Taskmanager abschießen. Das ist auch in Excel so.

Ist es nicht. Wobei ich mich mit der Tastenkombination vertan habe. Sie lautet: Strg + Pause.

Wenn du in Excel einen Button mit folgendem Code anlegst:

For i = 1 To 65000
ActiveCell.Value = "Test" & i
Next i


ihn betätigst und dann Strg+Pause drückst, unterbricht er den Code. Auch bei Endlosschleifen. Habe es gerade in Notes ausprobiert:
   Dim ex
   Set ex = getobject(,"Excel.Application")
   
   For i= 1 To 65000
      ex.activecell.value = "Test" & i
   Next


Da geht es auch. Wobei Notes dann natürlich aktiviert werden muss.

Trotzdem vielen Dank euch für die Hilfe. Man lernt nie aus.

Gruß
Demian

Gruß
Demian

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz