Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: bordi am 28.08.02 - 12:58:54

Titel: aus mehreren Adressaten jeweils ein dokument mache
Beitrag 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
Titel: Re: aus mehreren Adressaten jeweils ein dokument m
Beitrag von: Rob Green am 28.08.02 - 15:03:05
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?
Titel: Re: aus mehreren Adressaten jeweils ein dokument m
Beitrag von: Glombi am 28.08.02 - 18:17:48
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

Titel: Re: aus mehreren Adressaten jeweils ein dokument m
Beitrag von: bordi am 28.08.02 - 18:22:24
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?
???
Titel: Re: aus mehreren Adressaten jeweils ein dokument m
Beitrag von: bordi am 28.08.02 - 18:27:40
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
Titel: Re: aus mehreren Adressaten jeweils ein dokument m
Beitrag von: Rob Green am 29.08.02 - 00:04:18
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?