Seite 1 von 2

Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 10:57
von Wolfgang_B
Guten Morgen,
selbst auf die Gefahr hin, daß dieses Thema schon irgendwie im Forum behandelt wurde (ich fand zumindest nichts Passendes), hier das Problem.

Ich möchte Word Vorlagen (Word 2010, 2013) automatisch mit Daten aus XBase ausfüllen.

Konkret, aus einer Kundenmaske mit Stammdaten sollen je nach Fall Word-Vorlagen aufgerufen werden und Adressdaten oder andere Daten aus XBase (dbf oder Array) automatisch in das Word-Formular eingetragen werden. Geht das mit vernünftigem Aufwand und wie?

Danke und Gruß
Wolfgang

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 11:06
von Martin Altmann
Moin Wolfgang,
ich mache das als Seriendruck. Ich erstelle eine .rtf-Datei als Seriendruckdokument (aus dem Programm heraus) und dazu passend eine .csv-Datei, die die einzelnen Felder enthält.
Dann kann der Kunde das Seriendruckdokument in Word (das nach dem Erstellen der beiden Dateien automatisch geöffnet wird) ganz bequem mit den dort vorhandenen Funktionalitäten (sortieren, Filtern, Druck in neue Datei oder auf Drucker,...) nutzen.
Braucht kein ActiveX

Viele Grüße,
Martin

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 11:47
von brandelh
In den Beispielen gibt es eines, das ein Formular mit Platzhaltern ausfüllt und speichert, drucken wäre kein Problem:

...\XPPW32\source\samples\activex\msword\feed.prg

Die nutzen "Bookmarks", was sehr sicher ist, dass man nicht das falsche ersetzt.

Ich habe schon in Word Dokumenten nach einem bestimmten Begriff gesucht und diesen ersetzt, aber da kann es zu Verwechslungen kommen, also aufpassen.
So setze ich z.B. in HTML Dokumenten Felder ein {{NAME}} ... das sollte eindeutig sein ;-)

Ein Beispiel dazu und eines mit Standard Drucker habe ich - eventuell sogar in der Wissensdatenbank :D

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 11:50
von brandelh
Nein, war nur als Anfrage 3 Zeilen unter deiner ;-)

Suchen und Ersetzen in Word - hat das jemand schon gemacht ?

Wenn du das Suchen und Ersetzen willst, kann ich das bei Gelegenheit zusammenstellen, aber die Bookmarks sind der Standardweg

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 14:46
von Wolfgang_B
Hallo Martin,
danke für die schnelle Antwort.

Wie bringst Du dem .rtf Dokument bei, daß es ein Serienbrief ist?

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 14:50
von Wolfgang_B
Hallo Hubert,

"suchen und Ersetzen" wird nicht nötig sein. Es reicht, wenn man in ein WORD-Formular z.B. die Adresse und ein paar Daten übergeben kann. Notfalls kann man auch Token (was ja auch im Prinzip Platzhalter sind) setzen ...

Gruß Wolfgang

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 14:53
von Wolfgang_B
...\XPPW32\source\samples\activex\msword\feed.prg

sieht auch gut aus ... Schaue ich mir auch an ..

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 15:03
von Martin Altmann
Wolfgang,
.rtf ist ja ein reines Textformat. Ähnlich wie HTML mit entsprechendem Befehlssatz ausgerüstet. Du musst in dem Aufbau (den Metadaten) des Dokumentes einfach hinterlegen, dass es sich um ein Seriendokument handelt und den Namen der Datei mit den Datensätzen und die Abfrage mitgeben.
Als Stichworte dafür sollten Dir mailmerge, mmdatasource, mmconnectstrdata, mmquery und dann die Felddefintionen mittels MERGEFIELD helfen.
Wenn Du möchtest, kann ich dir auch gerne das ganze per PN als Beispiel senden (Du könntest Dir aber auch einen Serienbrief mit dazugehöriger Quelle unter WinWord bauen und als .rtf speichern und anschauen).
Die Doku dazu findest Du hier: https://de.wikipedia.org/wiki/Rich_Text_Format - am unteren Ende sind dann als Weblinks die Verweise zur ausführlichen Microsoft-Doku aufgeführt.

Viele Grüße,
Martin

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 17:04
von Wolfgang_B
Martin, vielen Dank. Schau ich mir an. Bin im Augenblick KO. Habe gerade das Verspachteln von 20qm Trockenbau über Kopf hinter mir ...

