Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Neuling_2k7 am 14.11.07 - 22:39:42

Titel: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 14.11.07 - 22:39:42
Hallo @all,

Ich habe folgendes Problem:

Ich habe eine DB erstellt und innerhalb dieser DB einen Ordner ($Trash) angelegt. Die Softdel ist aktiviert.
In das Querydocumentdelete hab ich den Befehl @command([MoveToTrash]) eingetragen.

Wenn ich jetzt versuche ein Dok zu löschen bekomme ich eine Fehlermeldung "Zu viele rekursive Formelauswertungen"...

Jetzt habe ich 2 Fragen:
a)Ist mein Vorgehen überhaupt so sinnvol? Und wenn ja, woher stammt dann die Fehlermeldung??
b)Gibt es einen besseren Lösungsansatz??? Bin für alle Vorschläge offen...

Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: koehlerbv am 14.11.07 - 22:58:52
Ganz, ganz falsch:
Im QueryDocumentDelete werden Löschanforderungen abgefangen zur weiteren Behandlungen. Wenn Du dort eine Löschanforderung auslöst, rufst Du damit logischerweise gleich wieder das QueryDocumentDelete aus (vor allem, da @Command ([MoveToTrash]) ein Frontend-Befehl ist und genau dieser QueryDocumentDelete auslöst).

Zu Deinen Fragen:
a) nein
b) nein

Die Frage lautet ganz anders: Hast Du Deine DB korrekt für Softdeletions vorbereitet? Hast Du eine Ansicht, die wirklich nur gelöschte Dokumente aufnimmt? Dein Problem liegt offensichtlich auf einer anderen Ebene. Bitte auch die DesignerHelp hierzu erneut studieren.

Bernhard
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 14.11.07 - 23:32:39
Ganz, ganz falsch:
Im QueryDocumentDelete werden Löschanforderungen abgefangen zur weiteren Behandlungen. Wenn Du dort eine Löschanforderung auslöst, rufst Du damit logischerweise gleich wieder das QueryDocumentDelete aus (vor allem, da @Command ([MoveToTrash]) ein Frontend-Befehl ist und genau dieser QueryDocumentDelete auslöst).

Zu Deinen Fragen:
a) nein
b) nein

Die Frage lautet ganz anders: Hast Du Deine DB korrekt für Softdeletions vorbereitet? Hast Du eine Ansicht, die wirklich nur gelöschte Dokumente aufnimmt? Dein Problem liegt offensichtlich auf einer anderen Ebene. Bitte auch die DesignerHelp hierzu erneut studieren.

Bernhard

Hi,

ich hab mir die DesignerHelp nochmal angeschaut, aber so ganz schlau werd ich daraus nicht...
Einmal steht da ich brauche eine gemeinsame Ansicht ($Softdeletions) die alle Dokumente mit Status "Wiederherstellbare löschung" enthält, ein anderer eintrag sagt ich brauche einen Ordner ($Trash).... :-:

Irgendwie hatte ich mir das einfacher vorgestellt...
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 15.11.07 - 10:54:46
Hi @All,

