begin process at 2013 05 25 08:19:44
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API-OLE

 > OUVRIR UN DOCUMENT WORD PAR AUTOMATION ET FAIRE UNE FUSION AVEC DES DONNÉES FOXPRO

OUVRIR UN DOCUMENT WORD PAR AUTOMATION ET FAIRE UNE FUSION AVEC DES DONNÉES FOXPRO


 Information sur la source

 Description

Bonjour à tous
Voila, j'ai eu besoin depuis VFP6.0 d'exporter des données  et d'ouvrir un fichier doc et de faire une fusion avec  des données.
Le première partie n'est que la cuisine interne

Ce code est optimisable  bien sûr
(Remerciements à Michel pour les trucs auxquels je n'avait pas pensé.)

Bonne prog

Eric

Source

  • local oldselect
  • oldselect=select()
  • *!* identifiant du personnel de cote
  • m.quelpers=pers2pers.identifiant
  • *!* requêtes sql pour arriver à ce que je veux
  • *!* Franchement les requêtes sql me gonflent car tu es obligé à priori de faire quatre requêtes car je n'ai pas trouvé
  • *!* le moyen de faire plusieurs liens d'une table vers plusieurs tables en sql
  • *!* Bref je fais ma cuisine
  • SELECT personnes.ss_numero, personnes.telephone,;
  • personnes.fax, personnes.portable, personnes.email,personnes.titre_id, personnes.datene,;
  • personnes.lieu, Personnes.lieune2 , personnes.nocartsej, personnes.numsecu,;
  • personnes.clesecu, Adrext.ad_1, Adrext.ad_2, Adrext.ad_cp,Personnes.chfam_id,;
  • Adrext.ad_commune, personnes.identifiant, personnes.nationalite,;
  • Personnes.nom1, Personnes.prenom, Personnes.nom2, Personnes.nom3,;
  • Contrats1.dateentree as dateentre, Contrats1.heureshebdo as heurhbde, ;
  • Contrats1.tauxhoraire as tauxhor, Contrats1.salairemensuel as salmens ,;
  • Contrats1.avantagenature as avennat ,Contrats.heureshebdo*4 as horamens,;
  • Contrats1.datesortprev as sortiepre, Contrats1.qualification_id as quali;
  • FROM impocom!personnes LEFT OUTER JOIN adressage!adrext ;
  • ON personnes.adrext_id = Adrext.identifiant ;
  • where personnes.identifiant==quelpers;
  • INTO cursor ctstravsaisonduredetermineprev
  • select ctstravsaisonduredetermineprev.*, Titre.abrégé as genre;
  • from ctstravsaisonduredetermineprev left outer join impocom!titre;
  • on ctstravsaisonduredetermineprev.titre_id = titre.identifiant;
  • into cursor ctstravsaisonduredetermineprevtitre
  • SELECT ctstravsaisonduredetermineprevtitre.*, Noms.nom as cnom1 ;
  • FROM ctstravsaisonduredetermineprevtitre LEFT OUTER JOIN impocom!noms ;
  • ON ctstravsaisonduredetermineprevtitre.nom1 = Noms.identifiant;
  • into cursor Ctstravsaisonduredetermineprev1
  • SELECT Ctstravsaisonduredetermineprev1.*, Noms.nom as cnom2 ;
  • FROM Ctstravsaisonduredetermineprev1 LEFT OUTER JOIN impocom!noms ;
  • ON Ctstravsaisonduredetermineprev1.nom2 = Noms.identifiant ;
  • into cursor Ctstravsaisonduredetermineprev2
  • SELECT Ctstravsaisonduredetermineprev2.*, Noms.nom as cnom3 ;
  • FROM Ctstravsaisonduredetermineprev2 LEFT OUTER JOIN impocom!noms ;
  • ON Ctstravsaisonduredetermineprev2.nom3 = Noms.identifiant ;
  • into cursor Ctstravsaisonduredetermineprev3
  • SELECT Ctstravsaisonduredetermineprev3.*, Noms.nom as prenom ;
  • FROM Ctstravsaisonduredetermineprev3 LEFT OUTER JOIN impocom!noms ;
  • ON Ctstravsaisonduredetermineprev3.nom3 = Noms.identifiant ;
  • into cursor Ctstravsaisonduredetermine
  • SELECT Ctstravsaisonduredetermine.*, Chfam.libelle as situfami;
  • FROM ctstravsaisonduredetermine LEFT OUTER JOIN impocom!chfam ;
  • ON Ctstravsaisonduredetermine.chfam_id = Chfam.identifiant ;
  • into cursor ctstravsaisonduredetermine0
  • SELECT Ctstravsaisonduredetermine0.*, qualification.libelle as qualif;
  • FROM ctstravsaisonduredetermine0 LEFT OUTER JOIN eunormia!qualification;
  • ON Ctstravsaisonduredetermine0.quali = qualification.identifiant ;
  • into table temp\ctstravsaisonduredetermine1.dbf
  • *!* ici ma cuisine est faite et je change les champs date en champs texte
  • *!* comme ca pas d'emmerdements avec word 2002 ( Tu as raison Merci )
  • *!* la syntaxe mergefield [nomduchamp] \@"dd/MM/yyyy" de word2002 ne fonctionne pas toujours
  • alter table ctstravsaisonduredetermine1 alter column dateentre c(15)
  • alter table ctstravsaisonduredetermine1 alter column datene c(15)
  • alter table ctstravsaisonduredetermine1 alter column sortiepre c(15)
  • alter table ctstravsaisonduredetermine1 alter column tauxhor c(15)
  • *!* bon la je me replace
  • select pers2pers
  • set order to identifian
  • seek quelpers
  • set order to nom
  • thisform.refresh()
  • *!* la je bombarde le contenu dans un fichier excel
  • select ctstravsaisonduredetermine1
  • COPY TO contrat.xls TYPE XL5
  • select ctstravsaisonduredetermine1
  • use
  • select ctstravsaisonduredetermineprevtitre
  • use
  • select ctstravsaisonduredetermineprev
  • use
  • select Ctstravsaisonduredetermineprev1
  • use
  • select Ctstravsaisonduredetermineprev2
  • use
  • select Ctstravsaisonduredetermineprev3
  • use
  • select Ctstravsaisonduredetermine
  • use
  • select ctstravsaisonduredetermine0
  • use
  • select (oldselect)
  • && la fonction pasdeword contient
  • && parameter merreur
  • && do case
  • && case m. merreur=1733
  • && && on ne fait rien
  • &&
  • && endcase
  • On error pasdeWord(error()) && direction vers la méthode en cas d'erreur 1733 notamement
  • oWord = Createobject("Word.Application") && pas d'erreur puisque thisform.pasdeword()
  • && remise du gestionnaire d'erreur en cours
  • ON ERROR DO gesterr WITH;
  • ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), lineno()
  • IF TYPE('oWord') # 'O' && la variable oword n'étant pas un objet, on sort
  • em_message("Le logiciel WORD n'est pas installé sur votre"+;
  • " ordinateur.",0+16)
  • else
  • WITH oword
  • * J'ouvre mon document. Comme y pas de mot de passe, je ne met qu'un paramétre
  • .documents.open(repdebase+"contratsaisonnier.doc")
  • .Visible = .f. && Je cache word
  • .WindowState = 1 && réduite
  • with .ActiveDocument.MailMerge
  • .DataSource.FirstRecord = 1 && de l'enr 1
  • .DataSource.LastRecord = 1 && à l'enr 1 De toute facon Il n'y en a qu'un !
  • .Destination = 0 && Içi il faut mettre 0 sous peine d'avoir la
  • && fameuse ou fumeuse erreur 1429
  • .SuppressBlankLines = "True" && Supprime les lignes vides
  • .Execute
  • oword.activeDocument.printout && Içi, j'édite deux fois. J'ai pas trouvé le nombre de copies
  • oword.activeDocument.printout && .activedocument.copies= 2 ne fonctionne pas
  • && Bon la je teste la présence du répertoire du personnels dans le dossier de l'appli
  • && et si'il n'existe pas, je le crée
  • m.toto="\eunormia\personnels\"+pers2pers.identifiant
  • if !directory(toto)
  • cmd='md \eunormia\personnels\'+pers2pers.identifiant
  • &cmd
  • endif
  • && Maintenant, j'y met le nom du doc
  • m.queldoc=+toto+"\"+alltrim(el_nom("pers2pers","noms"))+"contratsaisonier.doc "
  • && et la j'enregistre la lettre type issue de la fusion
  • && Donc non liées à un tableur excel donc pouvant servir d'archive
  • oword.ActiveDocument.SaveAs(queldoc)
  • && Je ferme mon document en cours, celui que je viens de sauvegarder
  • oword.ActiveDocument.close()
  • && Je ferme le documents source
  • oword.ActiveDocument.close()
  • && Je quitte word c'est pas plus mal de liberer les ressources
  • IF TYPE('oWord') = 'O' .and. !ISNULL('oword')
  • oword.quit(0)
  • ENDIF
  • EndWith
  • endwith
  • endif
  • && je release mon objet
  • RELEASE oWord
  • select (oldselect)
  • && Et voila le tour est joué.
  • && Merci Michel
local oldselect
oldselect=select()
*!* identifiant du personnel de cote
m.quelpers=pers2pers.identifiant

*!* requêtes sql pour arriver à ce que je veux
*!* Franchement les requêtes sql me gonflent car tu es obligé à priori de faire quatre requêtes car je n'ai pas trouvé
*!* le moyen de faire plusieurs liens  d'une table vers  plusieurs tables en sql
*!* Bref je fais ma cuisine

SELECT  personnes.ss_numero, personnes.telephone,;
  personnes.fax, personnes.portable, personnes.email,personnes.titre_id, personnes.datene,;
  personnes.lieu, Personnes.lieune2 , personnes.nocartsej, personnes.numsecu,;
  personnes.clesecu, Adrext.ad_1, Adrext.ad_2, Adrext.ad_cp,Personnes.chfam_id,;
  Adrext.ad_commune, personnes.identifiant, personnes.nationalite,;
  Personnes.nom1, Personnes.prenom, Personnes.nom2, Personnes.nom3,;
  Contrats1.dateentree as dateentre, Contrats1.heureshebdo as heurhbde, ;
  Contrats1.tauxhoraire as tauxhor, Contrats1.salairemensuel as salmens ,;
  Contrats1.avantagenature as avennat ,Contrats.heureshebdo*4 as horamens,;
  Contrats1.datesortprev as sortiepre, Contrats1.qualification_id as quali;
 FROM  impocom!personnes LEFT OUTER JOIN adressage!adrext ;
   ON  personnes.adrext_id = Adrext.identifiant ;
    where personnes.identifiant==quelpers;
 INTO cursor ctstravsaisonduredetermineprev

select ctstravsaisonduredetermineprev.*, Titre.abrégé as genre;
from ctstravsaisonduredetermineprev left outer join impocom!titre;
on ctstravsaisonduredetermineprev.titre_id = titre.identifiant;
into cursor  ctstravsaisonduredetermineprevtitre

 SELECT ctstravsaisonduredetermineprevtitre.*, Noms.nom  as cnom1 ;
 FROM  ctstravsaisonduredetermineprevtitre LEFT OUTER JOIN impocom!noms ;
   ON  ctstravsaisonduredetermineprevtitre.nom1 = Noms.identifiant;
   into cursor Ctstravsaisonduredetermineprev1

   SELECT Ctstravsaisonduredetermineprev1.*, Noms.nom as cnom2 ;
 FROM  Ctstravsaisonduredetermineprev1  LEFT OUTER JOIN impocom!noms ;
   ON  Ctstravsaisonduredetermineprev1.nom2 = Noms.identifiant ;
   into cursor Ctstravsaisonduredetermineprev2


   SELECT Ctstravsaisonduredetermineprev2.*, Noms.nom as cnom3 ;
 FROM  Ctstravsaisonduredetermineprev2 LEFT OUTER JOIN impocom!noms ;
   ON  Ctstravsaisonduredetermineprev2.nom3 = Noms.identifiant ;
   into cursor Ctstravsaisonduredetermineprev3


   SELECT Ctstravsaisonduredetermineprev3.*, Noms.nom as prenom ;
 FROM  Ctstravsaisonduredetermineprev3 LEFT OUTER JOIN impocom!noms ;
   ON  Ctstravsaisonduredetermineprev3.nom3 = Noms.identifiant ;
   into cursor Ctstravsaisonduredetermine




 SELECT Ctstravsaisonduredetermine.*, Chfam.libelle as situfami;
 FROM  ctstravsaisonduredetermine LEFT OUTER JOIN impocom!chfam ;
   ON  Ctstravsaisonduredetermine.chfam_id = Chfam.identifiant ;
   into cursor ctstravsaisonduredetermine0

 SELECT Ctstravsaisonduredetermine0.*, qualification.libelle as qualif;
 FROM  ctstravsaisonduredetermine0 LEFT OUTER JOIN eunormia!qualification;
   ON  Ctstravsaisonduredetermine0.quali = qualification.identifiant ;
   into table temp\ctstravsaisonduredetermine1.dbf

   *!* ici ma cuisine est faite et je    change les champs date en champs texte
   *!* comme ca   pas d'emmerdements avec word 2002  ( Tu as raison  Merci )

   *!* la syntaxe mergefield  [nomduchamp] \@"dd/MM/yyyy" de word2002 ne fonctionne pas toujours

alter table ctstravsaisonduredetermine1 alter column dateentre c(15)
alter table ctstravsaisonduredetermine1 alter column datene c(15)
alter table ctstravsaisonduredetermine1 alter column sortiepre c(15)
alter table ctstravsaisonduredetermine1 alter column tauxhor c(15)

*!* bon la je me replace
select pers2pers
set order to identifian
seek quelpers
set order to nom
thisform.refresh()

*!* la je bombarde le contenu dans un fichier excel
select ctstravsaisonduredetermine1
COPY TO contrat.xls   TYPE XL5

select ctstravsaisonduredetermine1
    use
    select ctstravsaisonduredetermineprevtitre
    use
    select ctstravsaisonduredetermineprev
    use
    select Ctstravsaisonduredetermineprev1
    use
    select Ctstravsaisonduredetermineprev2
    use
    select Ctstravsaisonduredetermineprev3
    use
    select Ctstravsaisonduredetermine
    use
    select ctstravsaisonduredetermine0
    use


select (oldselect)


&& la fonction pasdeword contient
&& parameter merreur
&& do case
&& case m. merreur=1733
&& && on ne fait rien
&& 
&& endcase




On error pasdeWord(error())   && direction vers la méthode en cas d'erreur 1733 notamement
 oWord = Createobject("Word.Application")   && pas d'erreur puisque thisform.pasdeword()

&& remise du gestionnaire d'erreur en cours
ON ERROR DO gesterr WITH;
   ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), lineno()


     IF TYPE('oWord') # 'O'       && la variable oword n'étant pas un objet, on sort
    em_message("Le logiciel WORD n'est pas installé sur votre"+;
    " ordinateur.",0+16)
     else
      WITH oword
        * J'ouvre  mon document. Comme y pas de mot de passe, je ne met qu'un paramétre
       .documents.open(repdebase+"contratsaisonnier.doc")
      .Visible = .f.     && Je cache word
      .WindowState = 1   && réduite
    
    
      with .ActiveDocument.MailMerge
    .DataSource.FirstRecord = 1       && de l'enr 1
    .DataSource.LastRecord = 1        && à l'enr 1 De toute facon Il n'y en a qu'un !
    .Destination = 0                  && Içi il faut mettre 0 sous peine d'avoir la
                                               && fameuse ou fumeuse erreur 1429
    .SuppressBlankLines = "True"      && Supprime les lignes vides
    .Execute
    oword.activeDocument.printout       && Içi, j'édite deux fois. J'ai pas trouvé le nombre de copies
    oword.activeDocument.printout       && .activedocument.copies= 2 ne fonctionne pas
    && Bon la je teste la présence du répertoire du personnels dans le dossier de l'appli
    && et si'il n'existe pas, je le crée 
    m.toto="\eunormia\personnels\"+pers2pers.identifiant
    if !directory(toto)
        cmd='md \eunormia\personnels\'+pers2pers.identifiant
         &cmd
            endif
            && Maintenant, j'y met le nom du doc
           m.queldoc=+toto+"\"+alltrim(el_nom("pers2pers","noms"))+"contratsaisonier.doc "
           && et la j'enregistre la lettre type issue de la fusion
           && Donc non liées à un tableur excel donc pouvant servir d'archive
    oword.ActiveDocument.SaveAs(queldoc)
    && Je ferme mon document en cours, celui que je viens de sauvegarder
        oword.ActiveDocument.close()
        && Je ferme le documents source
        oword.ActiveDocument.close()
    
          && Je quitte word c'est pas plus mal de liberer les ressources
          IF TYPE('oWord') = 'O' .and. !ISNULL('oword')
           oword.quit(0)
          ENDIF

