Hallo zusammen,
ich habe folgendes Problem:
Ich will mehrer Datenbanken als normal angemeldeter User abfragen. Dieser User hat nicht auf alle Datenbanken, die abgefragt werden können, Zugriff.
Problem: Kommt eine Datenbank ohne Zugriff an die Reihe, bricht das Script mit der Fehlermeldung "ABC cannot open database XYZ"
Meine Idee war, vorher per QueryAccess das Accesslevel zu prüfen, aber das funktioniert genauso wenig. Es erscheint die gleiche Meldung.
Hier mal ein Auszug aus dem Code:
[...]
Dim session As New NotesSession
Dim workspace As New NotesUIWorkspace
Dim db As NotesDatabase
Dim user As NotesName
Dim user_acl As String
Dim dbn As String
Dim view As NotesView
[...]
Set user = session.CreateName(session.UserName)
dbn = uidoc.FieldGetText("Datenbanken")
dbnarray = Split(dbn, ";")
[...]
Forall x In dbnarray
Set db = New NotesDatabase( "EWNS", dbnarray(i))
user_acl = user.canonical
Messagebox(db.QueryAccess(user_acl))
If ( db.QueryAccess(user_acl) < ACCLEVEL_READER ) Then
Messagebox ("Kein Zugriff auf Datenbank '" + db.Title + "'")
Print ("Kein Zugriff auf Datenbank '" + db.Title + "'")
Else
Print ("Durchsuche Datenbanken... " + db.Title)
Set view = db.getview("(Aufgaben nach Manager)")
[...]
Ich versuche mich gerade an "On Error" - allerdings bekomme ich immer folgende Fehlermeldung:
"Error number must be INTEGER constant: LSERR_NOTES_DBNOACCESS"
Unter "(Declarations)" ist folgendes angegeben:
%INCLUDE "lserr.lss"
%INCLUDE "lsconst.lss"
Code:
On Error lsERR_NOTES_DBNOACCESS Goto test
[...]
test:
Hallo koehlerbv,
danke für deine Antwort.
Das mit der falschen lss-File... unerklärlich wie mir sowas passieren kann. Ich wusste eigentlich, dass es die lsxbeerr.lss ist.
Das funktioniert soweit jetzt auch.
Ich hätte da aber noch eine Verständnisfrage. Ich hoffe ich bekomm sie auch verständlich ausgedrückt:
Hier mal etwas Code dazu:
On Error lsERR_NOTES_DBNOACCESS Goto test
[...]
i=0
Forall x In dbnarray
Set db = New NotesDatabase( "EWNS", dbnarray(i) )
Print ("Durchsuche Datenbanken... " + db.Title)
Set view = db.getview("(Aufgaben nach Manager)")
[...]
test:
i=i+1
End Forall
Innerhalb dieser Forall-Schleife passiert meine komplette Bearbeitung zur Datenbank, die bei einem Error nicht ausgeführt werden kann/soll, daher habe ich die Sprungmarke "test" an's Ende der Forall-Schleife gesetzt, damit der komplette Kram übersprungen wird.
Jetz habe ich folgendes Phänomen:
- Kommt der Fehler einmal vor (nur eine Datenbank ohne Zugriff), bekomme ich am Ende des Scripts eine Meldung "No Resume" - Das Script wird aber korrekt ausgeführt
- Existieren zwei Datenbanken ohne Zugriff, bricht das Script beim Versuch, die zweite Datenbank zu öffnen, ohne Errorhandling ab. Es erscheint für diese Datenbank die gleiche Meldung, als wäre kein Errorhandling angelegt.
Hallo Bernhard,
erst einmal Danke für deine Unterstützung! Es funktioniert jetzt. Ich habe das jetzt wie folgt aufgebaut:
On Error lsERR_NOTES_DBNOACCESS Goto test
[...]
i=0
Forall x In dbnarray
Set db = New NotesDatabase( "EWNS", dbnarray(i) )
Print ("Durchsuche Datenbanken... " + db.Title)
Set view = db.getview("(Aufgaben nach Manager)")
[...]
test2:
i=i+1
End Forall
[...]
Exit Sub
test:
Resume test2
EndSub
Damit wird die Schleife bei einem Fehler 4060 nun übersprungen - genau wie ich es haben wollte :)