Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Wiesel am 30.06.08 - 08:51:13

Titel: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 30.06.08 - 08:51:13
Hallo!

Ich möchte aus einer EntwurfsDB per Agent immer die Datensätze löschen lassen, die mittlerweile in einer ArchivDB sind.
Dazu habe ich ein Feld mit einem eindeutigen Wert.
Ich lese also in einer View des Archivs den Wert aus und vergleiche die Doks in der EntwurfsDB, um sie dort zu löschen. Den Doks im Archiv gebe ich dann ein Merkmal, damit diese aus der Ansicht wieder verschwinden und nicht erneut abgeprüft werden müssen.

In meinem Agent habe ich nun das Problem, dass ich nicht weiß, wie ich dort bestimme, dass in der ArchivDB nur diejenigen Doks das Merkmla bekommen, die ich in der EntwurfsDB löschen konnte?!

Hier mal mein Script:

Sub Initialize
   Dim S As New NotesSession
   Dim DB As NotesDatabase
   Dim Doc As NotesDocument
   Dim View As NotesView
   Dim strEntwurfDB As String
   Dim strEntwurfPfad As String
   Dim strUnique As String
   
   Set DB = S.CurrentDatabase
   Set Doc = DB.GetProfileDocument("(DBProfil)")
   'Profil Dokument auslesen
   strEntwurfDB = Doc.dbServer(0)
   strEntwurfPfad = Doc.dbPfad(0)
   
   Dim VEntwuerfe As NotesDatabase
   Dim DocE As NotesDocument
   Dim ViewE As NotesView
   Set VEntwuerfe = S.GetDatabase(strEntwurfDB,strEntwurfPfad)
   Set ViewE = VEntwuerfe.GetView("(LoeschungEntwuerfeE)")
   
   Set View = DB.GetView("(LoeschungEntwuerfe)")
   Set Doc = View.GetFirstDocument
   
   'Dokumente kopieren   
   Do Until Doc Is Nothing
      strUnique = Doc.Unique(0)
      'Lösch jetzt alle dazugehörigen Dokumente und Antworten in der Datenbank VEntwuerfe
      Set DocE = ViewE.GetDocumentByKey(strUnique)
      Do While Not (DocE Is Nothing)
         If DocE.Unique(0) = strUnique Then
            Call DocE.Remove(True)
         End If
         Set DocE = ViewE.GetNextDocument(DocE)
      Loop      
      
      Doc.txtAktion = "gelöscht"
      Call doc.Save(True, False)
      Set Doc = View.GetNextDocument(Doc)
   Loop
   
   Call view.Refresh
   
End Sub


Im Moment, gebe ich immer allen das Merkmal mit. Auf jeden Fall klappt es nicht so, wie ich es mir vorstelle.

Kann mir jemand einen Tipp geben?

Vielen Dank im Voraus,
Wiesel
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Driri am 30.06.08 - 09:46:25
Besser wäre es, wenn Du direkt beim Archivieren ein Flag in den zu archivierenden Dokumenten setzt. Dann kannst Du die in einer View anzeigen und regelmäßig per Agent aufräumen.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 30.06.08 - 11:05:00
Die Dokumente gehen werden in einer EntwurfsDB angelegt, werden dann in eine VeröffentlichungsDB kopiert (das Dok bleibt also in der EntwurfsDB bestehen) und gehen dann ins Archiv. Und wenn ein Dok im Archiv ist, soll der Ursprung in der EntwurfsDB gelöscht werden.
Daher geht das mit dem Flag schlecht.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Driri am 30.06.08 - 11:25:49
D.h. die Dokumente werden aus der VeröffentlichungsDB archiviert ?

Dann würde ich die DocumentUniqueID des Dokumentes der EntwurfsDB mit in ein Feld schreiben. Dieses bleibt dann ja beim Kopieren bzw. Archivieren erhalten und Du hast später dann direkt Zugriff auf das Original aus der EntwurfsDB.


Mea culpa. Ich hab jetzt erst das Script oben mal überflogen. Die UniqueID hast Du ja scheinbar. Ich hab dein Problem falsch verstanden.

Die Remove-Methode hat einen Rückgabewert, den Du einfach abfragen kannst. Wenn dieser True ist, dann setzt Du das Flag im Archiv-Dokument, ansonsten nicht.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Axel am 30.06.08 - 11:30:19
Wenn ich das richtig verstehe, sollen nur die Dokumente im Archiv eine Kennzeichnung bekommen, die du im Entwurf löschen konntest.

