| 
| Autor | Beitrag |  
| jamany 
          Beiträge: 73
 
 
 
 
 | 
Verfasst: Sa 15.03.03 14:39 
 
Ich habe Adressen in eine Paradox-Tabelle gespeichert.
Ich möchte automatisch einen Serienbrief erstellen. Und zwar habe ich ein Word-Dokument mit entsprechenden Feldern. Dabei handelt es sich um einen formatierten Briefkopf.
 Die Anwendung soll ein Formular bereitstellen, über welches man den Text eingeben kann.
 
 Per Klick auf einen Button soll der Text in eine weitere Paradox-Tabelle gespeichert werden und der Serienbrief erstellt, gedruckt und automatisch geschlossen werden (ohne zu speichern). Wie kann ich das machen?
 
 Zuletzt bearbeitet von jamany am So 16.03.03 12:00, insgesamt 1-mal bearbeitet
 |  |  |  
| Keldorn 
          Beiträge: 2266
 Erhaltene Danke: 4
 
 Vista
 D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
 
 | 
Verfasst: Sa 15.03.03 18:23 
 
Hallo
 es geht, 
 aber  	  | Zitat: |  	  | Wie kann ich das machen?
 
 | 
 ist ein wenig weitläufig formuliert.
 ich bin immer so vorgegangen:
 Meine Daten habe ich immer in einer TextDatei gespeichert weil ich mit Datenbanken nicht viel am Hut habe, aber mit den Datenbanken sollte es genau so gehen.
 als erstes erstell dir eine Testdatenquelle und erstell deinen Serienbrief im Word. Wenn du das fertig hast, zeichne Dir ein Makro im Word auf, mit dem du alle Befehle ausführst:
 	  | Zitat: |  	  | der Serienbrief erstellt, gedruckt und automatisch geschlossen werden (ohne zu speichern)
 
 | 
 dieses VB-Makro nimmst du dann als Vorlage für dein Delphi-Programm.
 Wenn du eine konkretere Frage hast, komm wieder.
 Mfg Frank_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
 (Murphy)
 |  |  |  
| hansa 
          Beiträge: 3079
 Erhaltene Danke: 9
 
 
 
 
 | 
Verfasst: So 16.03.03 00:59 
 
versuche mal die Paradox-Daten in ungefähr folgender Form in eine normale Textdatei zu schreiben:
 anrede;name;strasse;ort;
 Herr;test;teststr;testort;
 
 Den Rest macht Word. Da müssen auch noch einige Einstellungen vorgenommen werden.
 _________________ Gruß
 Hansa
 |  |  |  
| jamany  
          Beiträge: 73
 
 
 
 
 | 
Verfasst: So 16.03.03 11:59 
Titel: Druck starten
 
Ich verwende folgenden Code zum Erstellen eines Serienbriefes:
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 
 | procedure TForm1.Button1Click(Sender: TObject); var
 FileName, NewFile  : OleVariant;
 Mail : MailMerge;
 Pause     : OleVariant;
 begin
 if OpenDialog1.Execute then
 FileName:=OpenDialog1.FileName
 else
 exit;
 NewFile:=ExtractFilePath(FileName)+'Brief.doc';
 WordApplication1.Connect;
 WordApplication1.Documents.OpenOld(FileName, EmptyParam, EmptyParam,
 EmptyParam, EmptyParam, EmptyParam,
 EmptyParam, EmptyParam, EmptyParam,
 EmptyParam);
 WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
 WordApplication1.Visible:=True;
 Pause:=True;
 Mail:=WordDocument1.MailMerge;
 Mail.Destination := wdSendToNewDocument;
 Mail.Execute(Pause);
 ShowMessage('Fertig');
 WordDocument1.Close;
 WordDocument1.Disconnect;
 WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
 WordDocument1.SaveAs(newFile);
 WordDocument1.Disconnect;
 WordApplication1.Quit;
 WordApplication1.Disconnect;
 end;
 |  Es sollte automatisch nach dem Erstellen des Serienbriefes der Druck gestartet werden und anschließend alles geschlossen werden (ohne zu speichern). Wie müsste ich den Code ändern?
Moderiert von  raziel: Code- durch Delphi-Tags ersetzt. |  |  |  
| Keldorn 
          Beiträge: 2266
 Erhaltene Danke: 4
 
 Vista
 D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
 
 | 
Verfasst: So 16.03.03 20:07 
Titel: Re: Druck starten
 
