Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: bordi am 28.08.02 - 12:58:54
-
Ich möchte aus Dokumente in einer Datenbank, die mehrere Adressaten (SendTo) besitzen, einzelne Dokumente mit jeweils einem Adressaten machen.
Dieser Agent soll "vor eingang neuer mail" laufen.
leider funktioniert er nicht wie gewünscht, da am ende in jedem dokument, der selbe Adressat drinsteht.
was mache ich falsch???
danke für die hilfe
'****** Sinn des Agenten ist es die Lesefelder zu füllen, damit die Abteilungen nur ihre eigenen Dokumente lesen können
Sub Initialize
Dim session As New NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim item As NotesItem
Set db = session.CurrentDatabase
Set dc = db.allDocuments
Set doc = dc.GetFirstDocument
Dim gruppe As String
Dim i As Integer
Dim flagitem As NotesItem
Dim max As Integer
Dim sendtosave() As String
While Not(doc Is Nothing)
If Not (doc.HasItem( "processed" ) ) Then '*** Dokument schon durch Agent bearbeitet worden?
Set flagitem = New NotesItem( doc, "processed", 1 ) 'flag = 1 '*** Dokumentstatus wird als bearbeitet gesetzt
max = Ubound(doc.SendTo)
Redim sendtosave(0 To max) As String
'SendTo-Feld zwischenspeichern
For i = 0 To max
sendtosave(i) = doc.SendTo(i)
Next
For i = 0 To Ubound(sendtosave)
'Nur gültige Adressaten zulassen
If Not Strright (sendtosave(i), "#") = "" Then
'Richtigen Adressaten setzen
Set item = doc.ReplaceItemValue( "SendTo", sendtosave(i) )
'Dokument wird gespeichert
Call doc.Save(True, True)
Call session.UpdateProcessedDoc( doc )
End If
Next
End If
'Nächstes unbearbeitetes Dokument
Set doc = dc.GetNextDocument(doc)
Wend
End Sub
-
1. Frage: wo werden die neuen Docs erstellt in Deinem Codesnippet?
2. Frage: wenn Du das Teil im Client laufen läßt und den Debugger anhast, läuft alles reibungslos durch?
-
Hi bordi,
Du erstellt ja gar keine neuen Dokumente, sondern iterierst im Dok. über alle Einträge im Feld SendTo und trägst dann den letzten ein.
Ausserdem wird kein Lesefeld gesetzt.
Wenn ich das richtig verstanden habe, will Du pro Eintrag im Feld SendTo eine Kopie des Dokuments erstellen (sofern ein "#" vorkommt).
Das könntest Du dann so machen:
dim newdoc as NotesDocument
For i = 0 To Ubound(sendtosave)
'Nur gültige Adressaten zulassen
If Not Strright (sendtosave(i), "#") = "" Then
'Richtigen Adressaten setzn
set newdoc = doc.CopyToDatabase( db )
newdoc.processed = 1
Set item = newdoc.ReplaceItemValue( "SendTo", sendtosave(i) )
'Lesenamensfeld setzen
item.IsReaders = true
'Dokument wird gespeichert
Call newdoc.Save(True, True)
Call session.UpdateProcessedDoc( doc )
End If
Next
-
1. hier:
For i = 0 To Ubound(sendtosave)
'Nur gültige Adressaten zulassen
If Not Strright (sendtosave(i), "#") = "" Then
'Richtigen Adressaten setzen
Set item = doc.ReplaceItemValue( "SendTo", sendtosave(i) )
'Dokument wird gespeichert
Call doc.Save(True, True)
Call session.UpdateProcessedDoc( doc )
End If
Next
2. im debugger zeigt er das bearbeitete sendto feld richtig gefüllt an.
zum beispiel bei einem dokument, das reinkommt mit drei adressaten, soll er drei dokumente mit jeweils einem der drei adressaten machen. wie gesagt im debugger stimmts, aber nachher habe ich drei mails mit einem identischen adressaten im sendto feld.
tja, keine ahnung was für einen mist ich mache, oder ob es am server liegt?
???
-
danke glombi !!!
das probiere ich morgen mal aus.
ich hatte auch schon die idee mit "copytodatabase"
aber auf einmal hatte ich jede mail mehrfach.
mit "processed = 1" und "newdoc" anstatt "doc"
sollte es aber klappen
cu bordi
-
bordi,
ok, jetzt sehe ich, wo das neu setzen "angeblich" erfolgt. Mittlerweile hat ja glombi genau den richtigen Ansatz und ichversuch mal den Fehler aufzuzeigen.
...
'Dokument wird gespeichert
Call doc.Save(True, True)
...
Zu den Flags True:
der erste Flag besagt bei "True", daß Notes brutalst das Document auf jeden Fall speichert (Versionsdoc), WENN ein Dritter das gleiche Doc gerade im Edit Zugriff hat.
Wenn das erste Flag aber "FALSE" ist (Dein Fall), dann verzweigt Notes lieb WENN ein Dritter das gleiche Doc im Zugriff hat auf das zweite Flag. Das zweite Flag sagt "mach nix" = FALSE oder "mach halt ein Response" = TRUE.
Beide Fälle gelten aber nur dann, wenn ein Speicherkonflikt besteht. Kurzum: die Flags sind für die Handhabung von Parallelzugriffen auf Dokumente gedacht und nicht, um neue Docs per se zu erstellen.
Daher wundert es mich, daß Du anscheinend Dokumente mit diesem Script erstellt hast und würde sonst sagen, wenn das nicht das Problem wäre, das man Methoden wie gombli oder zB makeresponse verwendet.
Weiß jemand Rat, warum dennoch Docs erstellt wurden oder reiner Zufall?