Eine Alternative wäre die folgende. Du fügst in die Maske ein berechnetes Feld mit der UniqueID ein, welches dann nicht mehr verändert wird und auch in der Archiv-DB mitgeführt wird. In der Archiv-DB erstellst du eine versteckte Ansicht, die nach diesem Feld in der ersten Spalte sortiert ist.
In deinem Agent kannst du dann an Hand dieser ID dann das Dokument in der Archiv-DB finden und wenn es im Entwurf gelöscht wurde, entsprechend deinen Wünsche bearbeiten.


Axel

[Edit]: Da war Ingo schneller.

Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Driri am 30.06.08 - 11:33:25
Hm, jetzt bin ich total verwirrt, nachdem ich Axels Antwort gelesen habe  ;D
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Axel am 30.06.08 - 11:37:45
Hm, jetzt bin ich total verwirrt, nachdem ich Axels Antwort gelesen habe  ;D

Warum? 

Axel
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Driri am 30.06.08 - 11:53:09
Weil ich gerade gedacht hatte, ich hab jetzt das eigentliche Problem verstanden. Und dann schreibst Du quasi genau die gleiche Antwort, die ich vorher auch da stehen hatte.

Jetzt weiß ich nicht mehr, was genau das Problem ist  ;)
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Axel am 30.06.08 - 12:01:10
In meinem Agent habe ich nun das Problem, dass ich nicht weiß, wie ich dort bestimme, dass in der ArchivDB nur diejenigen Doks das Merkmla bekommen, die ich in der EntwurfsDB löschen konnte?!

Ich denke das ist das Problem. Dafür hat deine Antwort auch gepasst.

Wenn's das nicht ist, dann sollte Wiesel (ein richtiger Vorname wäre schön) das Problem nochmal genauer erklären.

Axel
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 30.06.08 - 12:06:21
Eigentlich habt Ihr das schon richtig verstanden. Die Dokumente in Entwurf und Archiv, die dieselbe Unique haben sollen angefasst werden. In der Entwurf gelöscht und im Archiv Merkmal setzen.

Ich habe meinen Script etwas umgestellt:

Sub Initialize
   Dim S As New NotesSession
   Dim DB As NotesDatabase
   Dim Doc As NotesDocument
   Dim View As NotesView
   Dim strEntwurfDB As String
   Dim strEntwurfPfad As String
   Dim strUnique As String
   
   Set DB = S.CurrentDatabase
   Set Doc = DB.GetProfileDocument("(DBProfil)")
   'Profil Dokument auslesen
   strEntwurfDB = Doc.dbServer(0)
   strEntwurfPfad = Doc.dbPfad(0)
   
   Dim VEntwuerfe As NotesDatabase
   Dim DocE As NotesDocument
   Dim ViewE As NotesView
   Set VEntwuerfe = S.GetDatabase(strEntwurfDB,strEntwurfPfad)
   Set ViewE = VEntwuerfe.GetView("(LoeschungEntwuerfeE)")
   
   Set View = DB.GetView("(LoeschungEntwuerfe)")
   Set Doc = View.GetFirstDocument
   
   'Dokumente fischen   
   Do Until Doc Is Nothing
      strUnique = Doc.Unique(0)
      'Lösch jetzt alle dazugehörigen Dokumente und Antworten in der Datenbank VEntwuerfe
      Set DocE = ViewE.GetDocumentByKey(strUnique)
      Do While Not (DocE Is Nothing)
         If DocE.Unique(0) = strUnique Then
            Call DocE.Remove(True)
            Doc.txtAktion = "gelöscht"
            Call doc.Save(True, False)
         End If
         Set DocE = ViewE.GetNextDocument(DocE)
      Loop      
      
      
      Set Doc = View.GetNextDocument(Doc)
   Loop
   
   Call view.Refresh
   
End Sub

Aber an der Stelle
Set DocE = ViewE.GetNextDocument(DocE)
bekomme ich diese Fehlermeldung:
Function requires a valid ADT argument

Zum Teil ist was umgesetzt. Aber irgendwie krieg ich immer ein Problem, wenn das nächste Dok angesprungen werden soll, oder so. ???


P.S.: Ich mag Wiesel ;o)
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: DAU-in am 30.06.08 - 13:02:52
vielleicht stehe ich auf dem Schlauch, weil mir im Flieger soeben zweieinhalb Stunden das Hirn gedörrt wurde:


 Do Until Doc Is Nothing
      strUnique = Doc.Unique(0)
      'Lösch jetzt alle dazugehörigen Dokumente und Antworten in der Datenbank VEntwuerfe
      Set DocE = ViewE.GetDocumentByKey(strUnique)
      Do While Not (DocE Is Nothing)
         If DocE.Unique(0) = strUnique Then
            Call DocE.Remove(True)     
      Doc.txtAktion = "gelöscht"
            Call doc.Save(True, False)
         End If
        Set DocE = ViewE.GetNextDocument(DocE)   
  Loop     
     
     
      Set Doc = View.GetNextDocument(Doc)
   Loop



du entfernst das Dokument, und danach willst du auf das nächste zugreifen?

mach dir noch ein docNext,

und dann 

set docNext = ViewE.GetNextDocument(DocE)
docE.remove
set  docE = docNext

Oder irgendwie so ...
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 30.06.08 - 13:43:34
Ah, verstehe das Problem.

Ich hab das jetzt mal versucht in eine Collection zu bringen:

Sub Initialize
   Dim S As New NotesSession
   Dim DB As NotesDatabase
   Dim Doc As NotesDocument
   Dim Col As NotesDocumentCollection
   Dim View As NotesView
   Dim strEntwurfDB As String
   Dim strEntwurfPfad As String
   Dim strUnique As String
   
   Set DB = S.CurrentDatabase
   Set Doc = DB.GetProfileDocument("(DBProfil)")
   'Profil Dokument auslesen
   strEntwurfDB = Doc.dbServer(0)
   strEntwurfPfad = Doc.dbPfad(0)
   
   Dim VEntwuerfe As NotesDatabase
   Dim DocE As NotesDocument
   Dim ViewE As NotesView
   Set VEntwuerfe = S.GetDatabase(strEntwurfDB,strEntwurfPfad)
   Set ViewE = VEntwuerfe.GetView("(LoeschungEntwuerfeE)")
   
   Set View = DB.GetView("(LoeschungEntwuerfe)")
   Set Doc= View.GetFirstDocument
   
   Do Until Doc Is Nothing   
      strUnique = Doc.Unique(0)
      
      Set Col = View.GetAllDocumentsByKey(strUnique)
      
      If Not Col Is Nothing Then
         If Col.Count <> 0 Then
            Call Col.RemoveAll(True)
         End If
         Doc.txtAktion = "gelöscht"
         Call doc.Save(True, False)
         Set DocE = Col.GetNextDocument(Doc)

      End If
      
   Loop
   
   Call view.Refresh
   
End Sub

Allerdings bekomme ich in der Zeile
Doc.txtAktion = "gelöscht"
die Fehlermeldung
Object variable not set.

Das Dokument im Archiv hat den Flag bekommen, aber in der EntwurfsDB ist es nicht gelöscht worden...
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: DAU-in am 30.06.08 - 13:49:22
Set DocE = Col.GetNextDocument(Doc)   ???

Da wirfst du doch die Dokumente beider Datenbanken durcheinander?  :-:
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: tks am 30.06.08 - 13:51:07
call doc.ReplaceItemValue("txtAktion","gelöscht")

Und das was DAU-in geschrieben hat....
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Driri am 30.06.08 - 13:53:07
Das Script oben ist von Wiesel nachträglich geändert worden, darum sind jetzt einige Kommentare evtl. verwirrend.

Die Zeile Set DocE = Col.GetNextDocument(Doc) kannst Du dir bei Verwendung der Collection und RemoveAll sparen.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 30.06.08 - 14:13:01
Hab das also nochmal angepasst:

                Set VEntwuerfe = S.GetDatabase(strEntwurfDB,strEntwurfPfad)
   Set ViewE = VEntwuerfe.GetView("(LoeschungEntwuerfeE)")
   
   Set View = DB.GetView("(LoeschungEntwuerfe)")
   Set Doc= View.GetFirstDocument
   
   While Not (doc Is Nothing)   
      strUnique = Doc.Unique(0)
      
      Set Col = View.GetAllDocumentsByKey(strUnique)
      
      If Not Col Is Nothing Then
         If Col.Count <> 0 Then
            Call Col.RemoveAll(True)
         End If
         Call Doc.ReplaceItemValue("txtAktion","gelöscht")
         Call Doc.Save(True, True)
         Call view.Refresh
      End If
      Set Doc= View.GetFirstDocument
   Wend

Ich bekomme immer noch die Fehlermeldung
Object variable not set
in der Zeile
Call Doc.ReplaceItemValue("txtAktion","gelöscht")

Und das Merkmal wird zwar gesetzt, aber das Dok in der EntwurfsDB wird nie gelöscht.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Axel am 30.06.08 - 14:19:46
Wird die Collection entsprechend gefüllt?  Prüf das Ganze mal mit dem Debugger. Dann wirst du relativ schnell sehen wo's klemmt.


Axel

Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: DAU-in am 30.06.08 - 14:23:49
Set Col = View.GetAllDocumentsByKey(strUnique)

kein Wunder.

Du wirbelst doch nur in DB A herum, das beeindruckt die Dokumente in DB B wenig.  ;D

Wenn du die Dokumente in DB B löschen willst, ist es hilfreich, wenn du deine Collection, die du löscht, auch in der richtigen DB erstellst.

