ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

ouvrir un document et faire une fusion directement depuis fox   



L'auteur

eric leissler
France France
Membre Simple
# 0000002784
enregistré le 06/03/2010
http://www.aumeric.fr
68 ans
LEISSLER Eric
85290 MORTAGNE SUR SEVRE
de la société AUMERIC LOGICIELS
Fiche personnelle


Note des membres
pas de note

Contributions > 09 - Automation > Word

ouvrir un document et faire une fusion directement depuis fox
# 0000000157
ajouté le 03/03/2005 11:41:00 et modifié le 29/03/2006
consulté 11223 fois
Niveau initié

Version(s) Foxpro :
VFP 9.0
VFP 8.0
VFP 7.0
VFP 6.0

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

Code 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


Commentaires
Aucun commentaire enregistré ...

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2024.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3