cs_brunaux
Messages postés34Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention19 octobre 2006
-
15 juin 2005 à 12:34
Mike Gagnon
Messages postés381Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention24 octobre 2013
-
20 juin 2005 à 14:49
bonjour à tous
voila ,j'ai 3 tables ,exemple : t18,s18,r18 .dans ces 3 bases diverses variables tel que :num_coupon,desc_coupon,mont_coupon,observations etc .toutes 3 ayant un champ commun :
num_unique
est-il possible d'apres ces 3 tables de creer un fichier excel ,exemple f18 qui contiendrais 3 onglets,chacun portant le nom des 3 tables précedentes ?
au final je voudrais a partir des 3 bases (t18,s18,r18) avoir un fichier excel f18 qui aura 3 onglets (t18,s18,r18)
cs_brunaux
Messages postés34Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention19 octobre 2006 16 juin 2005 à 07:55
Merci Mike pour la réponse
mais désolé cela ne marche pas
j'ai oublier de préciser quelques petites choses :j'utilise VP6 (cela a peut-etre son importance ?) et suis utilisateur occasionnel donc il y a des choses de ton code que je ne comprends pas trop !
et aussi ,outre le fait de vouloir mettre les 3 tables t18,s18 et r18 dans un fichier excel f18 ayant 3 onglets portant le nom des 3 bases,je veux creer autant de fichiers
excel qu'il y a de num_unique different dans les bases:
je m'explique:
dans t18 je vais par exemple avoir les 3 premiers enregistrement ayant 1030 en num_unique (donc egalement en s18 1030 sur x enregis. et en r18 1030 sur x enregis.),ensuite 5 enregis. ayant 1031 (idem au-dessus pour s18 et r18), puis mettons 10 enregis. ayant 1032 (idem au-dessus pour s18 et r18), etc ....
au final je vais donc avoir un fichier excel f1030(avec les onglets t18 de 3 lignes,s18 sur x lignes,r18 sur x lignes),un autre f1031(idem au-dessus),un autre f1032, etc ....
donc en fait quand je lance le programme,cela bloque tout de suite sur :
nfieldno=AFIELDS(arrfielda,lcAlias)
message "variable 'lcalias' introuvable" ?
j'ai donc besoin de nouveau d'aide !!!
merci d'avance
Mike Gagnon
Messages postés381Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention24 octobre 20132 16 juin 2005 à 11:08
Les choses se compliquent. Je m'excuse je connaisait pas ton niveau de comprehension de FoxPro. Mais pour ce qui est de la première erreur que tu obtient, on peut la corriger comme ceci.
oExcel = CREATEOBJECT('Excel.application')
oWorkbook = oExcel.Workbooks.ADD
PRIVATE lcAlias
USE t18 SHARED AGAIN IN 0
SELECT T18
lcAlias = ALIAS()
copydata(1,"T18")
USE r18 SHARED AGAIN IN 0
SELECT R18
lcAlias = ALIAS()
copydata(2,"R18")
USE s18 SHARED AGAIN IN 0
SELECT S18
lcAlias = ALIAS()
copydata(3,"S18")
cs_brunaux
Messages postés34Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention19 octobre 2006 16 juin 2005 à 12:02
merci mike
petit probleme dans le programme :
message d'erreur :
variable XLCENTER introuvable
variable XLBOTTOM introuvable
variable XLCONTEXT introuvable
en appuyant tout le temps sur 'ignorer' au bout d'un moment on sors de la boucle
et on a bien un fichier excel ouvert avec les 3 onglets(t18,r18,s18) avec les donnes
donc a priori cela marche
peut-etre faut-il supprimer les lignes pour ces 3 variables?
mais mon autre souci est que je pensais que l'on pouvait donner tout de suite dans le programme un nom de fichier excel (exemple:"premier_fichier") qui s'enregistre dans le repertoire ou on a les données
en fait ce que voudrais reellement c'est en lancant le programme avoir au final
mettons 4 fichier excel : un fichier 1030.xls, puis 1031.xls,puis 1032.xls,puis 1033.xls
dans le 1030.xls j'aurais mettons 3 lignes en onglet t18,puisque dans t18 j'ai 3 lignes avec 1030 en num_unique, 3 lignes en onglet r18 puisque 3 enregis.dans r18 avec 1030 en num_unique,pareil pour l'onglet s18
puis dans le 1031.xls mettons 5 lignes (5 enregis. dans t18 avec 1031 en num_unique
etc.... comme au-dessus)
puis dans le 1032.xls mettons 10 lignes (idem comme au dessus)
etc....
est-ce-que tout cela est vraiment possible ???
j'espere ne pas etre trop brouillon dans mes explications !!
Mike Gagnon
Messages postés381Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention24 octobre 20132 16 juin 2005 à 12:20
Je sais ou tu veux arriver, mais je travaille la solution avec toi, en esperant que tu va pouvoir prendre le controle de la solution éventuellement. Mais pour ce qui est des constantes, j'ai oublié des définir au debut, ajoute ceci au début de la routine.
#DEFINE xlCenter -4108
#DEFINE xlBottom -4107
#DEFINE xlContext -5002
Je reviens avec le restant de la solution bientot (je dois quitter pour quelques instants). Mais techniquement la solution est faisable. Il s'agit d'utliser ddes curseurs SQL. Un qui contient les valeurs distinctes de ton num_unique, et en faisant un loop, on peut grouper le restant des données par numero unique, et une fois le curseur crée, on l'envoye à un nouvelle feuille excel.
cs_brunaux
Messages postés34Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention19 octobre 2006 16 juin 2005 à 13:58
merci mike, cela marche avec les nouvelle lignes de codes pour les constantes (d'ailleurs je ne sais pas a quoi cela correspond !!!).
pour le reste je suis plutot perdu , je ne sais meme pas comment dans VFP on peut donner un nom de fichier excel lorque ce dernier est ouvert et créer en programmation
ni comment on le ferme et on l'enregistre dans un repertoire precis
j'avais vaguement penser pour le repertoire de faire un truc comme ca:
repertoire_travail = 'd:\etudes\comptages\'
CD (repertoire_travail)
mettre deja ces 2 lignes au debut du programme
je me disais aussi peut-etre decomposer en autant fichiers dbf que l'on a de num_unique different dans chacun des 3 bases
exemple pour t18
copier ds un fichier la 1ere valeur de num_unique ,ex:1030 (donc =t18_1030.dbf) avec copy to t18_1030.dbf for num_unique=1030
balayer le fichier puis des que la valeur suivante change recommencer
copy to t18_1031.dbf for num_unique=1031
etc... etc ... pour avoir au final exemple t18_1030.dbf à t18_1080.dbf (j'aurais aussi la meme chose pour r18 et s18 evidemment) et puis lancer ton programme en changeant manuellement les intitulés d'alias() ,plus enregistrer manuellement aussi le fichier excel ouvert (t18_1030.xls) ,fermer excel puis relancer le prg avec un nouvel intitule d'alias() ,etc etc jusqu'a t18_1080.xls , mais bon cela fait beaucoup,beaucoup de manipulations.
je compte donc beaucoup plus sur ton aide pour la suite que moi je ne pourrais d'aider en prenant le controle de la solution pour ce programme
Mike Gagnon
Messages postés381Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention24 octobre 20132 16 juin 2005 à 14:37
>>>merci mike, cela marche avec les nouvelle lignes de codes pour les constantes (d'ailleurs je ne sais pas a quoi cela correspond !!!).
ILes trois valeurs en question correspondent à des contantes qu'Excel s'attend pour formatter la colone (dans l'exemple ci-haut). Tu aurrai aussi pu mettre les valeurs correspondant à la place, mais cela n'est pas un bon style de programmation. Par exemple on pourrait changer le ligne qui suit avac la valeur.
Mais pour revenir au probleme, comme j'ai expliqué, si on prend la table T8 qui contient je crois 3 valeurs différentes. Et on utilise ce qui suit.
SELECT num_unique from T8 group by num_unique into cursor premier
La on a un curseur qui contient juste le champs num_unique, et seulement un entrée pour chaque valeurs.
Ensuite tu reprend la table T8 pour récupérer les autres champs, basé sur la valeur unique dans le curseur premier. Donc
SELECT num_unique from T8 group by num_unique into cursor premier
SELECT premier
SCAN
lnNum = premier.num_unique
SELECT * from T8 where t8.num_unique - lnNUM into moncurseur
*** la tu envoye les données du curseur moncurseur vers un nouvelle feuille Excel avec la fonction postée plus haut
ENDSCAN
Donc pour reprendre le tout (Avec une table seulement - il faut refraire avec les autres)
#DEFINE xlCenter -4108
#DEFINE xlBottom -4107
#DEFINE xlContext -5002
oExcel = Createobject('Excel.application')
oWorkbook = oExcel.Workbooks.Add
Private lcAlias
Select num_unique From T8 Group By num_unique Into Cursor premier
Select premier
Scan
lnNum = premier.num_unique
Select * From T8 Where T8.num_unique - lnNum Into moncurseur
Select moncurseur
lcAlias= Alias()
copydata(1,Transform(lnNum))
Endscan
Procedure copydata(sheetnumero,lcSheetName)
With oWorkbook
.Sheets(sheetnumero).Select
With .activesheet
.Name = lcSheetName
nfieldno=Afields(arrfielda,lcAlias)
For N=1 To nfieldno
.Cells(1,N).Value=arrfielda(N,1)
Endfor
nrow=2
Select &lcAlias
Scan
For N=1 To nfieldno
cfield=lcAlias+'.'+arrfielda(N,1)
.Cells(nrow,N).Value=(&cfield)
Endfor
.Cells(nrow,1).Select
nrow=nrow+1
Endscan
nValue = 65
For N=1 To nfieldno
cColumn = Chr(nValue)
.Columns(Transform(cColumn)+':'+Transform(cColumn)).EntireColumn.AutoFit
.Columns(Transform(cColumn)+':'+Transform(cColumn)).Select
.Columns(Transform(cColumn)+':'+Transform(cColumn)).HorizontalAlignment = xlCenter
.Columns(Transform(cColumn)+':'+Transform(cColumn)).VerticalAlignment = xlBottom
.Columns(Transform(cColumn)+':'+Transform(cColumn)).WrapText = .F.
.Columns(Transform(cColumn)+':'+Transform(cColumn)).Orientation = 0
.Columns(Transform(cColumn)+':'+Transform(cColumn)).AddIndent = .F.
.Columns(Transform(cColumn)+':'+Transform(cColumn)).IndentLevel = 0
.Columns(Transform(cColumn)+':'+Transform(cColumn)).ShrinkToFit = .F.
.Columns(Transform(cColumn)+':'+Transform(cColumn)).ReadingOrder = xlContext
.Columns(Transform(cColumn)+':'+Transform(cColumn)).MergeCells = .F.
Endfor
.Cells.Select
Endwith
Endproc
cs_brunaux
Messages postés34Date d'inscriptionjeudi 25 novembre 2004StatutMembreDernière intervention19 octobre 2006 20 juin 2005 à 14:41
Merci Mike pour toute l'aide apportée, mais malheureusement j'toujours l'erreur une fois les données copies vers excel (avec l'aide de ton code), une fois qu'on enregistre le fichier excel ouvert quand on revient dans le formulaire ,si l'on veut de nouveau saisir des données dans les grilles qui appartiennent aux 3 tables,ca plante toujours toujours avec des messages style "les données sont déjà ouvertes dans d'autres zone de travail !"
j'ai donc laissé tomber et je fais un truc de débutant ! (on fait comme on peut !)
je copie chaque base (ex:t18_1030) avec un copy to monfichier(t18_1030) type xl5 ,la meme chose avec les 2 autres bases ,une fois les 3 copy faits ,avec un zap
je peux de nouveau resaisir des données dans mes grilles du formulaires.
Et apres pour excel quelqu'un fera une macro pour mettre les 3 fichiers excel (t18_1030, r18_1030 et s18_1030) ensemble avec les 3 onglets avec le nom des bases. c'est tiré par les chevaux mais bon ...
une derniere chose: les ligne des codes style :
.Sheets(sheetnumero).Select
.Columns(Transform(cColumn)+':'+Transform(cColumn)).IndentLevel = 0
c'est du visual foxpro ou du langage excel que l'on peut ecrire dans VFP ?