Oder in welcher DB soll gelöscht werden? Vielleicht verstehe ich auch deinen Code nicht.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 30.06.08 - 14:26:31
Klar, da hast Du recht. Leuchtet mir ein. Hab ich total übersehen....

Aber was ist mit dem Object variable not set?
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: DAU-in am 30.06.08 - 14:29:47
Ist das Doc denn noch da, oder sammelst du das in deiner Col und löscht es weg?

Ich hab keine Ahnung, ob du mit

Set Doc= View.GetFirstDocument
   
   While Not (doc Is Nothing)   
      strUnique = Doc.Unique(0)
     
      Set Col = View.GetAllDocumentsByKey(strUnique)



nicht deine Col mit deinem doc befüllst?
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Driri am 30.06.08 - 14:30:27
Genau das. Doc wurde zwei Zeilen vorher gelöscht, weil es in der Collection enthalten ist.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Glombi am 30.06.08 - 14:31:54
Müsste es nicht statt
Set Col = View.GetAllDocumentsByKey(strUnique)
wie folgt heissen:

Set Col = ViewE.GetAllDocumentsByKey(strUnique)


Die Dokumente sollen doch in der DB VEntwuerfe gelöscht werden, oder?

Andreas
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 30.06.08 - 15:23:38
Ok, soweit klappt es endlich, Dok wird gelöscht und Merkmal wird gesetzt. Danke hierfür!

Jetzt bekomme ich nur eine Fehlermeldung, wenn quasi meine Ansicht zu Ende ist.

Dann kommt:
Eintrag im Index nicht gefunden


Hier nochmal mein aktueller Script:

                Dim VEntwuerfe As NotesDatabase
   Dim DocE As NotesDocument
   Dim ViewE As NotesView
   Set VEntwuerfe = S.GetDatabase(strEntwurfDB,strEntwurfPfad)
   Set ViewE = VEntwuerfe.GetView("(LoeschungEntwuerfeE)")
   
   Set View = DB.GetView("(LoeschungEntwuerfe)")
   Set Doc= View.GetFirstDocument
   
   While Not (doc Is Nothing)
      strUnique = Doc.Unique(0)
      
      Set Col = ViewE.GetAllDocumentsByKey(strUnique)
      
      If Not Col Is Nothing Then
         If Col.Count <> 0 Then
            Call Col.RemoveAll(True)
            Call Doc.ReplaceItemValue("txtAktion","gelöscht")
            Call Doc.Save(True, True)
         End If
         
      End If
      Set Doc= View.GetNextDocument(Doc)
   Wend
   Call view.Refresh


Und nach dem letzten Dokument steigt Notes in der Zeile
Set Doc= View.GetNextDocument(Doc)
aus.

????
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Axel am 01.07.08 - 09:42:39
Kann es sein, dass die Dokumente, wenn du txtAktion setzt, aus der Ansicht rausfliegen?


Axel
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 01.07.08 - 09:46:35
Ja, tun sie.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: tks am 01.07.08 - 09:47:52
Dann mal die View-Property "AutoUpdate" anschauen.
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Axel am 01.07.08 - 09:49:09
Dann kann das so nicht gehen.

Du musst dir auch diese Dokumente zuerst in eine Collection packen und dann abarbeiten.


Axel
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Glombi am 01.07.08 - 10:09:38
Üblicherweise macht man das so:

Dim VEntwuerfe As NotesDatabase
   Dim DocE As NotesDocument
   Dim ViewE As NotesView

dim nextdoc as NotesDocument

   Set VEntwuerfe = S.GetDatabase(strEntwurfDB,strEntwurfPfad)
   Set ViewE = VEntwuerfe.GetView("(LoeschungEntwuerfeE)")
   
   Set View = DB.GetView("(LoeschungEntwuerfe)")
   Set Doc= View.GetFirstDocument
   
   While Not (doc Is Nothing)
      Set nextdoc = View.GetNextDocument(Doc)
      strUnique = Doc.Unique(0)
     
      Set Col = ViewE.GetAllDocumentsByKey(strUnique)
     
      If Not Col Is Nothing Then
         If Col.Count <> 0 Then
            Call Col.RemoveAll(True)
            Call Doc.ReplaceItemValue("txtAktion","gelöscht")
            Call Doc.Save(True, True)
         End If
         
      End If
      Set Doc= nextdoc
   Wend
   Call view.Refresh


Andreas
Titel: Re: Bestimmte Dokumente per Agent löschen
Beitrag von: Wiesel am 01.07.08 - 10:18:36
Ich hab jetzt auch die andere Ansicht in eine Collection gepackt. Das war´s! Jetzt funzt es einwandfrei.


Ich danke, danke, danke Euch für Eure tolle Hilfe.

Grüße,
Wiesel
:o)