Hallo,
ich wollte mal eben eine kleine DB erstellen, wo man so eine Art Serienbriefe erstellen kann, da wir im wesentlichen unsere Adressen in Notes pflegen.
Dafür habe ich mal eine DB erstellt, wo man angeben kann aus welcher DB die Adressen kommen sollen.
Dann kann man noch eine Art Vorlage generieren, wo ähnlich zum Wordserienbrief, Infos über die Felder hinterlegt werden können, die aus den Adressdaten kommen.
Hier mal ein Beispiel einer Vorlage:
Sehr geehrt
@F:@If(Title = "Mr.";"er"; Title = "Ms."; "e"; ".."):F@
@F:@If(Title = "Mr."; "Herr"; Title = "Ms."; "Frau"; ".."):F@
@F:@If(@Trim(FirstName) <> ""; @Trim(FirstName) + " "; "") + @Trim(LastName):F@
anbei erhalten Sie wie gewünscht die Informationen
Dabei sind die Sachen, die zwischen @F: und :F@ kommen, die Platzhalter für die Adressinfos.
Wenn hinter dem @F: ein @ kommt, handelt es sich um eine Formel und ich mache ein evaluate. Andernfalls ist das ein normales Notesfeld und ich hole mir die Infos aus dem angegebenen Feld.
Soweit so gut.
Folgenden Code habe ich dafür:
Dabei wird immer ein "noteDest" für jeden Datensatz erstellt. "noteSrc" ist mein Dokument, wo die Vorlage mit o.a. Formel angegeben ist.
Dann gehe ich soweit durch die Vorlage durch, so lange ich ein "@F:" finde. Danach ein Evaluate oder eben der Wert im Notesfeld. Und danach ein FindAndReplace auf dem RichTextNavigator.
Set rtTemplateBody = noteSrc.GetFirstItem("Body")
Set noteDest = dbCur.CreateDocument
Call noteDest.ReplaceItemValue("Form", "Seriendokument")
Set rtBody = rtTemplateBody.CopyItemtoDocument(noteDest, "Body")
Call noteDest.Save(True, False)
strReplace = rtBody.text
Set rtnav = rtBody.CreateNavigator
Call rtnav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
Set rtrange = rtBody.CreateRange
While Instr(strReplace, "@F:") <> 0
strSrc = Mid(strReplace, Instr(strReplace, "@F:") + 3)
strSrc = Left(strSrc, Instr(strSrc, ":F@") - 1)
If Left(strSrc, 1) = "@" Then
ret = Evaluate(strSrc, noteSrc)
strValue = ret(0)
Else
strValue = Cstr(noteSrc.GetItemValue(strSrc)(0))
End If
Messagebox "@F:" + strSrc + ":F@ <-> " + strValue
While rtrange.FindAndReplace("@F:" + strSrc + ":F@", strValue) > 0
Call rtBody.Update
Wend
Call rtBody.Compact
strReplace = Mid(strReplace, Instr(strReplace, "@F:") + 3)
Wend
Call noteDest.MakeResponse(noteHeader)
Call noteDest.Save(True, False)
Alles anzeigen
Aber jetzt kommt das Problem.
Wenn ich die Vorlage wie o.a. einpflege, klappt alles wunderbar und das kommt raus:
Sehr geehrt
er
Herr
Max Muster
anbei erhalten Sie wie gewünscht die Informationen.
Wenn ich nun allerdings die Texte in eine Zeile schreiben will und die Vorlage so aufbaue:
Sehr geehrt@F:@If(Title = "Mr.";"er"; Title = "Ms."; "e"; ".."):F@ @F:@If(Title = "Mr."; "Herr"; Title = "Ms."; "Frau"; ".."):F@ @F:@If(@Trim(FirstName) <> ""; @Trim(FirstName) + " "; "") + @Trim(LastName):F@
anbei erhalten Sie wie gewünscht die Informationen
dann kommt das hier raus:
Sehr geehrter @F:@If(Title = "Mr."; "Herr"; Title = "Ms."; "Frau"; ".."):F@ @F:@If(@Trim(FirstName) <> ""; @Trim(FirstName) + " "; "") + @Trim(LastName):F@
anbei erhalten Sie wie gewünscht die Informationen
Es sieht so aus, als wenn er nur die erste Formel findet und ersetzt, wobei die Messagebox 3 x auftaucht und da auch alles wunderbar drin steht.
Ich vermute mal, dass mit meinem Navigator bzw der Range was nicht stimmt. Aber was?