Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Don Pasquale am 18.12.02 - 14:57:58

Titel: Serienbriefe in Word datensatzweise drucken
Beitrag von: Don Pasquale am 18.12.02 - 14:57:58
Hallo Leute,

und wieder ein klitzeklitzekleines Problem (hüstel)

Ich erstelle einen Serienbrief, möchte aber nicht den kompletten
Serienbrief auf einmal, sondern immer nur Datensatzweise.

Aber irgendwie springt er nicht in den nächsten Datensatz.

Hier ein Codeauszug :


MyWordDoc.MailMerge.DataSource.ActiveRecord = wdFirstRecord
Do While iAlterRecord <> iNeuerRecord
   iRepetition = 0
         
   word.ActivePrinter = "Print-2-Image"
   Call myworddoc.PrintOut(False, , , , , , , 1)
   word.Applikation.FileName ="test777.tif"
   worddoc.saveas("c:\temp\test.doc")
   iAlterRecord =1

   MyWordDoc.MailMerge.DataSource.ActiveRecord = wdNextRecord   
Loop   



jemand eine idee ?


Ciao

Don Pasquale
Titel: Re:Serienbriefe in Word
Beitrag von: ata am 18.12.02 - 15:02:13
... du beziehst dich mit While auf eine Bedingung, vielleicht ist die ja erfüllt...

ata
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 19.12.02 - 10:16:33
Hi ata,
ich habe mich vielleicht ungeschickt ausgedrückt,

diese Beiden Zeilen scheinen ohne Funktion zu
sein:
MyWordDoc.MailMerge.DataSource.ActiveRecord = wdFirstRecord
MyWordDoc.MailMerge.DataSource.ActiveRecord = wdNextRecord
und folgendes :
Messagebox  ( Cint MyWordDoc2.MailMerge.DataSource.ActiveRecord)         )

ergibt ein Variant does not Contain Object.

Nun sind mir die Methoden der Word.Applikation
einfach nicht geläufig.

Was tun ?

ratlos

Don Pasquale
Titel: Re:Serienbriefe in Word
Beitrag von: ata am 19.12.02 - 10:26:39
... du arbeitest mit Word-Konstanten, sind die deklariert worden?...

ata
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 19.12.02 - 12:41:24
So sieht das Skript bisher aus:

[
.
.
.
]
Code
Dim word As Variant    
Dim WordDoc1 As Variant      
Dim WordDoc2 As Variant   
Dim object As Variant
Dim WordObj As Variant
      
iAlterRecord = 0
iNeuerRecord = 10
      
Set  word = CreateObject("Word.Application") 'Create Word object 
Call word.documents.add(PFAD$,False)   
Set Worddoc2 = word.activedocument 'Get a handle for the active document 
WordDoc2.MailMerge.MainDocumentType = wdFormLetters
Call WordDoc2.MailMerge.OpenDataSource(DataSourcePfad)
WordDoc2.MailMerge.SuppressBlankLines = True
Call WordDoc2.MailMerge.Execute(True)
word.visible = True 'Comment this line if you don't want to show Word. 
'word.quit 'remove comment if you want to close rather than show Word.       
      
'Worddoc2.MailMerge.ViewMailMergeFieldCodes = wdToggle   
'      wohin kommt das und was bringt es ?
      
WordDoc2.MailMerge.DataSource.ActiveRecord = wdFirstRecord
      
Do While iAlterRecord <> iNeuerRecord
    'Warten, bis (evtl. aus dem Vorlauf noch vorhandene) Attribute.txt nicht mehr da ist ..
   iRepetition = 0
   iAlterRecord = iAlterRecord + 1
   word.ActivePrinter = "Print-2-Image"
   Call worddoc2.PrintOut(False, , , , , , , 1)
                  WordDoc2.saveas("c:\temp\test.doc") 'save the document with the filename of "user" 
         
         WordDoc2.MailMerge.DataSource.ActiveRecord = wdNextRecord   
Loop   

      
      