@hansa: wie machst Du das mit den Textdateien: erstellst du deine Serienbriefe mit "festen Datenquelle", also z.B. c:\irgednwo\datenquelle.txt oder weist du die Text-Datenquelle erst beim Öffnen des Dokumentes zu, wenn ja - wie? Daran bin ich bis jetzt gescheitert, nicht mal das VB-Makro hat funktioniert     @jamany
 	  | jamany hat folgendes geschrieben: |  	  | Ich verwende folgenden Code zum Erstellen eines Serienbriefes: 
 | 
 ich hoffe mal wir reden hier nicht aneinander vorbei, aber unter erstellen versteh ich das Erstellen des Hauptdokumentes unter word. nicht das öffnen mit Delphi, aber so schlecht sieht dein Code doch gar nicht aus.
 ich würd noch ein paar sachen anders schreiben (kein exit verwenden)
 und das quit würd ich auch nicht verwenden. was ist wenn der Anwender word schon offen hatte und dein Prog es zumacht?
 ich hab hier mal einen Teil von meinem Code, den ich immer verwende:
 meine Programme bauen aber darauf auf, das das Dokument noch verändert wird, also wird die Verbindung zu Word (und auch zum Dok, in meinem Code nicht drin) offengehalten
 												| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 
 | procedure TForm1.Button1Click(Sender: TObject);Var Filename:Olevariant;
 i:integer;
 bo_true,bo_false,i_range,i_item:OleVariant; begin
 if OpenDialog1.execute then
 begin
 Filename := OpenDialog1.FileName;
 bo_true:=true;
 bo_false:=false;
 try
 i:=WordApplication1.Documents.Count;
 except
 WordApplication1.disconnect;
 WordApplication1.connect;
 end;
 with WordDocument1 do
 begin
 connectto(WordApplication1.Documents.Open(filename,emptyparam,emptyparam,emptyparam,
 emptyparam,emptyparam,emptyparam,emptyparam,
 emptyparam,emptyparam));
 MailMerge.Destination        := wdSendToPrinter;
 MailMerge.SuppressBlankLines := false;
 MailMerge.Execute(bo_true);
 MailMerge.Destination        := wdSendToNewDocument;
 MailMerge.SuppressBlankLines := false;
 MailMerge.Execute(bo_true);
 
 i_range:=wdPrintAllDocument;
 i_item := wdPrintDocumentContent;
 WordApplication1.activeDocument.PrintOut(bo_true,Emptyparam,i_range,
 Emptyparam,Emptyparam,Emptyparam,
 i_item,emptyparam,emptyparam,
 Emptyparam,Emptyparam,Emptyparam,
 Emptyparam,Emptyparam);
 WordApplication1.ActiveDocument.close(bo_false,emptyparam,emptyparam);
 WordApplication1.ActiveDocument.close(bo_false,emptyparam,emptyparam);           Disconnect;
 end;
 end;
 end;
 |  Mfg Frank
Moderiert von  raziel: Code- durch Delphi-Tags ersetzt._________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
 (Murphy)
 |  |  |  
| hansa 
          Beiträge: 3079
 Erhaltene Danke: 9
 
 
 
 
 | 
Verfasst: So 16.03.03 21:26 
Titel: Re: Druck starten
 
Bei mir ging es Anfang letzten Jahres darum, Preisschilder in der Übergangsphase des Euro in DM und EUR auszudrucken, auf Grundlage bestehender Preise. Da die DM-Preise in einer DB hinterlegt waren, habe ich diese in eine Textdatei geschrieben, sie umgerechnet und zusätzlich die Euro-Preise da hineingeschrieben. Trennzeichen war ";" 
 Und dann habe ich eine Word-Vorlage mitgeliefert, wo die Druckfelder definiert waren. Word kann das ohne weiteres. Keine feste Feldlänge sondern definiertes Feldende mit ";".
 	  | keldorn hat folgendes geschrieben: |  	  | Daran bin ich bis jetzt gescheitert, nicht mal das VB-Makro hat funktioniert. | 
 Für so was braucht man keine Makros._________________ Gruß
 Hansa
 |  |  |  
| Keldorn 
          Beiträge: 2266
 Erhaltene Danke: 4
 
 Vista
 D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
 
 | 
Verfasst: So 16.03.03 21:54 
 
