Autor Thema: Event nach der Löschung eines Dokumentes ausführen  (Gelesen 3367 mal)

Offline gstueb

  • Aktives Mitglied
  • ***
  • Beiträge: 125
  • Geschlecht: Männlich
  • God is real unless declared integer
Hallo,

ich lese in einer Anwendung eine Liste mit Dateinamen ein. Bestimmte Dateien, die in einer Whitelist stehen, sollen beim Import entsprechend markiert werden.

Wenn ich eine Whitelist in der Anwendung lösche, soll der Status der abhängigen Dokumente wieder entsprechend zurückgesetzt werden.

Ich wollte die entsprechende Routine im Postdocumentdelete unterbringen, aber die vermeintlich gelöschte Whitelist ist in der gebildeten collection nach wie vor vorhanden. Es ist auch keine Eigenschaft IsDeleted gesetzt, Valid ist das Dokument auch.

Wo wenn nicht im PostDocumentDelete kann ich meine Update-Routine laufen lassen?

Ich habe derzeit testweise anchstehendes Datenbankscript in der Anwendung. Der Print strPfad gibt das gelöschte Dokument nach wie vor aus.

Code
'##################################################
'	Database Script Datenbankscript
'	Created 11.08.2015 by Gregor Stuebner
'	Description: Comments for Database Script
'##################################################
Option Declare
Use "libFileScanner"
Sub Postdocumentdelete(Source As Notesuidatabase)
	Print "Postdocumentdelete"
'	Dim oWL As New tWhitelist
'	oWL.UpdateAll ' Wenn Whitelist gelöscht wurde, Dokumente anpassen

	Dim session As New NotesSession
	Dim col As NotesDocumentCollection
	Dim selection As String
	Dim doc As NotesDocument
	Dim strPfad As string
	
	Dim i As integer
	i=0
	selection = |Form = "Whitelist"|
	
	Set col = session.Currentdatabase.Search(selection, Nothing, 0)
	Set doc = col.GetFirstDocument
	While Not (doc Is Nothing)
		If doc.Isvalid And Not doc.Isdeleted Then
			i=i+1
			strPfad = LCase("\\" + doc.wServer(0) + doc.wServerpfad(0) + doc.wFile(0))
			Print strPfad
		End If
		Set doc = col.GetNextDocument(doc)
	Wend
	Print i " Whitelists vorhanden"	
End Sub

Für Ratschläge wäre ich dankbar :)

Danke & Grüße,
Gregor
« Letzte Änderung: 11.08.15 - 17:26:58 von gstueb »

Offline ERR

  • Frischling
  • *
  • Beiträge: 46
  • Geschlecht: Männlich
Re: Event nach der Löschung eines Dokumentes ausführen
« Antwort #1 am: 11.08.15 - 13:19:58 »
Hallo Gregor,

hier ein Auszug aus der Notes-Designer-Hilfe:

Zitat
Despite its name, the PostDocumentDelete event runs before the documents are actually deleted. It is possible that the document may not be deleted, either because the user lacks sufficient access to perform a deletion, or because the deletion process was interrupted, such as by the loss of a network connection to the Notes server. To ensure that the actions in the PostDocumentDelete event script only run when the document should be deleted, check the user's access before performing any other actions. To delete a document, the user must have document deletion privilege in the database ACL. An Editor or higher authority can delete any document, while Authors can only delete documents containing an Authors field that allows them to modify the document.
It's not really possible to implement a true PostDocumentDelete that gives you a list of documents, because after the documents have been deleted they are no longer available.

Ist das Dokument wirklich noch vorhanden, oder basierst du deine Vermutung nur auf der Ausgabe des Print strPfad? Wenn es kein Problem beim Löschen gab, sollte das Dokument nach dem PostDocumentDelete auch wirklich gelöscht sein.

Das Event PostDocumentDelete ist schon der richtige Punkt für deine Routine.

MFG
ERR
« Letzte Änderung: 11.08.15 - 13:22:16 von ERR »

Offline gstueb

  • Aktives Mitglied
  • ***
  • Beiträge: 125
  • Geschlecht: Männlich
  • God is real unless declared integer
Re: Event nach der Löschung eines Dokumentes ausführen
« Antwort #2 am: 11.08.15 - 13:32:20 »
Hallo ERR,

ich bin Manager auf der Datenbank mit Löschberechtigung. Die Löschung wird auch definitiv ausgeführt, nur passiert dies offensichtlich erst nach dem PostDocumentDelete.

Es gibt auch eine Thread in dem Tode genau dies beschreibt: http://atnotes.de/index.php/topic,58249.msg374574.html#msg374574

Die Frage ist nur, wie ich's anders machen kann - möglichst ohne irgendwelche blöden Hilfskonstrukte wie Löschflags oder extra Lösch-Buttons.

