AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fernsteuerung von Word

Ein Thema von MaxMara · begonnen am 18. Aug 2004 · letzter Beitrag vom 19. Aug 2004
Antwort Antwort
Seite 1 von 2  1 2      
MaxMara

Registriert seit: 27. Apr 2004
Ort: Wien
77 Beiträge
 
Delphi 2007 Enterprise
 
#1

Fernsteuerung von Word

  Alt 18. Aug 2004, 07:01
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
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Fernsteuerung von Word

  Alt 18. Aug 2004, 07:24
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
MaxMara

Registriert seit: 27. Apr 2004
Ort: Wien
77 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Fernsteuerung von Word

  Alt 18. Aug 2004, 07:45
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?
  Mit Zitat antworten Zitat
CelloUndCo

Registriert seit: 6. Aug 2004
Ort: Wien
9 Beiträge
 
#4

Re: Fernsteuerung von Word

  Alt 18. Aug 2004, 07:45
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
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: Fernsteuerung von Word

  Alt 18. Aug 2004, 11:23
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
MaxMara

Registriert seit: 27. Apr 2004
Ort: Wien
77 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Fernsteuerung von Word

  Alt 18. Aug 2004, 12:10
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? ) 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
  Mit Zitat antworten Zitat
MaxMara

Registriert seit: 27. Apr 2004
Ort: Wien
77 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Fernsteuerung von Word

  Alt 19. Aug 2004, 10:32
Bräuchte immer noch Hilfe.

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
  Mit Zitat antworten Zitat
Keldorn

Registriert seit: 6. Mär 2003
Ort: Meißen
876 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Fernsteuerung von Word

  Alt 19. Aug 2004, 10:39
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

Lükes Grundlage der Programmierung:
Es wird nicht funktionieren
(Murphy)
  Mit Zitat antworten Zitat
MaxMara

Registriert seit: 27. Apr 2004
Ort: Wien
77 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Fernsteuerung von Word

  Alt 19. Aug 2004, 11:23
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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#10

Re: Fernsteuerung von Word

  Alt 19. Aug 2004, 11:39
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.
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