Gruß Wolfgang

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Do, 11. Jan 2018 18:17
von Martin Altmann
Oje!
Dann solltest du mit uns zur Langen Saunanacht mitkommen vor unserem Treffen in Osnabrück Anfang Februar - viel Entspannung und gutes Essen!

Viele Grüße,
Martin

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Fr, 12. Jan 2018 7:58
von Herbert
Martin Altmann hat geschrieben: Do, 11. Jan 2018 11:06 Moin Wolfgang,
ich mache das als Seriendruck. Ich erstelle eine .rtf-Datei als Seriendruckdokument (aus dem Programm heraus) und dazu passend eine .csv-Datei, die die einzelnen Felder enthält.
Dann kann der Kunde das Seriendruckdokument in Word (das nach dem Erstellen der beiden Dateien automatisch geöffnet wird) ganz bequem mit den dort vorhandenen Funktionalitäten (sortieren, Filtern, Druck in neue Datei oder auf Drucker,...) nutzen.
Braucht kein ActiveX
Ja, diese Methode ist schnell und effektiv.

Alternativ kann in Word mit Textfeldern gearbeitet werden. Hat aber Nachteile: Dieser Prozess ist in Word langsam, also nur bei wenigen Feldern sinnvoll und jedes Feld kann mit demselben Namen nur einmal vorkommen.
Ich arbeite mit eigenen Feldern "<Adresse1>", also mit diesen Zeichen umhüllt. Dadurch kann ich die normalen Ersetz-Funktionen brauchen.
Achtung: die Schlüsselworte müssen hier in einem Guss geschrieben werden, da Word bei Korrekturen Textmarken hineinsetzt und den Suchtext nicht mehr findet.

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Fr, 12. Jan 2018 14:18
von Wolfgang_B
Danke an alle...

Martin, wann wäre das denn in Osnabrück?

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Fr, 12. Jan 2018 14:21
von Jan
Wolfgang,

am 10. Februar.

Jan

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Fr, 12. Jan 2018 14:22
von Martin Altmann
Wie ich dir bereits per SMS geschrieben hatte: am 10.02.
Am Abend davor geht es wieder in die Sauna (gegen 16:30 Uhr)

Viele Grüße,
Martin

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Fr, 12. Jan 2018 16:00
von Wolfgang_B
Martin, SMS stimmt. Bei meiner exzessiven Handybenutzung glatt übersehen. :D

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: So, 14. Jan 2018 17:32
von Wolfgang_B
Hallo Hubert,
ich hab das Beispiel mal ausprobiert. Funktioniert ja ganz ordentlich. Das einzige was mich stört ist, daß man im Word-Dokument die Textmarken nicht mehr mit Namen sieht, sondern nur []. Das ist relativ doof. Lt. Google gibt es auch keine Möglichkeit, außer einem Makro (Makros haben meine Kunden standardmäßig deaktivert).

...\XPPW32\source\samples\activex\msword\feed.prg

Martin
Die Methode mit .rtf habe ich noch nicht kapiert. Ich will, daß der Kunde ein Word-Dokument anlegen kann mit den "Platzhaltern" die dann beim Aufruf aus XBASE durch Daten aus XBase ersetzt werden. Ich habe z.B. einen Briefbogen als .rtf. Den kann ich natürlich aufrufen, aber wie kriege ich die Daten da hinein ...

Herbert
Wie bringst Du Word das Ersetzen von <xxx> per Programm bei?

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: So, 14. Jan 2018 18:10
von HaPe
Hallo Wolfgang !
ch habe z.B. einen Briefbogen als .rtf. Den kann ich natürlich aufrufen, aber wie kriege ich die Daten da hinein ...
Wenn du die RTF-Datei mit einem Programmier-Editor wie Notepad++ anschaust, kannst du alles lesen.
Mit MemoRead in eine StringVariable einlesen, dann mit STRTRAN deine Platzhalter mit den aktuellen Werten aus der Steuer-Tabelle ersetzten. Dann wieder mit MemoWrit auf in die RTF-Datei schreiben.

Wie bringst Du Word das Ersetzen von <xxx> per Programm bei?
Durch Automation von Word.
Schau dir dazu dieses Beispiel von Alaska an:
Xbase20\Beispiele\Samples\activex\msword\feed.prg

