eric leissler 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é 11222 fois
Niveau
initié
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 LEFTOUTERJOIN adressage!adrext ; ON personnes.adrext_id = Adrext.identifiant ; where personnes.identifiant==quelpers; INTOcursor ctstravsaisonduredetermineprev
select ctstravsaisonduredetermineprev.*, Titre.abrégé as genre; from ctstravsaisonduredetermineprev leftouterjoin impocom!titre; on ctstravsaisonduredetermineprev.titre_id = titre.identifiant; intocursor ctstravsaisonduredetermineprevtitre
SELECT ctstravsaisonduredetermineprevtitre.*, Noms.nom as cnom1 ; FROM ctstravsaisonduredetermineprevtitre LEFTOUTERJOIN impocom!noms ; ON ctstravsaisonduredetermineprevtitre.nom1 = Noms.identifiant; intocursor Ctstravsaisonduredetermineprev1
SELECT Ctstravsaisonduredetermineprev1.*, Noms.nom as cnom2 ; FROM Ctstravsaisonduredetermineprev1 LEFTOUTERJOIN impocom!noms ; ON Ctstravsaisonduredetermineprev1.nom2 = Noms.identifiant ; intocursor Ctstravsaisonduredetermineprev2
SELECT Ctstravsaisonduredetermineprev2.*, Noms.nom as cnom3 ; FROM Ctstravsaisonduredetermineprev2 LEFTOUTERJOIN impocom!noms ; ON Ctstravsaisonduredetermineprev2.nom3 = Noms.identifiant ; intocursor Ctstravsaisonduredetermineprev3
SELECT Ctstravsaisonduredetermineprev3.*, Noms.nom as prenom ; FROM Ctstravsaisonduredetermineprev3 LEFTOUTERJOIN impocom!noms ; ON Ctstravsaisonduredetermineprev3.nom3 = Noms.identifiant ; intocursor Ctstravsaisonduredetermine
SELECT Ctstravsaisonduredetermine.*, Chfam.libelle as situfami; FROM ctstravsaisonduredetermine LEFTOUTERJOIN impocom!chfam ; ON Ctstravsaisonduredetermine.chfam_id = Chfam.identifiant ; intocursor ctstravsaisonduredetermine0
SELECT Ctstravsaisonduredetermine0.*, qualification.libelle as qualif; FROM ctstravsaisonduredetermine0 LEFTOUTERJOIN eunormia!qualification; ON Ctstravsaisonduredetermine0.quali = qualification.identifiant ; intotable 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
*!* bon la je me replace select pers2pers setorderto identifian seek quelpers setorderto nom thisform.refresh()
*!* la je bombarde le contenu dans un fichier excel select ctstravsaisonduredetermine1 COPYTO contrat.xlsTYPEXL5
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
Onerror 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 ONERRORDO gesterr WITH; ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), lineno()
IFTYPE('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 IFTYPE('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