also - ich komm einfach nicht mehr weiter - irgendwie will das alles nicht so wie ich will und die DominoDesigner Help hilft mir auch nicht wirklich weiter...  >:(

Hat vielleicht jemand eine "MoveToTrash for Dummys" dokumentation für mich?
Danke schon mal im Voraus....
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: klaussal am 15.11.07 - 11:27:52
Vielleicht etwas einfacher:

Ich habe eine Ansicht "Papierkorb" und angehakelte Dokumente werden per Agent dahin verschoben.

Code
FIELD loesch:=loesch;
@SetField("loesch"; "1" );SELECT @All

Bei Bedarf können die wieder reanimiert werden.
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 15.11.07 - 13:22:09
Vielleicht etwas einfacher:

Ich habe eine Ansicht "Papierkorb" und angehakelte Dokumente werden per Agent dahin verschoben.

Code
FIELD loesch:=loesch;
@SetField("loesch"; "1" );SELECT @All

Bei Bedarf können die wieder reanimiert werden.

Hi,

und wie bekommst du es hin, dass das auch dann funktioniert, wenn der Anwender die ENTF-Taste drückt?
Sorry, wenn ich so blöd frage, aber ich bin noch neu in der Notes-Entwicklung...
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: koehlerbv am 15.11.07 - 13:24:18
Das fängt man dann wiederum im QueryDocumentDelete ab.
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: klaussal am 15.11.07 - 13:27:23
Oder in der ACL den Haken raus bei "Dokumente löschen".
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 16.11.07 - 00:49:57
Hi @All,

erst mal danke für eure Antworten - hab jetzt gefunden, was mit noch gefehlt hat...

Für alle, die es interessiert: http://www-1.ibm.com/support/docview.wss?rs=0&uid=swg21091152
 (http://www-1.ibm.com/support/docview.wss?rs=0&uid=swg21091152)
Jetzt müssen die Dokumente nur noch aus der Ursprungsansicht verschwinden, ohne das man gefragt wird, ob man "die Dokumente im Papierkorb wirklich löschen will...  ;D
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: koehlerbv am 16.11.07 - 18:49:55
Wenn die Frage (eine Frontend-Geschichte, die ja wirklich Sinn macht!) nicht mehr erscheinen soll, dann musst Du das ganze über das Backend machen. Aber da wirst Du vermutlich sehr schnell an Deine Grenzen stossen.
Vielleicht denkst Du doch eher über Klaus' Vorschlag nach (und bestimmt nicht nur Klaus und ich gehen solche Wege). Du erreichst den gleichen Effekt, Du bist zudem unabhängig von Datenbank-Eigenschaften der Herr des Geschehens - musst aber natürlich dann auch noch für Designelemente sorgen, die dann das endgültige Löschen ermöglichen / erleichtern.

HTH,
Bernhard
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 20.11.07 - 23:11:22
Vielleicht denkst Du doch eher über Klaus' Vorschlag nach (und bestimmt nicht nur Klaus und ich gehen solche Wege). Du erreichst den gleichen Effekt, Du bist zudem unabhängig von Datenbank-Eigenschaften der Herr des Geschehens - musst aber natürlich dann auch noch für Designelemente sorgen, die dann das endgültige Löschen ermöglichen / erleichtern.

Ich denke Du hast recht Bernhard,

wahrscheinlich habe ich so eher eine Chance das ganze hinzubekommen...

ich würde jetzt also folgendermaßen vorgehen: (bitte verbessert mich, wenn ich falsch liege  ::) )

Ich lege eine neue Ansicht an ("Papierkorb") als normale Ansicht (nicht nur gelöschte Docs).
Als Selektion: alle Docs, für die gilt: "gelöscht"=1

das feld setze ich über einen Agenten (wie von Klaus vorgeschlagen) und diesen Agenten rufe ich über das "Querydocumentdelete" auf, sofern das zu löschende Dokument nicht in der neuen Ansicht zu finden ist.

Wenn man versucht, das Dokument aus dem Papierkorb zu löschen, wird ein @deletedokument ausgelöst ??

Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: klaussal am 21.11.07 - 08:11:52
Zitat
und diesen Agenten rufe ich über das "Querydocumentdelete" auf

Nein, in einer stinknormalen Ansicht eine Aktion "Papiekorb" einbauen. Diese startet den Agenten.

Nicht vergessen, in alle (!) Ansichten (bis auf den Papierkorb) einbauen: Select form = "..."  & geloescht != "1"
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: dirk_2909 am 21.11.07 - 08:47:34
Wenn Du das Drücken der [Entf]-Taste abfangen willst, musst Du im QueryDocumentDelete das Löschen abfangen und die entsprechenden Flags in den jeweiligen Dokumenten setzen !!

Also:
1. Continue = False !!
2. Collection der zu "löschenden" Doks holen
3. Jedes dok verarbeiten und Flag setzen.....


Den Agenten benötigst Du in den Ansichten, um die Docs in den Papierkorb zu verschieben ohne das der User die [Entf]-Taste betätigt....
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 26.11.07 - 23:23:11
Wenn Du das Drücken der [Entf]-Taste abfangen willst, musst Du im QueryDocumentDelete das Löschen abfangen und die entsprechenden Flags in den jeweiligen Dokumenten setzen !!

Also:
1. Continue = False !!
2. Collection der zu "löschenden" Doks holen
3. Jedes dok verarbeiten und Flag setzen.....



Soweit so gut, ich habe die ansichten dementsprechend umgebaut und in meinen Masken ein Feld 'is_deleted' eingefügt, das ich per Agent (über eine Aktion getriggert auch füllen aknn und das Dok somit aus der Ansicht "lösche".
Allerdings macht mir das script zum Abfangen der [Entf]->Taste noch Streß.
Hab euch hier mal das Coding eingehängt, das ich verwenden wollte - das Skript läuft auch ohne Fehler durch, aber das Feld wird nicht gefüllt...

Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
   Dim ws As New notesuiworkspace
   Dim doc_col As NotesDocumentCollection
   Dim doc As Notesdocument
   Dim session As New NotesSession
   Dim db As NotesDatabase
   
   continue=False
   
   Set db=session.CurrentDatabase
   Set doc_col=source.Documents
   Set doc=doc_col.GetFirstDocument
   
   While Not doc Is Nothing
      Call doc.AppendItemValue("is_deleted",1)
      Call doc.Save(True,True)
      Set doc=doc_col.GetNextDocument (doc)
   Wend
End Sub

Ein weiterer "unschöner Effekt" ist im Moment, dass wenn das Skript durchgelaufen ist, das Dokument sporadich als gelöscht 'geflagt' ist und ich beim verlassen der Db gefragt werde, ob ich das Dokument im Papierkorb wirklich löschen möchte...
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: mibo11 am 27.11.07 - 01:02:27
Hallo,

ich kann nicht ganz nachvollziehen warum du in deiner Routine ein Löschflag setzt, bzw. dir dazu geraten wurde. Wenn ich dein Problem richtig verstehe, möchtest du deine Dokumente in einen Papierkorb verschieben. Dieses Ziel erreichst du grundsätzlich über das bereits auch von dir erwähnte Softdeletion. Dadurch werden alle gelöschten Dokumente zunächst in den Papierkorb verschoben und können über einen selbst definierten Zeitraum wieder reaktiviert werden.

Um nun auf zu löschende Dokumente reagieren zu können, benutzt du das von Bernhard erwähnte Ereignis Querydocumentdelete. Dieses Event wird vor dem Löschen ausgeführt, genauer gesagt bevor das Dokument zum Löschen markiert wird. Dies aber willst du ja verhindern. Daher die Zeile continue = false in deinem Script, d.h. deine Löschanforderung wird nicht ausgeführt. Um nun trotzdem deine Dokumente zu löschen, musst du diese über eine Backendoperation entfernen.

Dein angepastes Script im Querydocumentdelete Ereignis sollte ungefähr (ohne Gewähr) so aussehen, dann kannst du dir deine Flags sparen.

   Dim ws As New notesuiworkspace   
   Dim doc As notesdocument
   Dim i As Integer

   For i = 1 To Source.Documents.count
   Set doc = Source.Documents.GetNthDocument(i)
   doc.Remove(True)
   Next
   ws.ViewRefresh
   Continue = False


Gruß
Sascha
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 27.11.07 - 09:39:13
Hi Sascha,

Das Skript funktioniert perfekt...
Die Dokumente verschwinden aus der Ansicht und tauchen im "Papierkorb" wieder auf...

Danke für die super Hilfe!!!

Gibt es eigentlich eine Möglichkeit zu verhindern, das Dokumente im Papierkorb geändert werden können? Dadurch würden sie nämlich wiederhergestellt...  :(
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: dirk_2909 am 27.11.07 - 09:54:03
Code
  For i = 1 To Source.Documents.count
   Set doc = Source.Documents.GetNthDocument(i)

.. würde ich drauf verzichten. Ist ein PerformanceKiller ... (natürlich macht sich das nicht bei so wenigen Docs bemerkbar  ;) ).

Besser :
Code
set doc = coll.GetFirstDocument
While not doc is Nothing
    ...
    Set doc = coll.GetNextDocument( doc )
Wend 

Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 27.11.07 - 10:37:05
Besser:
Code
set doc = coll.GetFirstDocument
While not doc is Nothing
    ...
    Set doc = coll.GetNextDocument( doc )
Wend 

Hi,

das funktioniert bei mir leider nicht :(

folgendes Coding:
Code
Dim ws As New notesuiworkspace   
Dim coll As NotesDocumentCollection	
Dim doc As notesdocument

Set coll=source.Documents 
Set doc =coll.getfirstdocument

While Not doc Is Nothing
  doc.Remove(True)
  Set doc=coll.GetNextDocument(doc)
Wend


beim Löschen der Dokumente kommt dann folgende Fehlermeldung:

"Function requires a valid ADT argument"


F1F1F1 !!
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Glombi am 27.11.07 - 10:38:36
So:

Dim ws As New notesuiworkspace   
Dim coll As NotesDocumentCollection   
Dim doc As notesdocument
Dim nextdoc As notesdocument

Set coll=source.Documents
Set doc =coll.getfirstdocument

While Not doc Is Nothing
set nextdoc = coll.getnextdocument(doc)
  doc.Remove(True)
  Set doc=nextdoc
Wend


P.s: Da war noch ein kleiner Fehler drin!
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: DAU-in am 27.11.07 - 10:40:03
set doc2 = coll.GetNextDocument(doc)
doc.remove(true)
set doc = doc2


wenn du das doc löscht, kann er das nächste dazu natürlich nicht mehr suchen
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Neuling_2k7 am 27.11.07 - 13:31:49
klar - hätt ich ja auch selbst drauf kommen können... :(

Vielen Dank nochmal für alle Tips und Tricks - funktioniert ja jetzt wunderbar !!!
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Fedaykin am 27.11.07 - 13:43:02
Hi zusammen

Da hier ja schon fast eine Sammlung von Querydocumentdelete Codebeispielen entsteht auch mein Senf noch dazu.  ;D

Sub Querydocumentdelete(Source As Notesuidatabase, Continue As Variant)
   Dim ws As New NotesUIWorkspace
   Dim session As New NotesSession
   Dim docsToDelete As NotesDocumentCollection
   Dim docs As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim responses As NotesDocumentCollection
   Dim response As notesdocument
   Dim intAnswer As Integer
   
   Continue=False
   Set docsToDelete=Source.Database.GetProfileDocCollection("proDummy")
   
   Set docs=Source.Documents
   Set doc=docs.GetFirstDocument
   
   Do Until doc Is Nothing
      CreateTrashCollection doc,docsToDelete      
      docsToDelete.AddDocument doc
      Set doc=docs.GetNextDocument(doc)
   Loop
   
   If docsToDelete.Count=1 Then
      intAnswer=Msgbox ("Es steht  ein Dokument zur Löschung an. Fortfahren?",4+32, "Bestätigung zum Löschen von Dokumenten")
   Else
      intAnswer=Msgbox ("Es stehen " & docsToDelete.Count    & " Dokumente zur Löschung an. Fortfahren?",4+32, "Bestätigung zum Löschen von Dokumenten")
   End If
   
   If intAnswer=6 Then
      docsToDelete.StampAll "fdDeleter",session.UserName
      docsToDelete.StampAll "fdDeleted",Now
      docsToDelete.RemoveAll False
      If Not ws.CurrentView Is Nothing Then
         ws.ViewRefresh
      End If
   End If
End Sub


Sub CreateTrashCollection(doc As NotesDocument,docsToDelete As NotesDocumentCollection)
   Dim docsResponses As NotesDocumentCollection
   Dim docResponse As NotesDocument
   
   Set docsResponses=doc.Responses
   If Not doc.Responses Is Nothing Then
      Set docResponse=docsResponses.GetFirstDocument
      
      Do Until docResponse Is Nothing
         CreateTrashCollection docResponse,docsToDelete
         docsToDelete.AddDocument doc
         Set docResponse=docsResponses.GetNextDocument(docResponse)
      Loop
   End If
End Sub

Gruss
Remo
Titel: Re: löschen von Dokumenten (MoveToTrash) selbst schreiben
Beitrag von: Glombi am 27.11.07 - 14:13:16
Sehr schön.

Was passiert denn, wenn ein User mit Autorrechten eine Antwort nicht bearbeiten kann? Nach einem ersten Überfliegen kommt dann eine Fehlermeldung, oder?
Am besten wäre es, für diese Fall den Error noch abzufangen.

Es sei denn, Notes bringt bei StampAll keinen Fehler.

Andreas