Hallo Hansa,
 hast mich leider falsch verstanden.
 Mein Problem ist nicht der Aufbau, sondern der Ort der Datenquelle
 Meine Anwendung stellt als Exportfunktion diverse Text-Dateien als Datenquelle bereit. Es sind ca. 5 verschiedene, die dann als Datenquelle für die Word-Serienbriefe dienen. Die Word-Serienbriefe (ca. 20) sind alle Formularvorlagen, die auf Vordrucke angepaßt sind und auf einem Nadeldrucker ausgedruckt werden. das habe ich soweit im Kasten. 
 Die Serienbriefe liegen auf einem Netzwerklaufwerk und ca. 5 Anwender greifen darauf zu. 
 Mein Problem ist, wo  ich die Datenquelle speichere:
   - Wenn ich einen neues Formular erstelle, sollte die Datenquelle mit ein paar Mausklicks erreichbar sein, ich will mich nicht durch 10 Verzeichnisse durchklicken
   - der Ort der Datenquelle muß auf allen Rechnern gleich sein, es kann z.B. nicht das Programmverzeichnis sein, da dies auf jedem Rechner anders sein kann.
 Meine Ideen sind dahingehend gelaufen, das mein Prog das Word-Dok öffnet, den Pfad der Datenquelle ermittelt und entsprechend dem Rechner ändert. Und deshalb
 	  | Keldorn hat folgendes geschrieben: |  	  | Daran bin ich bis jetzt gescheitert, nicht mal das VB-Makro hat funktioniert.
 
 | 
 ich hatte ein Makro aufgezeichnet/erstellt, das die Datenquelle ändert, aber das funzt nicht. Entweder kommt ein dialogfenster, das zur auswahl der Importweise auffordert, oder die Trennung der Datensätze (ich nutz Tabs) funktioniert nich.
 	  | hansa hat folgendes geschrieben: |  	  | Und dann habe ich eine Word-Vorlage mitgeliefert
 
 | 
 wie machst du das bei dir mit der Datenquelle?
 Danke, Frank_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
 (Murphy)
 |  |  |  
| hansa 
          Beiträge: 3079
 Erhaltene Danke: 9
 
 
 
 
 | 
Verfasst: So 16.03.03 23:31 
 
	  | Zitat: |  	  | wie machst du das bei dir mit der Datenquelle | 
 Ohh, muß das notfalls rauskramen.    Das war aber das einfachste von allem. Lese Dir mal Lemmies Tutorials durch. Da hat er ziemlich genau beschrieben, wie so was geht. 
www.delphi-tutorials.de_________________ Gruß
 Hansa
 |  |  |  
| bis11 
          Beiträge: 1247
 Erhaltene Danke: 2
 
 Apple Mac OSX 10.11
 
 
 | 
Verfasst: Mo 17.03.03 08:27 
 
Hi,
 warum macht Ihr euch das alle so umständlich mit Textdateien etc. Nehmt einfach den SourceCode aus unserem wunderschönen FAQ  und schon habt Ihr einen Serienbrief mit Word erstellt. |  |  |  
| Keldorn 
          Beiträge: 2266
 Erhaltene Danke: 4
 
 Vista
 D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
 
 | 
Verfasst: Mo 17.03.03 08:39 
 
Hallo
 @Hansa, danke für den Link, aber die Seite gibts nicht     	  | bis11 hat folgendes geschrieben: |  	  | Hi, 
 warum macht Ihr euch das alle so umständlich mit Textdateien etc.
 | 
 ganz einfach, weil ich damals nur Delphi5 Standard hatte - das macht sich schlecht mit DB - Geschichten     Ich hab zwar jetzt D6pro, trotzdem immer noch keine Ahnung von DB. Aber ich würd trotzdem wieder Textdateien nehmen, da ich diese schneller erstellen kann.
 Mfg Frank_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
 (Murphy)
 |  |  |  
| fladimir Hält's aus hier
 Beiträge: 12
 
 
 
 
 | 
Verfasst: Fr 29.04.05 11:13 
 
Hallo,
 habe gerade versucht einen Serienbrief zu erstellen. Leider erhalte ich beim Versuch das Programm auszuführen folgenden Fehler:
 [Error] UMain.pas(41): Undeclared identifier: 'EmptyParam'
 und ein paar mal [Error] UMain.pas(41): Types of actual and formal var parameters must be identical
 
 Bin leider noch relativ neu und würde mich über Tips freuen.
 Benutze übrigens Delphi6.
 
 Danke und Gruß
 Matthias
 |  |  |  
| retnyg 
          Beiträge: 2754
 
 SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
 Delphi 5, Delphi 7
 
 | 
Verfasst: Fr 29.04.05 11:33 
 
du musst erst die word komponente auf deinem formular plazieren.
 hier der genaue link zu dem von hansa erwähnten tutorial: www.delphi-tutorials...als/o2k_tutorial.zip_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
 in der regel haben diese leute die regel...
 |  |  |  
| fladimir Hält's aus hier
 Beiträge: 12
 
 
 
 
 | 
Verfasst: Fr 29.04.05 11:36 
 
Hallo,
 habe die Datein runtergeladen und das Projekt geladen. Dennoch diese Fehlermeldung. Das ist ja das was ich daran nicht verstehe. Benutze die Projektdatei aus dem Archiv.
 
 Gruß
 Matthias
 |  |  |  
| fladimir Hält's aus hier
 Beiträge: 12
 
 
 
 
 | 
Verfasst: Fr 29.04.05 11:52 
 
Hallo,
 das Problem hat sich erledigt.
 Kleine Ergänzung des variablenTeils um Emptyparm: OleVaraint;.
 
 Erhalte allerdings jetzt die Fehlermedung Typenkonflikt, nachdem ich auf den Knopf gedrückt und eine Datei ausgewählt habe.
 
 Gruß
 Matthias
 |  |  |  
| retnyg 
          Beiträge: 2754
 
 SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
 Delphi 5, Delphi 7
 
 | 
Verfasst: Fr 29.04.05 11:53 
 
versuch mal in deiner uses klausel oleCtrls hinzuzufügen.
die word-application komponente findest du im reiter "server"
 _________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
 in der regel haben diese leute die regel...
 |  |  |  
| fladimir Hält's aus hier
 Beiträge: 12
 
 
 
 
 | 
Verfasst: Fr 29.04.05 11:58 
 
Hallo,
 Application ist auf From schon vorhanden. Die ergänzung von olectrls bringt keine änderung.
 Immernoch Typenkonflikt.
 |  |  |  
| retnyg 
          Beiträge: 2754
 
 SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
 Delphi 5, Delphi 7
 
 | 
Verfasst: Fr 29.04.05 12:47 
 
mein post bezog sich auf deine vorletzte meldung mit emptyparam
ohne genäuere hinweise zu deinem typenkonflikt kann dir niemand helfen.
 poste mal deinen source
 _________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
 in der regel haben diese leute die regel...
 |  |  |  
| fladimir Hält's aus hier
 Beiträge: 12
 
 
 
 
 | 
Verfasst: Fr 29.04.05 15:25 
 
Hallo,
 habe das erste Problem zwar gelöst und Word startet jetzt mit der Datei die ich anwähle.
 Allerdings erhalte ich folgenden Fehler:
 Eolexception "Das angeforderte Objekt ist nicht verfügbar" und er springt an folgende Stelle im Quellcode:
 Mail.Destination := wdSendToNewDocument;
 Hoffe Ihr könnt mir helfen.
 Danke schonmal und Gruß
 Matthias
 Hier die Quelle
 			Moderiert von									| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 
 | unit UMain;
 interface
 
 uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Word2000, OleServer, OleCtrls;
 
 type
 TForm1 = class(TForm)
 WordApplication1: TWordApplication;
 WordDocument1: TWordDocument;
 Button1: TButton;
 OpenDialog1: TOpenDialog;
 procedure Button1Click(Sender: TObject);
 private
 
 public
 
 end;
 
 var
 Form1: TForm1;
 
 implementation
 
 {$R *.DFM}
 
 procedure TForm1.Button1Click(Sender: TObject);
 var
 FileName, NewFile  : OleVariant;
 Mail : MailMerge;
 Pause     : OleVariant;
 
 begin
 if OpenDialog1.Execute then
 FileName:=OpenDialog1.FileName
 else
 exit;
 NewFile := ExtractFilePath(FileName)+'Brief.doc';
 WordApplication1.Connect;
 WordApplication1.Documents.OpenOld(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
 EmptyParam, EmptyParam, EmptyParam, EmptyParam);
 
 WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
 WordApplication1.Visible := True;
 Pause := True;
 Mail := WordDocument1.MailMerge;
 Mail.Destination := wdSendToNewDocument;
 Mail.Execute(Pause);
 ShowMessage('Fertig');
 WordDocument1.Close;
 WordDocument1.Disconnect;
 end;
 
 end.
 |   Gausi: Delphi-Tags hinzugefügt. |  |  |  
| Keldorn 
          Beiträge: 2266
 Erhaltene Danke: 4
 
 Vista
 D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
 
 | 
Verfasst: Fr 29.04.05 16:54 
 
	  | Zitat: |  	  | Eolexception "Das angeforderte Objekt ist nicht verfügbar" und er springt an folgende Stelle im Quellcode:
 
 | 
 welche Office-Version nutzt du, word 2002 oder WordXP?
 Öffne ein Serienbriefdokument per Hand im Word, erscheint eine Meldung über eine SQL-Verbindung, dann gugg hier:
mypage.bluewin.ch/re.../MMData.htm#MMData10
 
support.microsoft.co...scid=kb;en-us;825765 Mfg Frank_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
 (Murphy)
 |  |  |  
| fladimir Hält's aus hier
 Beiträge: 12
 
 
 
 
 | 
Verfasst: Fr 29.04.05 19:07 
 
Hallo,
 danke!
 Problem gelöst!
 
 Gruß
 Matthias
 |  |  |  |