Grüße,
Gregor

Hallo Gregor,

hier ein Auszug aus der Notes-Designer-Hilfe:

Zitat
Despite its name, the PostDocumentDelete event runs before the documents are actually deleted. It is possible that the document may not be deleted, either because the user lacks sufficient access to perform a deletion, or because the deletion process was interrupted, such as by the loss of a network connection to the Notes server. To ensure that the actions in the PostDocumentDelete event script only run when the document should be deleted, check the user's access before performing any other actions. To delete a document, the user must have document deletion privilege in the database ACL. An Editor or higher authority can delete any document, while Authors can only delete documents containing an Authors field that allows them to modify the document.
It's not really possible to implement a true PostDocumentDelete that gives you a list of documents, because after the documents have been deleted they are no longer available.

Ist das Dokument wirklich noch vorhanden, oder basierst du deine Vermutung nur auf der Ausgabe des Print strPfad? Wenn es kein Problem beim Löschen gab, sollte das Dokument nach dem PostDocumentDelete auch wirklich gelöscht sein.

Das Event PostDocumentDelete ist schon der richtige Punkt für deine Routine.

MFG
ERR

Offline ERR

  • Frischling
  • *
  • Beiträge: 46
  • Geschlecht: Männlich
Re: Event nach der Löschung eines Dokumentes ausführen
« Antwort #3 am: 11.08.15 - 13:43:41 »
Hallo Gregor,

füge deine Routine einfach im PostDocumentDelete ein. Im QueryDocumentDelete kannst du, falls nötig, das löschen unterbinden (Continue = False), damit das PostDocumentDelete-Event nicht ausgeführt wird.

Über Source.Documents kommt du an das gelöschte Dokument, ein Hilfskonstrukte etc. benötigst du gar nicht.

MFG
ERR

Offline gstueb

  • Aktives Mitglied
  • ***
  • Beiträge: 125
  • Geschlecht: Männlich
  • God is real unless declared integer
Re: Event nach der Löschung eines Dokumentes ausführen
« Antwort #4 am: 11.08.15 - 13:49:56 »
Hallo ERR,

ich habe die Routine bereits im PostDocumentDelete, siehe auch Quelltext. Ich hatte mich an einer Stelle im ursprünglichen Posting nur verschrieben, das habe ich korrigiert.

Aber wie gesagt - das funktioniert nicht, ich habe im PostDocumentDelete noch Zugriff auf das gelöschte Element.

Grüße,
Gregor

Hallo Gregor,

füge deine Routine einfach im PostDocumentDelete ein. Im QueryDocumentDelete kannst du, falls nötig, das löschen unterbinden (Continue = False), damit das PostDocumentDelete-Event nicht ausgeführt wird.

Über Source.Documents kommt du an das gelöschte Dokument, ein Hilfskonstrukte etc. benötigst du gar nicht.

MFG
ERR

Offline ERR

  • Frischling
  • *
  • Beiträge: 46
  • Geschlecht: Männlich
Re: Event nach der Löschung eines Dokumentes ausführen
« Antwort #5 am: 11.08.15 - 13:57:01 »
OK, mein Fehler.

Eine (etwas unsaubere) Lösung wäre es, im QueryDocumentDelete bei der Whitelist, die Verarbeitung (=Löschung) zu unterbinden ("Continue = False" setzen) und dann per Lotusscript dort das Dokument bzw. die Dokumente zu löschen und dann dort deine Routine aufzurufen/einzubinden. Das PostDocumentDelete-Event wird dann nicht ausgeführt.

MFG
ERR

Offline gstueb

  • Aktives Mitglied
  • ***
  • Beiträge: 125
  • Geschlecht: Männlich
  • God is real unless declared integer
Hallo ERR,

ich mache es jetzt nochmal anders: Ich merke mir im Postdocumentdelete die UNIDs der als gelöscht vorgemerkten Dokumente und übergebe diese als Ausnahme an die Update-Methode. So funktioniert es jetzt.

Code
Sub Postdocumentdelete(Source As Notesuidatabase)
	Dim lstExceptUNID List As string
	Dim colDeleted As NotesDocumentCollection
	Dim doc As NotesDocument
	
	Set colDeleted = Source.Documents
	Set doc = colDeleted.GetFirstDocument
	While Not (doc Is Nothing)
		lstExceptUNID(doc.Universalid) = "x"
		Set doc = colDeleted.Getnextdocument(doc)
	Wend

	Dim oWL As New tWhitelist(lstExceptUNID) ' ohne lstExceptUNID-Dokumente 
	oWL.UpdateAll ' Wenn Whitelist gelöscht wurde, Dokumente anpassen
End Sub

Grüße,
Gregor
« Letzte Änderung: 11.08.15 - 15:23:14 von gstueb »

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz