Autor |
Beitrag |
jamany
      
Beiträge: 73
|
Verfasst: Sa 15.03.03 15: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 13: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 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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.
_________________ Gruß
Hansa
|
|
jamany 
      
Beiträge: 73
|
Verfasst: So 16.03.03 12: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 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
@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 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.
_________________ Gruß
Hansa
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 17.03.03 00: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 09: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 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  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 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
|
|
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: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 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
Hält's aus hier
Beiträge: 12
|
Verfasst: 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
      
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: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 12: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 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
_________________ 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 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
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.
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Fr 29.04.05 17: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 20:07
Hallo,
danke!
Problem gelöst!
Gruß
Matthias
|
|
|