Autor Thema: Replizier/Speicherkonflikt beim Einfügen von Inhalten aus notesfremden Systemen  (Gelesen 6776 mal)

Offline zyrak2003

  • Frischling
  • *
  • Beiträge: 19
Ich stehe vor einer Herausforderung. In einem Vorgang (hier mein uidoc) der mit einer Eingangsmail verbunden wurde, soll in einen Feld eine Ausgangsmail aus verschiedenen Komponenten zusammen gebaut werden, das wurde mit folgendem Script erfolgreich umgesetzt.

Sub Click(Source As Button)
   Dim ws As New NotesUIWorkspace
   Dim s As New NotesSession
   Dim db As NotesDatabase, dbMail As NotesDatabase, dbInfo As NotesDatabase
   Dim viewAP As NotesView, viewAP2 As NotesView,viewKunstname As NotesView
   Dim CollAP As NotesDocumentCollection
   Dim uidoc As NotesUIDocument
   Dim doc As NotesDocument, docMail As NotesDocument, replyMail As NotesDocument, docProfile As NotesDocument
   Dim docKunstname As NotesDocument
   Dim Ansicht As String
   Dim itemVorlageMailtext As NotesItem, itemVorlageMailtext2 As NotesItem, itemVorlageMailtext3 As NotesItem
   ' Ende der Deklaration von Variablen
   
   ws.ReloadWindow
   ws.ViewRefresh
   
   Set db=s.CurrentDatabase
   Set uidoc=ws.CurrentDocument
   Set doc=uidoc.Document
   
   Set docProfile=db.GetProfileDocument("DBProfile")
   Servername=docProfile.Mails1Server(0)
   DBname=docProfile.Mails1DB(0)
   Set dbMail=s.GetDatabase(Servername,DBName)
   
   ServernameInfo=docProfile.Info1Server(0)
   DBnameInfo=docProfile.Info1DB(0)
   Set dbInfo=s.GetDatabase(ServernameInfo,DBNameInfo)
   
   Ansicht="(MailVorlagen XY)"
   Ansicht2="(MailVorlagen)"
   
   doc.Save True, False
   ws.ReloadWindow
   Call uidoc.save
   uidoc.EditMode=False
   
   'Zuordnung des Kunstnamen
   Set viewKunstname = db.GetView("(Mailmeldenamenauswahl)")
   Commonname = s.CommonUserName
   Set docKunstname = viewKunstname.GetDocumentByKey(Commonname)
   Kunstvorname = docKunstname.Kunstvorname(0)
   Kunstnachname = docKunstname.Kunstnachname(0)
   
   'Auswahl der Vorvorlage und Abhänger
   Set viewAP2 = db.GetView (Ansicht2)
   Set docAP2 = viewAP2.GetDocumentByKey("Leer")
   Set itemVorlageMailtext2 = docAP2.GetFirstItem("VorlageMailtext")
   Set docAP3 = viewAP2.GetDocumentByKey("Abhänger XY")
   Set itemVorlageMailtext3 = docAP3.GetFirstItem("VorlageMailtext")
   
   'Feste Auswahl der Vorlage
   Set viewAP = dbInfo.GetView (Ansicht)
   Set docAP = viewAP.GetDocumentByKey("Vorlage AB")
   Set itemVorlageMailtext = docAP.GetFirstItem("VorlageMailtext")
   Set rt = doc.GetFirstItem("Ausgangsmail")
   doc.BenutzteVorlage = docAP.VorlageThema
   
'   Hinzufügen der Vorvorlage
   Call rt.appendrtitem(itemVorlageMailtext2)
   
'   Zusammensetzen der Anrede
   Call rt.AppendText( "Hallo " )
   Call rt.AppendText( doc.FirstName(0) )
   Call rt.AppendText( "," )
   Call rt.AddNewLine(2)   
   
'   Hinzufügen der Mailvorlage
   Call rt.appendrtitem(itemVorlageMailtext)
   Call rt.AddNewLine(1)
   