Alternativ:
Dazu die Platzhalter mittels Select() markieren und mit TypeText(txText) den aktuellen Text einfügen.
Hier gibts VBA-Beispiele:
https://msdn.microsoft.com/de-de/librar ... -snippet-1

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: So, 14. Jan 2018 18:11
von Martin Altmann
Wolfgang,
in meinem Fall lege ich das Dokument an, indem ich die .rtf-Datei aus meinem Programm heraus erzeuge - nicht mein Kunde.
Wenn Dein Kunde das Steuerdokument (welches die Feldnamen als Steuersatzfelder enthält) selber erstellt, hast du es doch noch einfacher: du brauchst doch nur eine .csv-Datei mit den Datensätzen erzeugen, die er dann für sein Seriendruckdokument als Steuersatzdatei auswählt. Dann kann er die dort definierten Felder (=Spaltenüberschriften) auswählen und einsetzen.

Viele Grüße,
Martin

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: So, 14. Jan 2018 19:17
von azzo
Hallo,
ich arbeite heute schon den ganzen Tag an einem ähnlichen Problem.
Ich muss formatierten Text mit Bildern in WORD einfügen.
Ich poste hier einen Link.

https://github.com/jgm/pandoc/issues/3883

Mit diesem Lösungsansatz konnte ich das Problem lösen.

Lg
Otto

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Mo, 15. Jan 2018 7:44
von Koverhage
Wolfgang,
wenn Du die als Textmarken angelegt hast, müssen die zu sehen sein, oder Du hast eine nicht so tolle Möglichkeit gewählt.
1. Du kannst Textmarken anlegen, deren Namen nicht angezeigt werden. Einfügen->Textmarke. Hier ist der Name der Textmarke einzugeben der Name erscheint aber nicht im Dokument.
2. Du kannst Textmarken anlegen, deren Namen im Dokument angezeigt werden. Den Namen der Textmarke in das Dokument schreiben, dann markieren und
Einfügen->Textrmarke. In den [] sthet dann Dein Name der Textmarke. ( so mache ich das)
Beispiel:
2018-01-15_074236.jpg
2018-01-15_074236.jpg (8.9 KiB) 15129 mal betrachtet

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Mo, 15. Jan 2018 9:40
von Rolf Ramacher
worauf du achten musst- schriftformatierung muss gleich sein auch mit den Klammern

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Mo, 15. Jan 2018 10:08
von brandelh
Wenn man Suchen & Ersetzen aus Word nutzen will, kann man einfach seine Platzhalter selbst erfinden, grundsätzlich geht jeder Text, aber Vorsicht: es wird dann alles ersetzt ;-)

WordReplace() = habe ich aus dem Word-Macro-Quellcode übersetzt.

Code: Alles auswählen

#include "activex.ch"
#include "word2010.ch"

// https://msdn.microsoft.com/de-de/vba/word-vba/articles/find-execute2007-method-word


//////////////////////////////////////////////////////////////////////
// Main()-Prozedur der Anwendung
//////////////////////////////////////////////////////////////////////
PROCEDURE main
  LOCAL cDir,cFile, cSaveAs
  LOCAL oWord,oDoc, aReplace, lPrint

  lPrint := .t.

  set charset to ansi

  aReplace := { { "{NAME}"  , "Testmann" }, { "{VNAME}"  , "Hans" }  } // jedes Feld einzeln
  
  // im Word-Text dann diese Platzhalter nutzen: {NAME}, {VNAME}, etc.

  set alternate to Ersetzen-LOG.TXT
  set alternate on

  // Ermitteln des voll-qualifizierten Pfades
  // oder fix vorgeben
  cDir    := CurDrive()+":\"+CurDir()
  cFile   := cDir+"\Test.docx"
  cSaveAs := cDir+"\Test1.docx"

  // Erzeugen einer ActiveX-Komponente
  oWord := CreateObject("Word.Application")
  IF Empty( oWord )
    MsgBox( "Microsoft Word ist nicht installiert" )
  ENDIF

  oWord:visible := .T.

  // Oeffnen eines Word-Dokuments
  oWord:documents:open( cFile )
  oDoc := oWord:ActiveDocument

  aEval( aReplace, {|aR| WordReplace(oWord,aR[1],aR[2]) } )

  // Speichern des Ergebnisses
  IF(ValType(cSaveAs)=="C")
    oDoc:saveas(cSaveAs)
  ENDIF

  IF(ValType(lPrint)=="L" .AND. lPrint)
    oDoc:PrintOut()
  ENDIF

  // Schliessen des Dokuments und zerstoeren das
  // ActiveX-Objektes.
  oDoc:close()
  oWord:Quit()
  oWord:destroy()

  ? "Dokument", cSaveAs, "erzeugt"

  set alternate to



  inkey(20)

RETURN

