![]() |
Fernsteuerung von Word
Hallo Leute.
Ich habe derzeit ein kleines Problem mit Word und Delphi 7. Ich möchte über meine Delphiapplikation einen Datenbankquery (ich verwende die MyComponents) machen und das Ergebnis davon als Adressetiketten in Word ausgeben. Das ganze funktioniert zwar, aber nur ziiiiemlich langsam. Im Endeffekt sollen immer so ca. 9000 Etiketten ausgegeben werden, dass würde dann in etwa 1 Stunde dauern bis alles im Worddokument drinnen ist. Das ganze sieht so aus:
Delphi-Quellcode:
Hat jemand von euch eine schnellere Lösung für mich bzw. einen Tipp was ich da machen könnte?
procedure TForm1.Button1Click(Sender: TObject);
var FileName, ov : OleVariant; AdrStr : String; Counter,Anzahl : Integer; begin with MySQLDataset1 do begin ClearMacros; TableName := 'adr_adressen'; MacroByName('JOIN').AsString := 'INNER JOIN adr_countries ON (adr_adressen.adr_cou_id = adr_countries.cou_id)'; MacroByName('WHERE').AsString := 'WHERE adr_kat1_id like "%bc%"'; MacroByName('ORDER').AsString := 'order by adr_countries.cou_name, adr_adressen.adr_plz'; open; end; Anzahl := MySQLServer1.DatasetFrom('Select count(*) as MyMenCount from adr_adressen WHERE adr_kat1_id like "%bc%"','MyCount').FieldByName('MyMenCount').AsInteger; MySQLServer1.FreeDataset('MyMenCount'); Progressbar1.Max := Anzahl; Progressbar1.Step := 1; if OpenDialog1.Execute then FileName:=OpenDialog1.FileName else exit; WordApplication1.Connect; WordApplication1.Documents.OpenOld(FileName, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); WordDocument1.ConnectTo(WordApplication1.ActiveDocument); Counter := 1; WordApplication1.Visible := true; while not MySQLDataset1.Eof do begin AdrStr := MySQLDataset1.FieldByName('adr_anrede').AsString + ' ' + MySQLDataset1.FieldByName('adr_titel').AsString + Chr(13); if (MySQLDataset1.FieldByName('adr_vorname').AsString = '') and (MySQLDataset1.FieldByName('adr_nachname').AsString = '') then AdrStr := AdrStr + MySQLDataset1.FieldByName('adr_institut').AsString + Chr(13) else AdrStr := AdrStr + MySQLDataset1.FieldByName('adr_vorname').AsString + ' ' + MySQLDataset1.FieldByName('adr_nachname').AsString + Chr(13); AdrStr := AdrStr + MySQLDataset1.FieldByName('adr_strasse').AsString + Chr(13) + MySQLDataset1.FieldByName('adr_plz').AsString + ' ' + MySQLDataset1.FieldByName('adr_ort').AsString; WordApplication1.Selection.TypeText(AdrStr); if MySQLDataset1.FieldByName('adr_cou_id').AsInteger <> 153 then begin AdrStr := Chr(13) + MySQLDataset1.FieldByName('cou_name').AsString; WordApplication1.Selection.Font.Bold := integer(True); WordApplication1.Selection.TypeText(AdrStr); WordApplication1.Selection.Font.Bold := integer(False); end; If counter <> 3 then WordApplication1.Selection.Cells.Item(1).Next.Select; If Counter = 3 then begin ov := 1; WordApplication1.Selection.InsertRowsBelow(ov); Counter := 0; end; MySQLDataset1.Next; Counter := Counter + 1; Progressbar1.StepIt; end; WordApplication1.Disconnect; MySQLDataset1.Close; end; Vielen Dank und Grüße aus Wien Christian. BTW: Happy Birthday Daniel :party: |
Re: Fernsteuerung von Word
Hallo
ich würde mal versuchen, die Daten nicht direkt ins Word zu schreiben sondern über einen serienbrief/Etikettendruck zu gehen.Im Word das Dokument anlegen, in Delphi die Datenquelle erstellen und dann nur das Worddok aufrufen und den Serienbrief starten. Mfg Frank |
Re: Fernsteuerung von Word
Danke.
Das klingt schon mal gut. Nur: Wie erstellt man in Delphi die Datenquelle? Und wie gibt man diese dann in Word an? Hast du da einen Link für mich? |
Re: Fernsteuerung von Word
du solltest auch nicht immer von Wordapplication1 los referenzieren.
Mach dir ein _document oder selection oder besser noch eine Range von der aus du weggehst, das spart bei der Automation über OLE viel Zeit lg, Toni |
Re: Fernsteuerung von Word
Zitat:
es war mir nicht gelungen, die Datenquelle zur Laufzeit zuzuweisen, vielleicht geht das mit einer Datenbank als Datenquelle besser oder es lag an den älteren Serverkompos, wer weiß. Gugg dir in de VB-Hilfe das mailmerge-object an, da ist das alles beschrieben. Auch was du für Möglichkeiten hast. Vorteil wäre für mich: Du hast mit den Serienbriefen eine bessere Layoutmöglichkeit, da du das Grundgerüst mit allen Formatierungen im Word erstellst und von Delphi nur die Daten bereitstellst. Wenn was geändert werden soll, brauchst du nur das Word-doc zu ändern, nicht den code, das kann z.B. auch eine fremde Person sein, die deinen code nicht hat. Zitat:
Zitat:
Mfg Frank |
Re: Fernsteuerung von Word
Ich hab jetzt gerade folgendes hier entdeckt, was mir ein wenig weiterhilft:
![]() Wenig deshalb, weil ich das ganze für ne MySQL DB brauche und keine Ahnung habe wie ich bei OpenDataSource die MySQL-DB als Source angeben kann. Hab mir schon die VB-Hilfe angeschaut, aber die ist (wie alles bei VB? :wink:) sehr kryptisch. Das hier hab ich gefunden:
Delphi-Quellcode:
Dann bringt er mir folgenden Fehler beim Ausführen:
Word.ActiveDocument.MailMerge.OpenDataSource(
Name:= '', Connection:= 'DSN=AdressenDSN;DATABASE=adressen;uid=root;pwd=;', SQLStatement:= 'SELECT * FROM Adressen where adr_cou_id <> 153', SubType:= 'wdMergeSubTypeWord2000'); --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Project1.exe ist eine Exception der Klasse EOleSysError aufgetreten. Meldung: 'Typkonflikt'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- Also wenn jemand darüber mehr Ahnung als ich haben sollte: bitte melden :) |
Re: Fernsteuerung von Word
Bräuchte immer noch Hilfe. :oops:
Aktueller Stand der Dinge ist folgender:
Delphi-Quellcode:
Es sieht so aus, als ob ihm der conString komplett egal wäre und er nur nach dieser Test1.odc gehen würde.
conString:= 'DRIVER={MySQL ODBC 3.51 Driver};DESC=;DATABASE=adressen;SERVER=localhost;UID=root;PASSWORD=;PORT=;OPTION=;STMT=;';
SQLStatement:= 'SELECT adr_adressen.* FROM adr_adressen where adr_adressen.adr_cou_id <> 153'; Word.ActiveDocument.MailMerge.OpenDataSource('C:\Dokumente und Einstellungen\leitner\Desktop\adressenproject\Ausdrucken\test1.odc',EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,conString,EmptyParam); Das SQLStatement darf ich überhaupt nicht im OpenDataSource anführen, sonst bleibt Word stehen :( Danke nochmals. lg Christian edit: hab nen BR gemacht, damit das Layout nicht zerstört wird :) |
Re: Fernsteuerung von Word
Hallo
beiß dich daran erstmal nicht fest. Probier das erstmal im Word, speichere deine datenbank ab und weise dieses datei dann im word als datenquelle zu. Ich weiß ja nicht, was du mit deinem programm vorhast, wenn es nur auf deinem rechner laufen soll, reicht das auch. Die eingestellte datenquelle bleibt dir im word erhalten, du mußt diese nicht unbedingt von delphi aus jedesmal zuweisen. Du kannst so zumindestens erstmal probieren, ob es dir überhaupt was bringt. Mfg Frank |
Re: Fernsteuerung von Word
Ich muss leider die DataSource jedesmal neu definieren, weil das Query immer anders ist (das WHERE ändert sich immer).
Das ist leider das dumme an dieser Sache. :( |
Re: Fernsteuerung von Word
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz