كيفية تنفيذ دمج المراسلات في Word باستخدام OLE و ODBC

ملخص

توضح هذه المقالة كيفية استخدام "التنفيذ التلقائي OLE" لإنشاء دمج المراسلات في Microsoft Office Word 2003 باستخدام بيانات من Visual FoxPro (VFP) لجدول Windows.

مزيد من المعلومات

أدناه هو التعليمات البرمجية Visual FoxPro ل Windows باستخدام طراز الكائن Word.Application الذي يقوم بإجراء عملية دمج المراسلات استخدام مصدر بيانات ODBC لجدول Visual FoxPro موجود. استخدام اسم مصدر بيانات (DSN) موجود في إدارة برنامج تشغيل ODBC، إنشاء هذه التعليمات البرمجية أو إنشاء واحد بشكل فوري استخدام استدعاء API لإضافة واستخدام DSN. في المثال التالي، يتم إنشاؤها في إدارة برامج تشغيل ODBC DSN "Visual FoxPro الجداول" ويشير إلى المجلد \Samples\Data الموجود في المجلد الرئيسي VFP. الأرجح أن يكون هذه المسارات تغيير لعكس المسارات الخاصة بالمستخدمين.


ملاحظة: تم اختبار هذه التعليمات البرمجية مع خدمة الإصدار-1 (sr-1) لبرنامج Microsoft Office Word 2003 و Word 97. يؤدي استخدام إصدارات سابقة من Word 97 الأخطاء OLE الأخرى و "عدم تطابق النوع".


إنشاء برنامج وقم بإدخال التعليمات البرمجية التالية:
  ***/ 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 /***


المراجع

للحصول على معلومات إضافية حول كيفية الحصول على إصدار Word لخدمة 97 Windows 1 (sr-1)، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف ل Microsoft":

172475 كيفية الحصول على وتثبيت MS Office 97 sr-1

Microsoft Visual Basic للتطبيقات تعليمات (كلمة ' 97)؛ البحث عن "OLE"
خصائص

رقم الموضوع: 181926 - آخر مراجعة: 21‏/01‏/2017 - المراجعة: 1

تعليقات