*cText = " 6200 South Syracuse Street, Suite 150"+chr(13)+; * " Englewood, CO 80111"+chr(13)+; * " TEL: (303) 221-2000 FAX: (303) 221-3000" * use filename && calls for a database set textmerge on set textmerge delimiters to go top oWorg=createobject("word.basic") && Create just one instance scan @ 10,10 say " Processing rec # -->"+str(recno()) set textmerge to D:PCLTEST.PRT noshow additive && Better use fullpath TEXT <<i>> 6200 South Syracuse Street, Suite 150 Englewood, CO 80111 TEL: (303) 221-2000 FAX: (303) 221-3000 ENDTEXT set textmerge to * cVar = ltrim(str(recno()))+chr(13)+cText WITH oWorg .filenew("d:\pcltest\test1.doc") && file created and to be used as an "overlay" is template * Instead of textmerge - here directly using insert is better, * if data in memo or assigned to cVar it's easier to print with one insert * .insert(cVar) * Then only .fileprint .FILEPRINT(1,1,0,"d:\pcltest\pcltest.prt",,,,,,,,1,,) .fileclose(2) && Close w/o save endwith if recno() > 999999 && If 999999 is really needed exit endif endscan oWorg.appclose && Close word * oWorg.fileexit(2) && Same RELEASE ALL****************
************************************************** * Start of code ************************************************** PUBLIC oWordDocument *** set the LOCALEID to English nlLocaleId=sys(3004) && Save local id =sys(3006,1033) && We will be sending instructions in English wait window nowait "Creating Word Document..." && Inform user oWordDocument=createobject("word.basic") && Create word object with oWordDocument * Remove the rem if you want the user see what's going on in word * .appshow && Show word app - Word 7.0 support .filenewdefault && New file, default template - Will create datasource cDSN = "DSN=Visual FoxPro Tables;UID=;PWD=;" cSourceDb = "SourceDB=C:\Program Files\vfp50\SAMPLES\DATA\Testdata.dbc" cSourceType = ";SourceType=DBC;" cOther = "Exclusive=No;BackgroundFetch=No;Collate=Machine;" cSQLStatement = "SELECT recno() as rcno,* FROM customer" * Insertdatabase parms build here for clarifying * 35,511 are autoformatting options for grid - ignore * 0 Link to source false .InsertDatabase(35,511,0, ; cDSN+cSourceDb+cSourceType+cOther, ; cSQLStatement,,,,,,,1) .filesaveas("c:\temp\xxmmergedoc",0) && Save as a word doc for mailmerge .fileclose(1) && Close saving * Datasource ready, now create mailmerge main document .filenew("c:\temp\prttest.doc") && New file based on prttest (Logo in header - address in footer) * If you have a document template with logo in header&footer etc use it else .filenewdefault .MailMergeOpenDataSource("xxmmergedoc.doc") && Set saved file as data source for mailmerge (Directly a table could be set via ODBC) .MailMergeEditMainDocument && Activate the main document .insertmergefield("rcno") .insertpara .Insert("Dear ") && Start writing .InsertMergeField("Contact") && Insert a merge field - any field in data table .Insert(",") .InsertPara && Or +chr(13) to previous .Insert("Some text here...") .InsertPara .Insert("Thanks.") .InsertPara .Insert("Yours sincerely") .InsertPara .InsertPara .insert("6200 South Syracuse Street, Suite 150"+chr(13)) .insert("Englewood, CO 80111"+chr(13)) .insert("TEL: (303) 221-2000 FAX: (303) 221-3000"+chr(13)) * .MailMergeToDoc && Merge to a new document - For printer .MailMergeToPrinter * .FileSaveAs("c:\temp\frmletters.doc") && If want to save .MailMergeToPrinter .Fileexit(2) && Exit no save - directly print and exit w/o save endwith * InsertWordField could also be used but FP is more capable of it so we should have transfered the needed already * Here the control is passed to word. Sitting and waiting for further process. wait window "Data Merged to c:\temp\frmletters.doc" **** Set the LocaleId to the previous value =sys(3006,val(nlLocaleId)) ************************************************** * End of code **************************************************Cetin