Titel: Re:Serienbriefe in Word
Beitrag von: ata am 19.12.02 - 12:44:34
... wdFirstRecord und wdNextRecord sind Konstanten, die ihren Wert in Notes per OLE/COM erst bekommen müssen. In Word sind die bereits global bekannt, in deiner Umgebung sehe ich die nicht...

ata
Titel: Re:Serienbriefe in Word
Beitrag von: ata am 19.12.02 - 12:48:15
... ich habe die Werte gefunden...

wdFirstRecord = -4
wdNExtRecord = -2
wdFormLetters = 0

ata
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 19.12.02 - 12:58:58
Hi ata,

kannst Du mir da noch ein bißchen dazu schreiben ?
Ich weiss leider noch nicht was ich nun zu tun habe.

Ich habe diese Zeilen jetzt einfach mal in meinen Code
übernommen und war der Ansicht, dass diese Zeile

WordDoc2.MailMerge.DataSource.ActiveRecord = wdNextRecord  

irgendwelche Zähler ändert.
Irre ich mich da ?

Ciao

Don Pasquale
Titel: Re:Serienbriefe in Word
Beitrag von: ata am 19.12.02 - 13:08:08
... in Word sind Konstanten eingebaut, die über deren Namen sprechen. "-4" sagt niemandem etwas, aber mit wdNextRecord kann man sich was vorstellen...

... du hast 2 Möglichkeiten:

Die Konstanten in der Deklaration übernehmen mit...
   
   Const wdFirstRecord = -4
   ... usw.

... oder eben anstelle der Konstanten direkt die Zahl verwenden...
... das wärs eigentlich schon... ;D

ata
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 19.12.02 - 13:43:35
Oh, dann liegt der Fehler woanders.


Ich möchte nämlich Datensatz für Datensatz ausdrucken
und nahm an, mit wdnextrecords würde ich das erreichen.

vielleicht fehlt mir hier einer der vielen Parameter
Call worddoc2.PrintOut(False, , , , , , , 1)

jetzt bräuchte man eine Doku

ciao

Don Pasquale

Titel: Re:Serienbriefe in Word
Beitrag von: ata am 19.12.02 - 13:47:06
... wenn du die Konstanten nicht zugewiesen hattest, konnte es auf keinen Fall funktionieren. Würde einer der Parameter fehlen, würdest du von Word eine Fehlermeldung erhalten...

ata

Nachtrag ... printOut reicht auch ohne Parameter...

ata
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 19.12.02 - 14:17:25
Aber ich habe immer noch keinen Schimmer,
wie ich ihm sage, dass er nur den aktuellen
Datensatz drucken soll ?

Titel: Re:Serienbriefe in Word
Beitrag von: aba am 19.12.02 - 14:51:15
Hallo Don Pasquale,

ich kann Dir wahrscheinlich nicht helfen aber das Thema interessiert mich. Kannst Du mir evtl. in kurzen Worten den Anwendungsfall schildern und wie die Beziehung in dem Fall zwischen Word und Notes aussieht!!
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 19.12.02 - 15:06:08
Hallo aba,
den ersten teil der frage kann ich sicherlich beantworten.