function WordReplace(oWord,cVon,cNach)
   local oSel, lOK
  oSel := oWord:selection
  oSel:Find:ClearFormatting()
  oSel:Find:Replacement:ClearFormatting()

  lOK := oSel:Find:Execute(  cVon,;   // FindText
                              .f.,;   // MatchCase
                              .f.,;   // MatchWholeWord
                              .f.,;   // MatchWildcards
                              .f.,;   // MatchSoundsLike
                              .f.,;   // MatchAllWordForms
                              .t.,;   // Forward
                   wdFindContinue,;   // Wrap
                              .f.,;   // Format
                            cNach,;   // ReplaceWith
                     wdReplaceAll,;   // Replace
                              .f.,;   // MatchKashida
                              .f.,;   // MatchDiacritics
                              .f.,;   // MatchAlefHamza
                              .f.  )  // MatchControl

  ? "ersetze",cVon,cNach, lOK

return lOK

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Mo, 15. Jan 2018 10:10
von brandelh
PS: RTF-Format, wenn man dies aus Word heraus erzeugt und nachher dann den Text ändert, kann es passieren, dass die Schlüsselwörter durch Formatierungstexte getrennt werden.
Mit DOTX oder DOXC ist mir das noch nie passiert.

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Di, 06. Feb 2018 11:21
von Wolfgang_B
Hallo Hubert,
habe Deine Funktionen mal getestet. Funktionieren prima - Danke!

Noch 3 Fragen ..
1. Was bedeutent eigentlich in der Funktion -> WordReplace(oWord,cVon,cNach) die ganzen Parameter? cvon und cnach ist klar, aber die anderen?
2. Kann man eigentlich damit auch sowas wie einen Serienbrief aufsetzen? zB. Wenn man Einladungen oder Ähnliches erzeugen will.
3. Kann man auch irgendwie eine Tabelle einfügen z.B. für Rechnungen?

Noch einen schönen sonnigen Tag
Gruß Wolfgang

Re: Daten aus XBASE in Word übergeben (Adresse)

Verfasst: Di, 06. Feb 2018 11:50
von brandelh
Hi,
1. Was bedeutent eigentlich in der Funktion -> WordReplace(oWord,cVon,cNach) die ganzen Parameter? cvon und cnach ist klar, aber die anderen?
du meinst wahrscheinlich die Parameter die intern hier genutzt werden:

Code: Alles auswählen

// https://msdn.microsoft.com/de-de/vba/word-vba/articles/find-execute2007-method-word
  lOK := oSel:Find:Execute(  cVon,;   // FindText
                              .f.,;   // MatchCase
                              .f.,;   // MatchWholeWord
                              .f.,;   // MatchWildcards
                              .f.,;   // MatchSoundsLike
                              .f.,;   // MatchAllWordForms
                              .t.,;   // Forward
                   wdFindContinue,;   // Wrap
                              .f.,;   // Format
                            cNach,;   // ReplaceWith
                     wdReplaceAll,;   // Replace
                              .f.,;   // MatchKashida
                              .f.,;   // MatchDiacritics
                              .f.,;   // MatchAlefHamza
                              .f.  )  // MatchControl
das sind die Parameter von Word-VBA für Suchen ... wie auch im Word Suchen Dialog.
MatchCase = Beachte Groß-/Kleinschreibung
MatchWholeWord = nur ganze Worte vergleichen
MatchWildcards = Gibt es Wildcards z.B. * ...
MatchSoundsLike = Phonetische Suche (also nach Lauten)
MatchAllWordForms = .... bin mir nicht ganz sicher, alle Worte finden ?
Forward = Suche vorwärts
wdFindContinue,; // Wrap => wenn man hinten ankommt, vorne neu beginnen bis nix mehr gefunden wird.
Format => nur die Formatierung suchen
cNach,; // ReplaceWith => Ersetzen
wdReplaceAll,; // Replace => hier alle Fundstellen ersetzen
MatchKashida => keine Ahnung
MatchDiacritics => keine Ahnung
MatchAlefHamza => keine Ahnung
MatchControl => keine Ahnung
2. Kann man eigentlich damit auch sowas wie einen Serienbrief aufsetzen? zB. Wenn man Einladungen oder Ähnliches erzeugen will.
Ich gehe immer hin und erstelle ein Macro in Word von den Aktionen die ich möchte und versuche dann den VBA Code zu übersetzen.
Grundsätzlich geht alles
3. Kann man auch irgendwie eine Tabelle einfügen z.B. für Rechnungen?
im Prinzip ja, wie bei 2. - ich habe das aber nicht gemacht.