'   Hinzufügen des Kunstnamen
   Call rt.AppendText(Kunstvorname)
   Call rt.AddNewLine(3)
'   Hinzufügen des Abhängers
   Call rt.appendrtitem(itemVorlageMailtext3)
   
'   Hinzufügen der Ursprungsmail, falls vorhanden
   If doc.MailID(0) <> "" Then
      
      Set docMail = dbMail.GetDocumentByUNID(doc.Mailid(0))
      Set replyMail = docMail.CreateReplyMessage(False)   
      Set replyBody = replyMail.getfirstitem("Body")
      
      Call rt.AddNewLine(2)
      Call rt.appendrtitem(replyBody)
      
   End If
   
   doc.Save True, False
   uidoc.Close(True)
   Set uidoc=ws.EditDocument( ,doc)
   ws.ReloadWindow
   uidoc.save
   Call uidoc.GotoField("Ausgangsmail")
   
End Sub


Danach arbeiten die Mitarbeiter im Uidoc weiter und können zum Beispiel im Feld "Ausgangsmail" Text mittels Tastatur hinzufügen und etwas aus dem Zwischenspeicher (Quelle ist hier das Internet) einfügen.

Jetzt soll aus dem uidoc heraus die "Ausgangsmail" verschickt werden.

Das erfolgt mit folgendem Script:

Sub Click(Source As Button)
   Dim ws As New NotesUIWorkspace
   Dim s As New NotesSession
   Dim db As NotesDatabase, dbMail As NotesDatabase
   Dim uidoc As NotesUIDocument
   Dim doc As NotesDocument, docMail As NotesDocument, replyMail As NotesDocument, docProfile As NotesDocument
   Dim item As NotesItem, ReplyItem As NotesItem, BodyItem As NotesItem, TempItem As notesitem
   Dim rtitem As NotesRichTextItem
   Dim user As String
      
   Set db=s.CurrentDatabase
   Set uidoc=ws.CurrentDocument
   Set doc=uidoc.Document
   
   Call uidoc.save
   doc.Save True, False
   ws.ReloadWindow
   ws.ViewRefresh
   Call uidoc.save
   uidoc.EditMode=False
   uidoc.Close(True)
   
   ' Hier folgt der eigentliche Mailversand
   Set docProfile=db.GetProfileDocument("DBProfile")
   Servername=docProfile.Mails1Server(0)
   DBname=docProfile.Mails1DB(0)
   
   Set dbMail=s.GetDatabase(Servername,DBName)
   
   If doc.MailID(0) = "" Then
      Messagebox "Mail-ID ist nicht vorhanden - Wurde eine Mail eingebunden?"
      Exit Sub
   End If
   
   Set docMail = dbMail.GetDocumentbyunid(doc.MailID(0))
   docMail.VorgangsID = doc.ID(0)
   Call docMail.Save(True,True)
   
   Set replyMail = New NotesDocument(dbMail)
   replyMail.Mailoptions = ""
   replyMail.Form = "Memo"
   replyMail.PostedDate = Now()
   replyMail.ComposedDate = Now()
   replyMail.DeliveredDate = Now()
   replyMail.EncryptOnSend = False
   replyMail.From = "XXX"
   replyMail.Principal = "XXX"
   replyMail.Owner = "XXX"
   replyMail.Reply = "XXX"
   replyMail.Replyto = "XXX"
   user = s.UserName
   replyMail.AltFrom = User
   
   replyMail.VorgangsID = doc.ID(0)
   replyMail.MaiID = doc.MailID(0)
   replyMail.Subject = "Antwort: " & doc.MailThema(0)
   replyMail.SendTo = doc.MailReplyAddress(0)
   replyMail.EnterSendTo = doc.MailReplyAddress(0)
   replyMail.BlindCopyTo =  doc.AnzMailAddressBCC(0)
   replyMail.EnterBlindCopyTo =  doc.AnzMailAddressBCC(0)
   replyMail.ZuVersenden = "1"
   
   Set item = doc.GetFirstItem( "Ausgangsmail" )
   Call item.CopyItemToDocument(replyMail,"Body")
   Call replyMail.Save(True,True)
      
   ' Das Feld Ausgangsmail wieder auf leer setzen
   Set Item = doc.ReplaceItemValue("Ausgangsmail","")   
   
   doc.MailVerschoben = "Ja"
   
   Call doc.Save( False, True )
   
   
   ' Die Originalmail verschieben in angegebenen Ordner ohne den Ordner zu erstellen
   Call docMail.PutInFolder("Erledigte Mails",False)
   Call docMail.RemoveFromFolder( "($Inbox)" )
   
   ' Neu Öffnen um Speichern zu können
   Set uidoc=ws.EditDocument( ,doc)
   ws.ReloadWindow
   Call uidoc.GotoField("Ausgangsmail")
   Call uidoc.save
   
