AGB  ·  Datenschutz  ·  Impressum  







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

moderne Word-Anbindung

Ein Thema von baumina · begonnen am 17. Sep 2014 · letzter Beitrag vom 19. Sep 2014
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 08:02
Wie ich oben schon kurz geschrieben habe, ist meine momentane Vorgehensweise folgendermaßen:

In meinem Adressprogramm kann ich auswählen, welche Adressen entladen werden sollen. Diese werden in eine (vom Anwender auswählbare) Accesstabelle geschrieben, die wiederum als Datenquelle in verschiedenen Worddokumenten hinterlegt ist.

Doch wie ein Anwender halt so ist, er öffnet ein Worddokument mit hinterlegter Serienbrieffunktion, sucht sich dort aus den Serienbrief-Daten eine Adresse her und meckert mich dann an, warum das denn noch die alte Adresse sei, er hätte ja schließlich gerade eben im Adressprogramm die neue Adresse eingegeben. Oder das Worddokument ist mit der "falschen" Datenquelle verbunden; leider sieht man im Word nicht so einfach von welcher Datenquelle denn nun die Daten kommen.

Da es irgendwie nichts "moderneres" gibt, bin ich jetzt am überlegen, ob ich nicht immer parallel zu meiner Datenbank eine Accesstabelle mit allen Adressen führe und aktuell halte. Für einen Rundbrief à la Weihnachtspost lasse ich die Funktion zum Entladen ausgewählter Adressen so wie sie ist.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (18. Sep 2014 um 08:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 09:32
Ich habe schon mal eine Applikation geschrieben die Word Automation benutzt und Daten aus einer DB in Word einsetzt.
Die Word Dokumente enthalten Platzhalter mit #Platzhaltername# gekennzeichnet.
Somit kann man beliebige Platzhalter definieren und benötigt keine Serienbrieffunktion von Word.

Ich habe die "Microsoft Office 2000 Beispiele..." unter "Packages installieren" aktiviert und arbeite mit dem Word200 OLE Objekt, das funktioniert auch mit Word2013.

Hier einige Code-Auszüge:
Code:
//******************************************************************************
//***************** Word öffnen ************************************************
//******************************************************************************
Procedure ConnectToWord(sichtbar: Boolean);
Var
  wFalse, TempFile: OleVariant;
  Ziel, Dateiname: String;

Begin
  wFalse := False;
  { Check if file exists }
  If Not FileExists(Filename) Then
    Begin
      ShowMessage('Das Dokument ist nicht vorhanden');
      Exit;
    End;

  With Form1 Do
    Begin

      Try
        If (Not aktiv('Word.Application')) Then
          Begin
            WordOpen := False;
          End;
        WordApplication1.Connect;
      Except
        Showmessage('Word konnte nicht gestartet werden');
        exit;
      End;
      If WordOpen Then
        WordDocument1.Close(wFalse);

      If Aendern Then
        Begin
          // Kopie von Worddatei anlegen und damit arbeiten bei Replace
          Dateiname := FrmVerwaltungBriefe.BGrid.Cells[2, StrToInt(BriefIndex)];
          Ziel := AppPath + '$TempDoc.doc';
          Tools.CopyFile(Dateiname, Ziel);
          TempFile := Ziel;
          WordApplication1.Documents.OpenOld(TempFile, wFalse, wFalse, wFalse,
            EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam);
        End
      Else
        // Wenn 'Brief laden' aufgerufen wurde, dann mit Orginaldatei arbeiten
        WordApplication1.Documents.OpenOld(FileName, wFalse, wFalse, wFalse,
          EmptyParam, EmptyParam, wFalse, EmptyParam, EmptyParam, EmptyParam);

      WordDocument1.ConnectTo(WordApplication1.ActiveDocument);
      WordApplication1.Visible := sichtbar;
      WordOpen := True;
      //WordApplication1.Activate;
    End;

End;

//******************************************************************************
//***************** Word Beenden ***********************************************
//******************************************************************************
Procedure WordBeenden;
Begin
  With Form1 Do
    Begin
      If WordOpen Then
        Begin
          Try
            WordApplication1.Quit;
            WordApplication1.Disconnect;
          Except
          End;
        End;
    End;
End;

//******************************************************************************
//***************** Word Replace Funktion **************************************
//******************************************************************************
{
  Diese Funktion startet eine Word versteckte Instanz, öffnet eine Datei und
  ersetzt (alle) Vorkommen von "SearchString" durch "ReplaceString".
  Die Funktion ist ähnlich zur StringReplace() Funktion.
}

Procedure Word_StringReplace(SearchString, ReplaceString: String; ReplaceAll: Boolean);
Const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
Var
  _Search, _Replace, _Wrap, _ReplaceAll, F, T: OLEVariant;

Begin
//  Application.ProcessMessages;
 { Initialisiere Parameter}
  If ReplaceAll Then
    _ReplaceAll := wdReplaceAll
  Else
    _ReplaceAll := wdReplaceOne;

  _Search := SearchString;
  _Replace := ReplaceString;
  _Wrap := wdFindContinue;
  F := False;
  T := True;
  { Perform the search}
  //FindText,Case,WholeWord,WildChars,SoundsLike,AllWordForms,Forward,Wrap,ReplaceWith,ReplaceTyp
  Form1.WordApplication1.Selection.Find.ExecuteOld(
    _Search, F, T, F, F, F, T, _Wrap, F, _Replace, _ReplaceAll);
//  Application.ProcessMessages;
End;

//******************************************************************************
//**********************        Formulare       *******************************
//******************************************************************************

//******************************************************************************
//********************** Replace Brief ausgeben ********************************
//******************************************************************************
Procedure BriefReplace;
Var
  i: Integer;

Begin
//  Application.ProcessMessages;

  Word_StringReplace('#Adr_Anrede#', Form1.QKundenAnrede.Text, True);
  Word_StringReplace('#Adr_Vorname#', Form1.QKundenVorname.Text, True);
  Word_StringReplace('#Adr_Name#', Form1.QKundenName.Text, True);
  Word_StringReplace('#Adr_Strasse#', Form1.QKundenStrasse.Text, True);
  Word_StringReplace('#Adr_PLZ#', Form1.QKundenPLZ.Text, True);
  Word_StringReplace('#Adr_Ort#', Form1.QKundenOrt.Text, True);
  Word_StringReplace('#GebDatum#', Form1.QKundenGebDatum.Text, True);

  For i := 1 To FrmFelder.Grid.RowCount - 1 Do
    Begin
      Word_StringReplace('#' + WordFeld[i].Name + '#', WordFeld[i].Text, True);
    End;

  Application.ProcessMessages;
End;
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#13

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 10:12
Da es irgendwie nichts "moderneres" gibt, bin ich jetzt am überlegen, ob ich nicht immer parallel zu meiner Datenbank eine Accesstabelle mit allen Adressen führe und aktuell halte. Für einen Rundbrief à la Weihnachtspost lasse ich die Funktion zum Entladen ausgewählter Adressen so wie sie ist.
Also bevor ich darüber nachdenken täte, diese Synchronisation irgendwie gegen Access zu machen (scheinbar über die Delphianwendung), würde ich aber eher ODBC installieren. GGf programmatisch über Deine bestehende Anwendung.
In Access würde ich dann die entscheidenen Tabellen verknüpfen oder als Passthrough Queries zur Verfügung stellen. Die sind dann automatisch immer aktuell, ohne dass man einen Finger krumm machen muss.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 10:22
Klingt gut, bis auf den Mist mit dem ODBC. Mein Adress-Programm muss nicht installiert werden. Auf den Firmen-PCs wird einfach nur die exe gestartet, die auf dem Netz liegt.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#15

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 10:44
Klingt gut, bis auf den Mist mit dem ODBC. Mein Adress-Programm muss nicht installiert werden. Auf den Firmen-PCs wird einfach nur die exe gestartet, die auf dem Netz liegt.
Ja, ok, ich meinte aber, dass Dein Access Programm ggF. die ODBC Installation durchführen könnte- falls Ihr viele Systeme habt- ist natürlich auch eine Rechtefrage.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 10:53
ja, das scheitert definitiv an den Rechten.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#17

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 11:08
Ach so, die Benutzer haben irgend eine Word-Datei, die mit irgend einer Access-DB verbunden ist und wundern sich dann, das da noch die alten Daten drinstehen. Das stimmt, das ist blöd. Aber dafür können die Benutzer nichts, das ist dir ja sicherlich klar, sondern das Konzept.

Ich verstehe aber nicht ganz, was Du unter 'modern' verstehst. Modern wäre vielleicht, keine mySQL zu nehmen, sondern ein Microsoft-Produkt, wie den SQL-Server. Da wird dann kein ODBC-Treiber benötigt.

Modern wäre es sicherlich, im Netz einen Ordner für die Word-Vorlagen und -briefe bereitzustellen und einfach zu bestimmen, das nur mit Vorlagen aus diesem Ordner sichergestellt ist, das alles funktioniert, denn dort sind dann die Word-Briefe mit den aktuellen Datenbanken verknüpft, sei es Access oder ein SQL-Server.

Modern ist es auch, den Anwendern klarzumachen, wie das alles funktioniert, sich nicht wundern müssen, wenn sie sich etwas eigenes zurechtschustern, und Probleme nun mal auftreten, wenn sie eine lokale Kopie der Adressliste nehmen.

Ich finde nichts schlimm daran, eine externe Adressliste synchron zu pflegen. Da kann man dann auch mal die Liste und den Serienbrief als Nachweis archivieren. Oder extern einen Abgleich (Deduplication, Record linking) durchführen und die Änderungen dann zurückspielen etc.

Perfekt wäre natürlich eine nichtredundante Vorhaltung aller Daten in einer zentralen Datenbank. Aber perfekt geht nun einmal nicht immer.
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 11:21
Modern wäre vielleicht, keine mySQL zu nehmen, sondern ein Microsoft-Produkt, wie den SQL-Server. Da wird dann kein ODBC-Treiber benötigt.
Auch ein interessanter Aspekt. Nur nochmal sicherheitshalber nachgefragt: Word kann als Serienbrief-Datenquelle ohne OBDC auf eine MS-SQL-Datenbank zugreifen?

EDIT: Ahja, denke ich habs gefunden... Datenverbindungs-Assistent : Microsoft SQL Server.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (18. Sep 2014 um 11:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#19

AW: moderne Word-Anbindung

  Alt 18. Sep 2014, 21:08
Könnte es sein, daß da ein Mißverständnis vorliegt?
Ohne eine Schnittstelle (ob ODBC,ADO oder was auch immer) kann Word,Access,Excel nicht mit einer Datenbank umgehen. Natürlich ist die Anbindung von MS-Produkten etwas einfacher zu realisieren als z.B. Oracle. Aber das Prinzip ist immer das gleiche.
Mir ist allerdings immer noch nicht klar, warum Du Dich gegen ODBC sträubst. Gut das ist vllt. nicht diiie Lösung aber ist eigentlich (nach meiner Erfahrung) die Lösung mit dem geringsten Aufwand.

Perfekt wäre natürlich eine nichtredundante Vorhaltung aller Daten in einer zentralen Datenbank. Aber perfekt geht nun einmal nicht immer.
Das halte ich nicht für perfekt, sondern für richtig. Es mag sein, daß so eine "Zwischentabelle" als integraler Bestandteil eines Programms manchmal die Arbeit erleichtert, aber sobald wie in diesem Fall die Daten "irgendwann" einmal synchronisiert werden, ist das tödlich.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: moderne Word-Anbindung

  Alt 19. Sep 2014, 07:47
Ich ging irgendwie davon aus, dass meine momentane Vorgehensweise, die inzwischen auch schon seit über 10 Jahren so ist, nicht mehr so ganz auf dem heutigen Stand wäre. Doch wie ich den Beiträgen hier so entnehme, scheint die allgemeine Vorgehensweise auch heute noch über die Serienbrieffunktion von Word zu gehen. Ich hatte erwartet, dass mir jemand sagt, "jaaaaa, früher hat man das mal so gemacht, heute macht man das ja doch eher so...."
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 21:13 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