Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fernsteuerung von Word (https://www.delphipraxis.net/27979-fernsteuerung-von-word.html)

MaxMara 18. Aug 2004 07:01


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:
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;
Hat jemand von euch eine schnellere Lösung für mich bzw. einen Tipp was ich da machen könnte?

Vielen Dank und Grüße aus Wien
Christian.

BTW: Happy Birthday Daniel :party:

Keldorn 18. Aug 2004 07:24

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

MaxMara 18. Aug 2004 07:45

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?

CelloUndCo 18. Aug 2004 07:45

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

Keldorn 18. Aug 2004 11:23

Re: Fernsteuerung von Word
 
Zitat:

Zitat von MaxMara
Danke.
Das klingt schon mal gut. Nur: Wie erstellt man in Delphi die Datenquelle?

Du kannst in word auch gleich eine Datenbank als Datenquelle nehmen. Da ich mit Datenbanken aber 0,nix am Hut habem kann ich dir hier nicht weiterhelfen. Ich habe immer alles in Textdateien gespeichert und diese als Datenquelle genutzt. Die Datei habe ich in einem festen Verzeichnis gespeichert und diese Datei im Worddoc zugewiesen.
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:

Und wie gibt man diese dann in Word an?
Bei den Serienbriefen ist ein assistent dabei, kann man nix großartig verkehrt machen

Zitat:

Hast du da einen Link für mich?
nein, leider nicht.

Mfg Frank

MaxMara 18. Aug 2004 12:10

Re: Fernsteuerung von Word
 
Ich hab jetzt gerade folgendes hier entdeckt, was mir ein wenig weiterhilft:Serienbrief mit DBF
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:
  Word.ActiveDocument.MailMerge.OpenDataSource(
     Name:= '',
     Connection:= 'DSN=AdressenDSN;DATABASE=adressen;uid=root;pwd=;',
     SQLStatement:= 'SELECT * FROM Adressen where adr_cou_id <> 153',
     SubType:= 'wdMergeSubTypeWord2000');
Dann bringt er mir folgenden Fehler beim Ausführen:

---------------------------
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 :)

MaxMara 19. Aug 2004 10:32

Re: Fernsteuerung von Word
 
Bräuchte immer noch Hilfe. :oops:

Aktueller Stand der Dinge ist folgender:
Delphi-Quellcode:
    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);
Es sieht so aus, als ob ihm der conString komplett egal wäre und er nur nach dieser Test1.odc gehen würde.
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 :)

Keldorn 19. Aug 2004 10:39

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

MaxMara 19. Aug 2004 11:23

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. :(

Hansa 19. Aug 2004 11:39

Re: Fernsteuerung von Word
 
Zitat:

Zitat von MaxMara
Ich muss leider die DataSource jedesmal neu definieren, weil das Query immer anders ist (das WHERE ändert sich immer).

Sobald du Parameter in der Query einsetzt ist es aber nicht mehr dumm. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz