Comment faire pour automatiser l'opération de fusion et publipostage pour Word à l'aide de OLE et de ODBC

IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d’articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d’avoir accès, dans votre propre langue, à l’ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s’exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s’efforce aussi continuellement de faire évoluer son système de traduction automatique.

La version anglaise de cet article est la suivante: 181926
Résumé
Cet article montre comment utiliser OLE automation pour créer une opération de fusion et publipostage dans Microsoft Office Word 2003 à l'aide de données à partir d'un FoxPro Visual (VFP) pour la table de Windows.
Plus d'informations
Ci-dessous est le code de Visual FoxPro pour Windows à l'aide du modèle d'objet Word.application qui effectue l'opération de fusion et publipostage en utilisant une source de données ODBC à une table existante de Visual FoxPro. Ce code peut utiliser un nom de la source des données existant (DSN), créé dans le Gestionnaire de pilote ODBC, ou il pouvez en créer une à la volée utilisant un appel d'API pour ajouter et utiliser le DSN. Dans l'exemple ci-dessous, «Tables Visual FoxPro» est le nom de source de données créée dans le Gestionnaire de pilote ODBC et pointe vers le dossier \Samples\Data dans le dossier de base VFP. Ces chemins d'accès devra probablement être modifiées pour refléter les chemins d'accès des utilisateurs.

Remarque Ce code a été testé avec le service version-1 (SR-1) pour Word 97 et Microsoft Office Word 2003. L'utilisation de versions antérieures de Word 97 provoque une incompatibilité de type et d'autres erreurs OLE.

Créer un programme et entrez le code suivant :
  ***/ 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))>7lthemes=_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 /***						
Références
Pour plus d'informations sur la façon d'obtenir la version de Word pour Windows 97 service 1 (SR-1), cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la base de connaissances Microsoft :
172475Comment obtenir et installer MS Office 97 SR-1
Microsoft Visual Basic pour applications (Word ' 97) à l'aide ; effectuez une recherche sur «OLE»

Avertissement : Cet article a été traduit automatiquement.

Propriétés

ID d'article : 181926 - Dernière mise à jour : 02/16/2005 05:38:06 - Révision : 3.4

Microsoft Visual FoxPro 3.0 Édition Standard, Microsoft Visual FoxPro 3.0b Édition standard, Microsoft Visual FoxPro 5.0 Édition standard, Microsoft Visual FoxPro 5.0a, Microsoft Visual FoxPro 6.0 Édition Professionnelle, Microsoft Visual FoxPro 7.0 Édition professionnelle, Microsoft Visual FoxPro 8.0 Édition Professionnelle, Microsoft Visual FoxPro 9.0 Professional Edition

  • kbmt kbautomation kbhowto kbinterop KB181926 KbMtfr
Commentaires