Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Marshuhn am 24.10.03 - 10:12:40
-
Hallo,
ich möchte, das in ein bestimmter Dokumententyp nur von der Rolle "Serverloesch" gelöscht werden darf. Bei allen anderen möchte die Löschung verhindern. Ich habe das Script, welches fett unterlegt ist, aus der Notes-Hilfe übernommen. An der Stelle (Meiner Meinung nach) die fett und rot unterlegt, bekomme ich bei der Ausführung die Fehlermeldung "Object Variable not set". Ich habe das ganze Script mehrfach Buchstabe für Buchstabe überprüft. Ich habe keinen Fehler gefunden. Kann mir hier jemand auf die Sprünge helfen.
Vielen Dank schon einmal im Voraus.
Danke Marshuhn
Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
Dim session As New NotesSession
Dim db As NotesDatabase
Dim acl As NotesACL
Dim entry As NotesACLEntry
Set db = session.CurrentDatabase
Set acl = db.ACL
Dim collection As NotesDocumentCollection
Set collection = source.documents
Set note=collection.getfirstdocument
If Entry.IsRoleEnabled("[Serverloesch]" ) And note.Form(0) = "LogArchiv" Then
Messagebox "Sie dürfen Dokumente löschen"
Else
Messagebox "Sie dürfen keine Dokumente löschen. ", 0, "Fehler"
End If
If note.Form(0) = "Reservation" Then
Dim doc As notesdocument
Set doc=db.createdocument
Dim feld As notesitem
Set view=db.getview("LogFile")
doc.form="LogArchiv"
Set feld=doc.appenditemvalue("ArchivFeld", note.ResourceName)
Set feld=doc.appenditemvalue("UserFeld", session.CommonUserName)
Set feld=doc.appenditemvalue("DatumvonbisFeld", note.CalendarDateTime)
Set feld=doc.appenditemvalue("RaumFeld", note.ApptUNID)
Set feld=doc.appenditemvalue("LoeschDatum", Now)
Call doc.Save(True, False)
Exit Sub
End If
While Not note Is Nothing
If note.Form(0) = "Resource" Then
Messagebox "Um eine Ressource zu löschen, müssen Sie die Aktionsschaltfläche 'Ressource löschen' im Dokument verwenden.", 0, "Fehler"
Continue = False
Exit Sub
End If
If (note.Form(0) = "SiteProfile") Then
Server=source.database.server
note.server=server
RoomLookup=Evaluate (|@IsError(@DbLookup("":"NoCache";Server:"names.nsf";"($Rooms)";Site;1))|, note)
ResourceLookup=Evaluate (|@IsNotMember(Site;@DbColumn("":"NoCache";Server:"names.nsf";"($Resources)";2))|, note)
If(RoomLookup(0) = 0 Or ResourceLookup(0) = 0) Then
Messagebox "Dieses Standortprofil kann nicht gelöscht werden, da im Adreßbuch noch Ressourcen auf den Standort verweisen. Sie müssen zuerst diese Ressourcen löschen. Verwenden Sie dazu die Aktionsschaltfläche 'Ressource löschen' in den Ressource-Dokumenten.", 0, "Fehler"
Continue = False
Exit Sub
End If
End If
Set note=collection.getnextdocument(note)
Wend
Set w=New NotesUIWorkspace
End Sub
-
Das Objekt Entry ist leer, klar daß da die Fehlermeldung kommt. Du mußt Entry erstmal etwas zuweisen.
z.B. so :
Set entry = acl.GetEntry( session.CommonUserName )
-
Hallo,
ich hatte gearde beim nochmaigen Ansehen auch bemerkt, dass ich diese Zeile vergessen hatte HIER anzugeben. Diese Zeile ist aber im Script enthalten. Trotzdem erhalte ich diese Meldung. Gibt es da noch einen Tipp, woran es liegen könnte.
Gruß + Danke
Marshuhn
-
Hast Du die Sache schon mal mit dem Debugger angeschaut?
-
Wenn ich den Debugger laufen lasse, dann erhalte ich sofort die Meldung (bekannt), danach erhalte ich im Debugger das Bild (kopiert in das angehängte Word Dokument) wo er beim Objekt "Raumreservierung (Datenbank-Script) und beim Ereignis "Querydocumentdelete") anzeigt. Leider hilft mir das nicht weiter.
Es handelt sich bei dieser Datenbank um die Raumreservierung von Lotus Notes.
Als Designer setze ich die Version 5.0.9 ein.
Weiter komme ich damit leider immer noch nicht.
Gruß
Marshuhn
-
Über den Debugger sollte man den Fehler leicht finden (sprich: Warum ist an dieser Stelle entry nicht instantiiert).
Abgesehen davon muß da aber am Anfang wohl noch mehr Code fehlen.
Und völlig abgesehen davon wird es so sowieso nicht sinnvoll funktionieren: So kann man ja nur NotesSession.Username abfragen - aber der muß ja nicht namentlich in der ACL stehen und wird daher nicht gefunden.
Evaluate ("@UserNamesList" ... dürfte da ein viel einfacherer und vor allem zuverlässiger Weg zum Ziel sein.
HTH,
Bernhard
-
Hmm, vielleicht muss ich die Brille putzen, ich sehe das Bild nicht :-(
-
... oder gleich direkt mit @UserRoles oder noch viel direkter
notesACLEntry.Roles
<Edit>
Nachtrag: das stimmt hier wohl nicht, da notesACLEntry.Roles auf den Entry geht und da gilt Bernhards Einwand. Hingegen @UserRoles sollte in dieser Situation funktionieren.
</Edit>
-
Habe das Bild als Grafik beigefügt. Ich werde mir das mal mit der dem Evaluieren anschauen.
Gruß
Marshuhn
-
Auch wenn es vielleicht nervt. Aber da ich mir alles selber beibringen darf und keine Hilfe von anderen erwarten kann (weil das kein anderer macht), möchte ich von Euch wissen, wo ich entweder evaluate....(@UserNameList/@UserRoles) einsetzen muss:
muss ich ich dann die eine Zeile folgendermaßen schreiben?:
Set entry = acl.GetEntry (evaluate(|@UserRoles|))
Danke für die Antwort.
Marshuhn
-
Was steht denn in der Designer-Hilfe zu Evaluate ?
Da wird doch nun alles gesagt.
Ohne Frage, jeder hat mal angefangen, aber dermassen unstrukturiert ... Und dann scheinst Du ja schon an einer produktiven Datenbank herumzudoktern.
Bernhard
-
Wenn Du den Debugger benutzest, solltest Du in jedem Falle mal die Variablen anschauen ..... und dann einen Printscreen, der nicht zu >80% einfach weisse Fläche zeigt ... sprich, die Vars würden uns da interessieren.
Wie wärs damit, ein Einführungsbuch unters Kopfkissen zu legen?
-
Hi,
ich hab mir mal eine kleine Scriptfunktion gebastelt, mit der man die Userroles prüfen kann. Die funktioniert auch mit Gruppenrollen.
Function RoleEnabled(sRole As String) As Integer
Dim vResult As Variant
vResult = Evaluate(|@IsMember("| & sRole & |"; @UserRoles)|)
If vResult(0) = 1 Then
RoleEnabled = 1
Else
RoleEnabled = 0
End If 'If vResult(0) = 1
End Function
Nehme diese Funktion in dein Datenbankscript auf (am besten mit Copy & Paste im Options-Abschnitt) und ändere deinen Code wie folgt:
...
If RoleEnabled("[Serverloesch]" ) = 1 And note.Form(0) = "LogArchiv" Then
Messagebox "Sie dürfen Dokumente löschen"
Else
Messagebox "Sie dürfen keine Dokumente löschen. ", 0, "Fehler"
End If
...
Dann sollte das funktionieren.
Axel
-
Hallo Axel,
recht herzlichen Dank für Deine Hilfe. Damit habe ich jetzt die Abfrage hinbekommen. DANKE.
Wenn ich jetzt aber in dieser besagten Ansicht eine Löschung anbringe, dann wird die Löschmarkierung aber auch gesetzt.
Mein Ziel ist es aber, dass diese Dokumente dann auch wirklich nicht gelöscht werden dürfen. Dieses sollen dann nur Rollen "Serverloesch" durchführen können. Ich hatte eigentlich vorgehanbt, dass ich die Löschmarkierung wieder aufheben kann, aber ich finde in der Hilfe keinen Befehl.
Kannst Du mir da noch einmal weiterhelfen. Habe schon mit MovetoTrash und ähnlichem gearbeitet und die Löschmarkierung bleibt trotzdem bestehen.
Gruß + Danke
Clas
-
Hallo, Clas,
verläßt Du den QueryDocumentDelete mit Continue = false, wenn die Rollenprüfung negativ ist ?
Was Du beschreibst, sieht danach aus, daß Du das Löschen noch nicht sperrst ...
Bernhard
-
Hallo Bernhard,
auch ein fettes Merci an Dich.
Jetzt klappt alles.
Danke und schönes Wochenende
Clas