Seriendruck in Word mit OLE und ODBC automatisieren

Zusammenfassung

Dieser Artikel veranschaulicht die OLE-Automatisierung verwenden, um einen Seriendruck in Microsoft Office Word 2003 mit Daten aus einer Visual FoxPro (VFP) für Windows-Tabelle erstellen.

Weitere Informationen

Unten ist der Visual FoxPro für Windows Code Word.Application-Objektmodell, das den Seriendruck führt eine ODBC-Datenquelle zu einer vorhandenen Visual FoxPro-Tabelle verwenden. Diesen Code kann einen vorhandenen Datenquellennamen (DSN) erstellt der ODBC-Treiber-Manager oder eine dynamisch mit einem API-Aufruf hinzufügen und den DSN erstellen. Im folgenden Beispiel "Visual FoxPro Tables" ist der DSN erstellt der ODBC-Treiber-Manager und zeigt auf den Ordner \Samples\Data im Basisordner VFP. Diese Pfade müssen wahrscheinlich die Benutzer Pfade entsprechend geändert werden.


Hinweis Dieser Code wurde mit den Service Release 1 (SR-1) für Word 97 und Microsoft Office Word 2003. Frühere Versionen von Word 97 wird ein Typenkonflikt und andere OLE-Fehler.


Erstellen Sie ein Programm, und geben Sie den folgenden Code:
  ***/ Begin program code /***   * Code to create a new data source to a VFP table.
*
* Use the Declare DLL function to prototype the
* SQLConfigDataSource function.
* Using SQLConfigDataSource prevents having to go into
* the ODBC Driver Manager and create the DSN.

***


IF VAL(SUBSTR(VERSION(4),2,1))>7
lthemes=_screen.Themes
_screen.Themes=.f.
ENDIF

DECLARE Integer SQLConfigDataSource in odbccp32.dll Integer, ;
Integer, String, String

***
* Create a string containing the settings appropriate to the driver.
* The following is an example for the Microsoft VFP ODBC driver
* accessing the Customer.dbf file.
***

*** Change the path below to point to the Customer table ***
*** in the \Samples\Data folder. ***
settings="DSN=visual foxpro tables"+chr(0)+;
"Description=VFP ODBC Driver"+chr(0)+;
"SourceDB=e:\vfp7\samples\data"+chr(0)+;
"SourceType=DBF"
=SQLConfigDataSource(0,1,"Microsoft Visual FoxPro Driver",settings)

* NOTE: Ensure there are no spaces on either side of the equal sign (=).

ON ERROR DO errhand WITH ERROR(), MESSAGE(), MESSAGE(1), PROGRAM( ),
LINENO( ) && Trap OLE & other errors.

* Initialize variables passed to Word to create form letter.
intro1="Congratulations! You are one of our best customers since you have ;
purchased $"
intro2=" each month from us. "
intro3="As a result, your maximum order amount has been increased by ;
$2500.00. If you have any questions, please feel free to contact us."

oWord = CREATEOBJECT("Word.Application")
WITH oWord
* Assign values to variables
dsname="e:\VFP7\SAMPLES\DATA\customer.DBF"
wformat=0
wconfirmconv=0
wreadonly=0
wlinktosource=0
waddtofilelist=0
wpassworddoc=""
wpasswordtemp=""
wrevert=0
wprotectdoc=""
wprotecttemp=""
wconn="DSN=visual foxpro tables;uid=;pwd=;"+;
"sourcedb=e:\vfp7\samples\data;sourcetype=dbf"+;
"exclusive=no;backgroundfetch=yes;collate=machine;"
wsqlstatement="SELECT contact,company,title,address,city,;
postalcode,STR(maxordamt,12,2) as maxordamt FROM customer ;
WHERE (customer.maxordamt>$100000)"

.Visible=.T. && Make Word visible.
.WindowState = 2 && Minimize Word.


.Documents.Add && Add new document.
.Selection.InsertParagraphAfter

.ActiveDocument.MailMerge.OpenDataSource;
(dsname,wformat,wconfirmconv,wreadonly,wlinktosource,;
waddtofilelist,wpassworddoc,wpasswordtemp,wrevert,;
wprotectdoc,wprotecttemp,wconn,wsqlstatement)
.ActiveDocument.MailMerge.EditMainDocument
.Selection.InsertDateTime("dddd, MMMM dd, yyyy", 1)
.Selection.MoveRight
.Selection.InsertParagraphAfter
.Selection.MoveDown
.ActiveDocument.MailMerge.Fields.Add;
(oWord.Selection.Range,"contact")
.Selection.InsertParagraphAfter
.Selection.MoveDown
.ActiveDocument.MailMerge.Fields.Add;
(oWord.Selection.Range,"company")
.Selection.InsertParagraphAfter
.Selection.MoveDown
.ActiveDocument.MailMerge.Fields.Add;
(oWord.Selection.Range,"title")
.Selection.InsertParagraphAfter
.Selection.MoveDown
.ActiveDocument.MailMerge.Fields.Add;
(oWord.Selection.Range,"address")
.Selection.InsertAfter(", ")
.Selection.MoveRight
.ActiveDocument.MailMerge.Fields.Add(oWord.Selection.Range,"city")
.Selection.InsertAfter(" ")
.Selection.MoveRight
.ActiveDocument.MailMerge.Fields.Add;
(oWord.Selection.Range,"postalcode")
.Selection.MoveRight
.Selection.InsertParagraphAfter
.Selection.InsertParagraphAfter
.Selection.InsertAfter("Dear ")
.Selection.MoveRight
.ActiveDocument.MailMerge.Fields.Add;
(oWord.Selection.Range,"contact")
.Selection.MoveRight
.Selection.InsertAfter(":")
.Selection.MoveRight
.Selection.InsertParagraphAfter
.Selection.InsertParagraphAfter
.Selection.MoveDown
.Selection.InsertAfter(intro1)
.Selection.MoveRight
.ActiveDocument.MailMerge.Fields.Add;
(oWord.Selection.Range,"maxordamt")
.Selection.MoveRight
.Selection.InsertAfter(intro2)
.Selection.MoveRight
.Selection.InsertAfter(intro3)
.Selection.MoveRight
.Selection.InsertParagraphAfter
.Selection.InsertParagraphAfter
.Selection.MoveDown
.Selection.InsertAfter("Thank you,")
.Selection.MoveRight
.Selection.InsertParagraphAfter
.Selection.InsertParagraphAfter
.Selection.MoveDown
.Selection.Fields.Add(oWord.Selection.Range,-1,"author")
.ActiveDocument.MailMerge.Destination = 0 && new document.
.ActiveDocument.MailMerge.Execute && Run the merge.
nanswer = MESSAGEBOX("Would you like to view the finished ;
document?",36,"Switch to Word")
DO CASE
CASE nanswer = 6
.ActiveWindow.View.Type = 3 && Page layout view.
.Visible = .T.
.Application.Activate && Bring Word forward.
.WindowState = 0 && Word in normal state.
=INKEY(5) && Wait 5 seconds then bring VFP back.
.WindowState = 2 && Then minimize Word.
ENDCASE
nanswer = MESSAGEBOX("Print the document?",36,;
"Print the merged document.")
DO CASE
CASE nanswer = 6 && Yes
.ActiveDocument.PrintOut && Print the merged form letter.
ENDCASE

nanswer = MESSAGEBOX("Save the document?",36,;
"Enter the name to save the merged document.")
DO CASE
CASE nanswer = 6 && Yes
cbaddoc=SPACE(25)
DO WHILE .T.
DEFINE WINDOW getname FROM 1,1 TO 15,60 ;
FONT 'COURIER NEW',10 FLOAT GROW ZOOM
ACTIVATE WINDOW getname
cdoc=SPACE(25)
mquit = SPACE(1)
IF !EMPTY(cbaddoc)
@2,1 SAY "Existing file name: "+cbaddoc COLOR R+/w
ENDIF
@4,1 SAY "Enter a name for the Word document."
@5,1 GET cdoc color b/w VALID emptyChk(cdoc)
@7,25 GET mquit FUNCTION '*T Save' SIZE 2,10
READ CYCLE
CLEAR WINDOW getname
cdoc=ALLTRIM(cdoc)
cpath= .Options.DefaultFilePath(0) && Get Word's
&& default document path.
IF FILE(cpath+"\"+cdoc+".doc")
WAIT WINDOW "Document already exists! Enter another ;
file name." TIME 1
cbaddoc=cdoc
LOOP
ELSE
.ActiveDocument.SaveAs(cdoc)
ENDIF
.Documents.Close(0)
.Application.Quit
EXIT
ENDDO
CASE nanswer = 7 && No
.Documents.Close(0)
.Application.Quit
ENDCASE
ENDWITH

ON ERROR && Restore system error handler.
IF VAL(SUBSTR(VERSION(4),2,1))>7
_screen.Themes=lthemes
endif

PROCEDURE emptychk
PARAMETER pcdoc
IF !EMPTY(pcdoc)
RETURN .T.
ELSE
WAIT WINDOW "Enter a name for the Word Document"
RETURN 0
ENDIF

PROCEDURE errhand
PARAMETER merror, mess, mess1, mprog, mlineno
CLEAR
IF merror=1426
mlineno=LTRIM(STR(LINENO()))
merror=LTRIM(STR(merror))
=MESSAGEBOX("You have an OLE error. Usually this is caused by
quitting Word or canceling out of a dialog box in Word. "+CHR(13)+;
"The error message is "+mess)
ELSE
mlineno=LTRIM(STR(LINENO()))
merror=LTRIM(STR(merror))
=MESSAGEBOX("An error occured on line "+mlineno+;
". The error message is "+mess+" The error number is "+merror)
ENDIF
ON ERROR
RETURN
***/ End program code /***


Referenzen

Weitere Informationen zu Word für Windows 97 Service Release 1 (SR-1) klicken Sie auf die folgenden Artikelnummer der Microsoft Knowledge Base:

So erhalten und installieren Sie MS Office 97 SR-1 172475

Microsoft Visual Basic for Applications-Hilfe (Word ' 97) "OLE" Suchen
Eigenschaften

Artikelnummer: 181926 – Letzte Überarbeitung: 23.01.2017 – Revision: 1

Feedback