Normalerweise druckt man einen Serienbrief am Stück ( und lässt die Marketingmitarbeiter selbst sortieren, wann der eine Brief fertig und der nächste anfängt.
Ich möchte aber jeden Brief einzeln gedruckt haben, deswegen muß ich recordweise durch die Steuerdatei.
Die Steuerdatei wird vorher erstellt, diese muss in der ersten Zeile den Namen der Felder haben, z.B.

Vorname,Name,Ort

und in den folgenden Zeilen die einzelnen Datensätze mit den Daten in genau dieser angegebenen Reihenfolge. Die Serienbrieffelder in Word müssen den gleichen Namen tragen.

Wie Du am Code siehst, erstelle ich ein Object "Word.Application"
und ab da an komme ich ins schwimmen, weil die folgenden
Methoden eben OLE-Word-Methoden sind.
Ich habe den Code teilweise aus Beispielen in der Sandbox und teilweise aus anderen Visual Basic Applikationen gemopst.

Gruß

Don Pasquale
Titel: Re:Serienbriefe in Word
Beitrag von: aba am 19.12.02 - 15:10:21
OK klar.

Das hört sich erstmal für mich noch zu schwierig an. Würde mich aber freuen wenn ich nochmal auf Dich zurückgreifen könnte wenn das hier ein Thema wird.

Vielen Dank
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 19.12.02 - 15:24:08
aba,
na klar,
entweder habe ich mir bis dahin die Kugel gegeben oder
bin zum profi geworden
ciao
don pasquale
Titel: Re:Serienbriefe in Word
Beitrag von: wflamme am 19.12.02 - 15:45:44
... ich habe die Werte gefunden...

wdFirstRecord = -4
wdNExtRecord = -2
wdFormLetters = 0

ata

Damit geht's einfacher:
http://www.sns1.de/partner/flamme/wflamme.nsf/Shortcut/DumpTypeLibInfo1 (http://www.sns1.de/partner/flamme/wflamme.nsf/Shortcut/DumpTypeLibInfo1)
Titel: Re:Serienbriefe in Word
Beitrag von: ata am 19.12.02 - 15:53:44
@wfamme

... damit hat man schon mal alles was man braucht. Die Sache mit den externen Dateien, die eingebunden werden haben nur einen kleinen Nachteil - bei jeder Speicherung des Designelementes muss  vorhanden sein - darauf muss man achten, den sonst kennt die die Konstanten nicht. Wenn also der Kunde genau bei diesem Designelement was biegt und ddann speichert, und er hat die Datei nicht...

ata
Titel: Re:Serienbriefe in Word
Beitrag von: Don Pasquale am 20.12.02 - 11:59:11
Liebe Freunde der Serienbrief-Schreiberei,

dank der freundlichen Hilfe dieses Forums ( insbesondere Anton a.k.a ata ) konnte ich endlich einen Serienbrief Datensatzweise drucken. Glaubt mir, das wird gewünscht.

Hier ist nun mein aktuelles Ergebnis
(aber, es ist noch nicht unter Last getestet)

PFAD$          = der Pfad zur Serienbriefformatvorlage
DataSource  = Pfad zur Serienbriefsteuerdatei

      
      
      Const wdFirstRecord = - 4
      Const wdNExtRecord = -2
      Const wdFormLetters = 0
      Const wdToggle = 0 ' diese Zahl ist vermutlich falsch, aber klappt trotzdem
      
      
      Dim WordDoc2 As Variant   
      Dim object As Variant
      Dim WordObj As Variant
      
      
      
   '***************
      Set  word = CreateObject("Word.Application") 'Create Word object
      Call word.documents.add(PFAD$)   
      Set Worddoc2 = word.activedocument 'Get a handle for the active document
      WordDoc2.MailMerge.MainDocumentType = wdFormLetters
      Call WordDoc2.MailMerge.OpenDataSource(DataSourcePfad)
      WordDoc2.MailMerge.SuppressBlankLines = True
      Call WordDoc2.MailMerge.Execute(True)
      word.visible = True 'Comment this line if you don't want to show Word.
'      word.ActivePrinter = "Print-2-Image"
      Call worddoc2.PrintOut
   ' ****************   
      WordDoc2.MailMerge.ViewMailMergeFieldCodes = wdToggle
      
      
  'Gehe durch alle Datensaetze zum Druck auf Papier
      
      iAlterRecord = 0
      iNeuerRecord = 1
      
      WordDoc2.MailMerge.DataSource.ActiveRecord = wdFirstRecord
      Do While iAlterRecord <> iNeuerRecord
    'Warten, bis (evtl. aus dem Vorlauf noch vorhandene) Attribute.txt nicht mehr da ist ..
      
         Call worddoc2.PrintOut(False, , , , , , , 1)
         iAlterRecord =iNeuerRecord
         WordDoc2.MailMerge.DataSource.ActiveRecord = wdNextRecord
         iNeuerRecord = Cint(WordDoc2.MailMerge.DataSource.ActiveRecord)
      Loop   
      
   End If