End Sub

Jetzt können die Mitarbeiter im uidoc noch etwas verändern und zu guter Letzt das Uidoc speichern und schließen. Das ganze funktionert nur, wenn der Text, der zusätzlich in das Feld Ausgangsmail geschrieben wird, normal per Tastatur eingegeben wird oder reiner Text aus einem bestehenden Notesdokument einkopiert wird. Hat man zusätzlich Text in das Feld einkopiert, zum Beispiel aus dem Internet, oder auch aus Word oder dem Editor gibt es beim letzten Speichern den Hinweis auf ein Speicher- /Replizierkonflikt, der verhindert werden soll. Was läuft da falsch mit dem Feld oder dem Inhalt des Feldes? Hat jemand eine Idee. Bin schon seit Wochen auf der Suche nach dem Fehler.

Hat jemand eine Idee an welcher Stelle ich forschen soll?

Offline ERR

  • Frischling
  • *
  • Beiträge: 46
  • Geschlecht: Männlich
Hallo zyrak2003,

in deinem Code speicherst du das Dokument sehr oft im Frontend und im Backend ab. Im unteren Code z.B. hier:

Code
   Call uidoc.save
   doc.Save True, False
   ws.ReloadWindow
   ws.ViewRefresh
   Call uidoc.save
   uidoc.EditMode=False
   uidoc.Close(True)

Versuch es mal so:

Code
   ' Frontend-Dokument speichern
   Call uidoc.save
   ' deine View aktualisieren
   ws.ViewRefresh
   ' Dokument in den Lesemodus setzen
   uidoc.EditMode=False
   ' Frontend-Dokument schliessen
   uidoc.Close(True)

Weiter unten kommt dann diese Stelle:

Code
   ' Neu Öffnen um Speichern zu können
   Set uidoc=ws.EditDocument( ,doc)
   ws.ReloadWindow
   Call uidoc.GotoField("Ausgangsmail")
   Call uidoc.save    

Das würde ich ändern in:

Code
   Dim uidocNeu As NotesUIDocument
   ' Neu Öffnen
   Set uidocNeu = ws.EditDocument(True, doc)
   ' Referenz auf das alte uidoc löschen
   Delete uidoc
   ' uidoc auf das uidocNeu zuweisen
   Set uidoc = uidocNeu
   ' Evtl. hier dann noch das doc neu setzen
   Set doc = uidoc.Document
   ' dann dein weiterer Code
   Call uidoc.GotoField("Ausgangsmail")
   ' da das doc im Backend bereits zuvor gespeichert wurde und hier noch nichts am "neuen" uidoc geändert wurde, muss hier nicht (unbedingt) gespeichert werden. Falls du es doch brauchst einfach wieder "einkommentieren"
   'Call uidoc.save

Ich versuche immer, das Dokument so wenig wie möglich zu speichern, egal ob Frontend oder Backend. Dabei tauchen nämlich solche Probleme dann sehr gerne auf.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz