Entwickler-Ecke
Sonstiges (Delphi) - Serienbrief und automatisch drucken
jamany - Sa 15.03.03 15:39
Titel: Serienbrief und automatisch drucken
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?
Keldorn - Sa 15.03.03 19: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
hansa - So 16.03.03 01: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.
jamany - So 16.03.03 12:59
Titel: Druck starten
Ich verwende folgenden Code zum Erstellen eines Serienbriefes:
Delphi-Quelltext
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 - So 16.03.03 21: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 :cry:
@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
Delphi-Quelltext
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.
hansa - So 16.03.03 22: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.
Keldorn - So 16.03.03 22: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
hansa - Mo 17.03.03 00:31
Zitat: |
wie machst du das bei dir mit der Datenquelle |
Ohh, muß das notfalls rauskramen. 8) Das war aber das einfachste von allem. Lese Dir mal Lemmies Tutorials durch. Da hat er ziemlich genau beschrieben, wie so was geht.
http://www.delphi-tutorials.de
bis11 - Mo 17.03.03 09:27
Hi,
warum macht Ihr euch das alle so umständlich mit Textdateien etc. Nehmt einfach den SourceCode aus unserem wunderschönen
FAQ [
http://www.delphi-forum.de/viewtopic.php?t=7676] und schon habt Ihr einen Serienbrief mit Word erstellt.
Keldorn - Mo 17.03.03 09: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 :wink: 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
fladimir - Fr 29.04.05 12: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
fladimir - Fr 29.04.05 12: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 - Fr 29.04.05 12: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 - Fr 29.04.05 12:53
versuch mal in deiner uses klausel oleCtrls hinzuzufügen.
die word-application komponente findest du im reiter "server"
fladimir - Fr 29.04.05 12:58
Hallo,
Application ist auf From schon vorhanden. Die ergänzung von olectrls bringt keine änderung.
Immernoch Typenkonflikt.
retnyg - Fr 29.04.05 13: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
fladimir - Fr 29.04.05 16: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
Delphi-Quelltext
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. |
Moderiert von
Gausi: Delphi-Tags hinzugefügt.
fladimir - Fr 29.04.05 20:07
Hallo,
danke!
Problem gelöst!
Gruß
Matthias
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!