Autor Thema: Bestimmte Dokumente per Agent löschen  (Gelesen 6730 mal)

Offline Wiesel

  • Aktives Mitglied
  • ***
  • Beiträge: 188
  • Geschlecht: Weiblich
Bestimmte Dokumente per Agent löschen
« 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

Driri

  • Gast
Re: Bestimmte Dokumente per Agent löschen
« Antwort #1 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.

Offline Wiesel

  • Aktives Mitglied
  • ***
  • Beiträge: 188
  • Geschlecht: Weiblich
Re: Bestimmte Dokumente per Agent löschen
« Antwort #2 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.

Driri

  • Gast
Re: Bestimmte Dokumente per Agent löschen
« Antwort #3 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.
« Letzte Änderung: 30.06.08 - 11:32:41 von Driri »

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Bestimmte Dokumente per Agent löschen
« Antwort #4 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.

« Letzte Änderung: 30.06.08 - 11:31:53 von Axel »
Ohne Computer wären wir noch lange nicht hinterm Mond!

Driri

  • Gast
Re: Bestimmte Dokumente per Agent löschen
« Antwort #5 am: 30.06.08 - 11:33:25 »
Hm, jetzt bin ich total verwirrt, nachdem ich Axels Antwort gelesen habe  ;D

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Bestimmte Dokumente per Agent löschen
« Antwort #6 am: 30.06.08 - 11:37:45 »
Hm, jetzt bin ich total verwirrt, nachdem ich Axels Antwort gelesen habe  ;D

Warum? 

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Driri

  • Gast
Re: Bestimmte Dokumente per Agent löschen
« Antwort #7 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  ;)

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Bestimmte Dokumente per Agent löschen
« Antwort #8 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline Wiesel

  • Aktives Mitglied
  • ***
  • Beiträge: 188
  • Geschlecht: Weiblich
Re: Bestimmte Dokumente per Agent löschen
« Antwort #9 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)

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Bestimmte Dokumente per Agent löschen
« Antwort #10 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 ...
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline Wiesel

  • Aktives Mitglied
  • ***
  • Beiträge: 188
  • Geschlecht: Weiblich
Re: Bestimmte Dokumente per Agent löschen
« Antwort #11 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...
« Letzte Änderung: 30.06.08 - 13:48:53 von Wiesel »

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Bestimmte Dokumente per Agent löschen
« Antwort #12 am: 30.06.08 - 13:49:22 »
Set DocE = Col.GetNextDocument(Doc)   ???

Da wirfst du doch die Dokumente beider Datenbanken durcheinander?  :-:
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline tks

  • Senior Mitglied
  • ****
  • Beiträge: 425
  • Geschlecht: Männlich
  • ...für'n Fuss
Re: Bestimmte Dokumente per Agent löschen
« Antwort #13 am: 30.06.08 - 13:51:07 »
call doc.ReplaceItemValue("txtAktion","gelöscht")

Und das was DAU-in geschrieben hat....
Thomas

*********************************
Domino 8.5.3FP6 unter W2K12
Notes 8.5.3 unter Win7
sequrIQ (watchdog & crypt)
*********************************

Driri

  • Gast
Re: Bestimmte Dokumente per Agent löschen
« Antwort #14 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.

Offline Wiesel

  • Aktives Mitglied
  • ***
  • Beiträge: 188
  • Geschlecht: Weiblich
Re: Bestimmte Dokumente per Agent löschen
« Antwort #15 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.

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Bestimmte Dokumente per Agent löschen
« Antwort #16 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

Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Bestimmte Dokumente per Agent löschen
« Antwort #17 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.
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline Wiesel

  • Aktives Mitglied
  • ***
  • Beiträge: 188
  • Geschlecht: Weiblich
Re: Bestimmte Dokumente per Agent löschen
« Antwort #18 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?

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Bestimmte Dokumente per Agent löschen
« Antwort #19 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?
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz