Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WORD Seriendruckdatenquelle (https://www.delphipraxis.net/56793-word-seriendruckdatenquelle.html)

MPirnstill 11. Nov 2005 10:30


WORD Seriendruckdatenquelle
 
Hi Leute,

ich weiß nicht, ob ich die Frage hier stellen darf, da es nur indirekt mit der Programmierung zu tun hat.

Indirekt deshalb, da ich mit meinem Programm Steuerdateien (Datenquelle) für MS-WORD Serienbriefe erstelle. Wir benutzen hier Word 2003. Ich schicke den Seriendruck mit der entspr. Steuerdatei direkt vom Programm über Word zum Drucker. Dieser Teil funktioniert auch. :thumb: Jedoch biete ich dem Anwender die Möglichkeit die Steuerdatei nur zu Erstellen, damit der hinterher das Serienbrief-Dokument manuell mit Word öffnen kann, ändern kann und dann selbst zum Drucker schicken kann.

Beim manuellen Öffnen des Serienbriefes fragt Word, ob es die Daten aus der Steuerdatei selektieren soll. Dabei wird die Steuerdatei mit absolutem Pfad angezeigt und natürlich auch an dem entspr. Ort erwartet. Die Steuerdatei schreibe ich immer in das gleiche Verzeichnis, wo auch das Serienbrief-Dokument liegt. Wenn das Programm und damit auch die Briefe auf den Rechnern in unterschiedlichen Verzeichnissen installiert wird, paßt diese Zuordung der Datenquelle nicht, da das Serienbrief-Dokument sich immer den absoluten Pfad merkt. :gruebel:

Ich hatte schon eine Lösung mittel Autoopen-Makro gefunden, jedoch machen mir da unsere Systemadmins mit der Makro-Sicherheit einen Strich durch die Rechnung. :wall:

Kann man Word irgendwie sagen, gibt es irgendwo eine Option oder einen Registry-Eintrag, daß Word sich nur den relativen Pfad merkt, da meine Steuerdatei immer im gleichen Verzeichnis liegt, in dem auch das Serienbrief-Dokument liegt? :?:

Gruß

P.S.: Oder kennt einer ein gutes Forum, wo man Word-Fragen los werden kann.

Flocke 11. Nov 2005 10:53

Re: WORD Seriendruckdatenquelle
 
Habe hier gerade ein ähnliches Problem ... aber auch per Makro will Word die Steuerdatei erst öffnen (und findet sie natürlich nicht) - erst danach könnte ich den Pfad ändern.

Die Eigenschaft MailMerge.DataSource.ConnectString ist ein "normaler" Datenquellen-String, und mit MailMerge.OpenDataSource kann man auch mit einer ODBC-Datenquelle verbinden. Diese DSN würde dich dann unabhängig vom absoluten Pfad machen.

MPirnstill 11. Nov 2005 10:59

Re: WORD Seriendruckdatenquelle
 
Zitat:

Zitat von Flocke
Die Eigenschaft MailMerge.DataSource.ConnectString ist ein "normaler" Datenquellen-String, und mit MailMerge.OpenDataSource kann man auch mit einer ODBC-Datenquelle verbinden. Diese DSN würde dich dann unabhängig vom absoluten Pfad machen.

Erstmal danke für die schnelle Antwort.

Das hört sich gut an. Weise ich darüber das Verzeichnis oder dirket die Steuerdatei zu? Wenn direkt die Steuerdatei würde das bedeuten, daß ich für jede Steuerdatei eine eigene DSN brauche?

Gruß

Flocke 11. Nov 2005 11:40

Re: WORD Seriendruckdatenquelle
 
Wenn du mehrere Datenquellendateien brauchst, dann wird es etwas schwieriger. Das Problem ist ja, dass du Einstellung in Word nicht ändern kannst (Makro kommt zu spät)

Dann könntest du unter "HKCU\Software\ODBC\ODBC.INI\<Deine DSN>\..." jeweils den aktuellen Pfad eintragen, BEVOR du Word aufrufst.

Sprich:

1. Du richtest dir auf deinem Rechner eine ODBC-Datenquelle ein, die auf die Seriendruck-Datenquelle verweist (z.B. eine Access-Datei).

2. Du änderst die Word-Vorlage so ab, dass sie nur diese ODBC-Datenquelle benutzt. Das geht über "Datenquelle öffnen" (Toolbar) und dann den Button "Neue Quelle...".

3. BEVOR du Word startest, trägst du in die Registry die benötigten Daten ein (z.B. Pfad und Dateiname).

Du kannst natürlich auch die DSN direkt komplett in die Registry eintragen, dann muss dies bei der Installation nicht geschehen.

Code:
HKEY_CURRENT_USER
  Software
    ODBC
      ODBC.INI
        ODBC Data Sources
          <Deine DSN>  REG_SZ  "Microsoft Access-Treiber (*.mdb)"
        <Deine DSN>
           DBQ         REG_SZ  Kompletter Pfad zur MDB
           Description REG_SZ  ... (siehe Registry)
           Driver      REG_SZ  ...
           FIL         REG_SZ  ...
           PWD         REG_SZ  ...
           UID         REG_SZ  ...

MPirnstill 14. Nov 2005 07:08

Re: WORD Seriendruckdatenquelle
 
Hi!

Die Idee finde ich super. Und auch gut beschrieben. :thumb:
Nur kann man sich beim Anwender nicht darauf verlassen, daß die nach dem Aufruf der Funktion "Erstellen" (nur Erstellen der Steuerdatei) auch gleich in Word gehen und das Serienbrief-Dokument aufrufen bzw. teilweise werden in einem Arbeitsablauf mehrere Steuerdateien erstellt und dann wäre in dem Fall nur die zuletzt erstellte zugewiesen.
Wie gesagt, wenn ich Word direkt aus meinem Programm aufrufe übergebe ich dabei auch direkt den Steuerdateinamen mit kompletten Pfad. Das funktioniert auch super. :mrgreen:

Ich glaube, ich muß wenn ich nur die Steuerdatei erstelle (hier wurde Word bislang noch nicht benötigt), trotz allem Word mit der Steuerdatei aufrufen und diese Einstellung in Word speichern. Damit hätte ich sichergestellt, daß Word egal in welchem Verzeichnis ich das Serienbrief-Dokument öffne. Ich hasse MS-WORD. :kotz: MS ist mir immer zu "schlau"! Und zu neugierig. :wiejetzt: z.B. frage ich mich wofür sich das blöde Word-Dokument auch weiterhin die alten Datenquellen merkt, wenn ich eine neue Datenquelle zuweise. Nur so als kleine Anmerkung.

Naja, Danke nochmal. Bis denne' :cheers:

P.S.: Mit welchem Befehl könnte ich den Word-Serienbrief starten, so daß der Drucken-Dialog angezeigt wird und auf eine Bestätigung durch den Anwender wartet. So hatte nämlich, die vorher installierte Version Wort 97 reagiert. Word 2003 jedoch rauscht mit dem gleichen Aufruf wie unter 97 gleich durch?

Keldorn 14. Nov 2005 19:25

Re: WORD Seriendruckdatenquelle
 
Hallo

welchen Aufruf verwendest du denn?

Mfg Frank

MPirnstill 15. Nov 2005 09:21

Re: WORD Seriendruckdatenquelle
 
Zitat:

Zitat von Keldorn
welchen Aufruf verwendest du denn?

Hi Frank!

Da ich bei diesem Projekt leider noch auf Delphi 2.0 festhänge, kann ich leider nicht diese tollen Application-Server-Komponenten verwenden. Also erzeuge ich ein OLE-Objekt:

Delphi-Quellcode:
aMsWord := CreateOleObject('Word.Basic');
Den Seriendruck starte ich dann mit folgender Routine:

Delphi-Quellcode:
procedure TfrmVorSel.starteSeriendruck(aMSWord: Variant; aDokument, aSteuerdatei: String);
var
  OLEFormat: Cardinal;
  OLEConfirmConversions: Variant;
  OLEReadOnly: Variant;
  OLELinkToSource: Variant;
  OLEAddToRecentFiles: Variant;
  OLEPasswordDocument: Variant;
  OLEPasswordTemplate: Variant;
  OLERevert: Variant;
  OLEWritePasswordDocument: Variant;
  OLEWritePasswordTemplate: Variant;
  OLEConnection: Variant;
  OLESQLStatement: Variant;
  OLESQLStatement1: Variant;
begin
  try
    if Daten then
    begin
      aMSWord.Visible := False;                   //Word sichtbar
      aMSWord.Documents.Open(aDokument);          //Dokument öffnen
      // Steuerdatei neu einbinden
      OLEFormat                := $00000005;;    //wdOpenFormatText
      OLEConfirmConversions    := False;
      OLEReadOnly              := False;
      OLELinkToSource          := True;
      OLEAddToRecentFiles      := False;
      OLEPasswordDocument      := '';
      OLEPasswordTemplate      := '';
      OLERevert                := False;
      OLEWritePasswordDocument := '';
      OLEWritePasswordTemplate := '';
      OLEConnection            := '';
      OLESQLStatement          := '';
      OLESQLStatement1          := '';
      aMSWord.ActiveDocument.MailMerge.OpenDataSource(aSteuerdatei,
                                                      OLEFormat,
                                                      OLEConfirmConversions,
                                                      OLEReadOnly,
                                                      OLELinkToSource,
                                                      OLEAddToRecentFiles,
                                                      OLEPasswordDocument,
                                                      OLEPasswordTemplate,
                                                      OLERevert,
                                                      OLEWritePasswordDocument,
                                                      OLEWritePasswordTemplate,
                                                      OLEConnection,
                                                      OLESQLStatement,
                                                      OLESQLStatement1);
      //Destination hat 4 Konstanten zur Auswahl:
      //   wdSendToNewDocument(0),
      //   wdSendToPrinter(1),
      //   wdSendToEmail(2),
      //   wdSendToFax (3),
      aMSWord.ActiveDocument.MailMerge.Destination := 1; //wdSendToPrinter(1)
      aMSWord.ActiveDocument.MailMerge.Execute;
    end;//if Daten
  except
    on E:Exception do
      ShowMessage(LoadStr(isDruck));
  end;
end;
Das paradoxe an der ganzen Sache ist, daß mit Word 2003 (aktuell im Einsatz befindliche Version) läuft das Programm wie es ursprünglich mal angedacht war. Nämlich "Drucken" klicken und ratzfatz raus damit. Dies hatte damals unter Word 97 merkwürdigerweise nicht funktioniert und es Word zeigt vor jedem Serienbrief den Druckdialog und wartete auf Bestätigung. Dies haben die Anwender genutzt, den Druckvorgang unterbrochen, Brief ändern und weiterdrucken. Daran haben sich die Anwender gewöhnt
und wollen es verständlicherweise gern wiederhaben.
Das Ding ist, ich habe Aufruf nicht geändert, nur die Word-Version ist von 97 auf 2003 gestiegen. Und jetzt habe keine Ahnung wie ich es drehe, daß die ihren Dialog wiederbekommen.

Wäre schön, wenn du mir da helfen könntest.

Gruß

P.S.: Ich hatte, daß heute alles schon mal geschrieben, mußte dann etwas anderes erledigen und als ich weitermachen wollte, bin ich aus dem 'Posting'-Modus oder wie man das nennen soll, rausgeflogen.

Flocke 15. Nov 2005 09:26

Re: WORD Seriendruckdatenquelle
 
Du könntest zwei Dinge ausprobieren (hast du aber bestimmt schon gemacht):

1. Nimm "wdSendToNewDocument" und schließe dann das Ursprungsdokument wieder - die Anwender müssen dann nur noch auf "Drucken klicken". Allerdings müssen Sie die Änderungen dann in jedes Dokument einbauen.

2. Lass das "MailMerge.Execute" weg - das sollte denselben Effekt haben wie in Word den Abbrechen-Knopf zu drücken.

MPirnstill 16. Nov 2005 09:00

Re: WORD Seriendruckdatenquelle
 
Zitat:

Zitat von Flocke
Du könntest zwei Dinge ausprobieren (hast du aber bestimmt schon gemacht):

1. Nimm "wdSendToNewDocument" und schließe dann das Ursprungsdokument wieder - die Anwender müssen dann nur noch auf "Drucken klicken". Allerdings müssen Sie die Änderungen dann in jedes Dokument einbauen.

2. Lass das "MailMerge.Execute" weg - das sollte denselben Effekt haben wie in Word den Abbrechen-Knopf zu drücken.

Hi Flocke!

Danke für deine Tipps.

Punkt 1 ist jedoch aus den von dir selbst genannten Punkt nicht praktikabel. :(

Punkt 2 habe ich ausprobiert. Habe auch "Visible := True" gesetzt, damit man Word sieht. Das scheint zu funktionieren. Wenn ich den/die Serienbriefe anstoße, bleibt Word mit dem entspr. Dokument geöffnet (sofern mein closeWord entspr. steuere) und der Anwender kann schalten und walten. Und anschließend den Seriendruck in Word selbst starten. :thumb:

Danke noch mal. :-D :cheers:

Ich liebe dieses Forum. Manchmal die einzige Hilfe, die man als "Einzelkämpfer" hat.

:cheers: :cheers: :cheers: :cheers: :cheers: :cheers: :cheers: :dancer: :dancer2: :dancer: :dancer2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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