EndWith
endwith
endif


 && je release mon objet
RELEASE oWord

select (oldselect)
&& Et voila le tour est joué.
&& Merci Michel


 Conclusion

Voila
le document contratsaisonnier.doc  est lié avec le fichier contrat.xls qui ne contient qu'une ligne


 Sources du même auteur

Source avec Zip SAISIE GRAPHIQUE D'UN CRÉNEAU HORAIRE

 Sources de la même categorie

AUTOMATION DE WORD AVEC VFP par AbaqueInside
LISTER LES ADRESSES IP DE LA MACHINE par FrancisFaure
[VFP]CLASSE SYSTEMTIME par FredArmoni
Source avec Zip SPLASHSCREEN TYPE ALERTE D'OUTLOOK2003 par FredArmoni
Source avec Zip Source avec une capture METTRE UN OBJET FOX PAR DESSUS UN ACTIVEX par c_chenavier

 Sources en rapport avec celle ci

AUTOMATION DE WORD AVEC VFP par AbaqueInside

Commentaires et avis

Commentaire de Roland38 le 27/09/2005 07:32:04

# *!* Franchement les requêtes sql me gonflent car tu es obligé à priori de faire quatre requêtes car je n'ai pas trouvé
# *!* le moyen de faire plusieurs liens d'une table vers plusieurs tables en sql

Il y a beaucoup plus simple (as-tu rçu mon message à ce sujet ???)
Roland

Commentaire de survi le 04/07/2006 17:19:25

Tous cela est bien instructif mais avec acrobat distiler comment cela ce passe t'il ?
Je cherche et ne trouve pas le moyen de diriger acrobat distiler
donc si vous avez une piste n'hésiter pas
d'avance merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Ouvrir fichier word, excel pdf ou autre [ par ducker88 ] Bonjour à tous, Voila je voudrais pouvoir n'importe quel fichier quel qu'en soi la syntaxe dans le logiciel par defaut, exemple je Ouverture document existant sous C:\ [ par zuddap ] Bonjour je programme en FOXPRO 9 et je souhaiterais ouvrir un document existant sous c:\, j'aimerais qu'il s'ouvre en lecture/écriture, mais je m'en s Explorateur et Foxpro : ouvrir une table en exclusif [ par mike_vk ] Bonjour, Je cherche en gros à avoir un menu contextuel sur les dbf qui puisse me permettre de choisir de l'ouvrir en "shared" ou "exlusive". Existe-t POUR LANCER UNE FENETRE OUVRIR [ par samgood01 ] Bonjour;Priére de m'informer sur une commande permettant de lancer la fenetre ouvrir autres que putfile() et getdir().Merci d'avance. lancer la fenetre ouvrir [ par samgood01 ] Bonjour les pros,Je reviens  pour poser ma question conçernant la command  permettant de lancer la fenetre ouvrir autres que putfile et getdir.Merci D Numériser un document à partir du code foxpro [ par abdourasiz ] Bonjour ! je veux developper un logiciel GED (Gestion électronique des documents). Pouvez vous m'aider à récupérer à partir du code foxpro un document Impression d'un état VFP en Word. [ par souad213 ] Bonjour, Je voudrais convertir (ou imprimer) mon état VFP 9, qui s'affiche sur l'écrant,sous Word. Je vous demande est ce que cela est possible en VF Numériser un document en vfp9 [ par serele ] Salut à tous : Je voudrais scanner un document en cliquant sur un bouton comment procéder? ouvrir fichier a l'aide de la fonction RUN [ par ducker88 ] Bonjour a tous, Je souhaiterai ouvrir n'importe quel fichier à partir de mon programme ecrit en foxpro.j'ai essayé RUN c:\test.xlsCela march Accès limité à une table. [ par pledoux ] Bonjour,Je souhaite faire un accès limité à plusieurs table. Je vous explique :J'ai des programmeurs qui utilisent VisualFoxPro pour travailler sur le


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales