Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet 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
-
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.
-
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.
-
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.
-
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.
-
Hm, jetzt bin ich total verwirrt, nachdem ich Axels Antwort gelesen habe ;D
-
Hm, jetzt bin ich total verwirrt, nachdem ich Axels Antwort gelesen habe ;D
Warum?
Axel
-
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 ;)
-
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
-
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)
-
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 ...
-
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...
-
Set DocE = Col.GetNextDocument(Doc) ???
Da wirfst du doch die Dokumente beider Datenbanken durcheinander? :-:
-
call doc.ReplaceItemValue("txtAktion","gelöscht")
Und das was DAU-in geschrieben hat....
-
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.
-
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.
-
Wird die Collection entsprechend gefüllt? Prüf das Ganze mal mit dem Debugger. Dann wirst du relativ schnell sehen wo's klemmt.
Axel
-
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.
-
Klar, da hast Du recht. Leuchtet mir ein. Hab ich total übersehen....
Aber was ist mit dem Object variable not set?
-
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?
-
Genau das. Doc wurde zwei Zeilen vorher gelöscht, weil es in der Collection enthalten ist.
-
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
-
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.
????
-
Kann es sein, dass die Dokumente, wenn du txtAktion setzt, aus der Ansicht rausfliegen?
Axel
-
Ja, tun sie.
-
Dann mal die View-Property "AutoUpdate" anschauen.
-
Dann kann das so nicht gehen.
Du musst dir auch diese Dokumente zuerst in eine Collection packen und dann abarbeiten.
Axel
-
Ü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
-
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)