PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Question sur les boucles POUR
Question sur les boucles POUR
Iniciado por hypopololipopo, 19,dic. 2019 17:48 - 5 respuestas
Publicado el 19,diciembre 2019 - 17:48
Bonjour,

J'ai fraichement installer windev express hier, ca j'ai besoin d'un logiciel permettant de générer un .xls a partir d'un HFSQL sans avoir l'analyse de ce dernier.

J'ai trouvé ce tuto: https://cedricbeaudier.blogspot.com/2011/05/snippet-convertir-une-table-hyperfile.html

Seulement, te quel il n'a pas l'aire de fonctionner probablement dû a des MAJ (l'article date de mai 2011), en effet les indirrections semblent ne pas fonctionner je les ai donc supprimé des expressions type

HOuvre({uneTable,indFichier},pass,hOLecture)


Ce qui a eu pour effet de faire fonctionner le code, cependant, la où il semble que ça bloque c'est pour la boucle qui génère le fichier .xls ( la boucle .csv n'etant de toute façons pas appelé vu que la fonction donc se sert l'auteur "typeexport" est réglée sur "xls" par défault.

donc je fait:

HLitPremier(maVue)
TANTQUE PAS HEnDehors(maVue)
idCol = 1
POUR idCol = 1 À nbRub // pour chaque rubrique, on ajoute la valeur dans la cellule
xls[idLigne,idCol] = tabRub[idCol]
FIN
idLigne++
HLitSuivant(maVue)
FIN


Je pense comprendre que le problème viens d'ici, parce que c'est l'endroit ou le code ne m'inspire pas trop au niveau de la logique. Mais si je comprend bien l'idée c'est:

HLitPremier(maVue): je me place a la premiere cellule
TANTQUE PAS HEnDehors(maVue): va retourné false quand on va arriver a la première ligne vide
xls[idLigne,idCol] = tabRub[idCol]: la ca m'échappe complètement, et jtrouve pas de doc, si je comprend on a l'équivalent de: for ($idcol = 1, $idcol <= $nbrub, idcol++) en php mais je ne comprend pas comment s'incrément idcol ..

Un petit éclairage s'il vous plaît ?
Miembro registrado
4.361 mensajes
Publicado el 20,diciembre 2019 - 02:39
Dans une boucle POUR, l'incrémentation se fait automatiquement en fonction du PAS.
L'instruction complète est
POUR nValeurAIncrémenter = nValeurDébut A nValeurFin [PAS ValeurPas]
.....
FIN

Si on omet "PAS ValeurPas", comme dans ton cas, cela équivaut à PAS 1

--
Il y a peut être plus simple, mais, ça tourne
Mensaje modificado, 20,diciembre 2019 - 02:42
Miembro registrado
2 mensajes
Publicado el 26,diciembre 2019 - 16:36
Bonjour,

Alors donc j'ai vraiment du mal.

txtRub est une chaîne = HListeRubrique(uneTable,hLstDetail) // récupération des rubriques détaillées
nbRub est un entier = ChaîneOccurrence(txtRub,RC) // nombre de rubriques de la table
nbRub++
tabRub est un tableau de nbRub chaînes // stockera les noms des rubriques
tabType est un tableau de nbRub chaînes // stockera les types des rubriques
pos est un entier = 1
uneRub est une chaîne = ExtraitChaîne(txtRub,pos,RC) // première rubrique

TANTQUE uneRub<>EOT
tabRub[pos] = ExtraitChaîne(uneRub,1,TAB)
tabType[pos] = ExtraitChaîne(uneRub,2,TAB)+"("+ExtraitChaîne(uneRub,4,TAB)+")"
pos++
uneRub=ExtraitChaîne(txtRub,pos,RC)
FIN
[........]
xls est un xlsDocument
xlsAjouteFeuille(xls,fExtraitChemin(ficHF,fFichier))
descripteur est un booléen = xlsSauve(xls, ficOut) // création d'un fichier Excel vierge
SI descripteur = -1 ALORS
RETURN
FIN
idLigne est un entier = 1

// Entête du fichier Excel : nom des rubriques
IF noheader = "" OR noheader = 0 THEN
POUR idCol = 1 À nbRub
xls[idLigne,idCol] = tabRub[idCol]
FIN
idLigne++
END
// seconde entête : les types
IF typeheader <> "" ET typeheader <> 0 THEN
POUR idCol = 1 À nbRub
xls[idLigne,idCol] = tabType[idCol]
FIN
idLigne++
END

[........]

HLitPremier(maVue)
TANTQUE PAS HEnDehors(maVue)
idCol = 1
POUR idCol = 1 À nbRub // pour chaque rubrique, on ajoute la valeur dans la cellule
xls[idLigne,idCol] = tabRub[idCol]
FIN
idLigne++
HLitSuivant(maVue)

FIN


Ce code, et notamment la derniere boucle, revoie N fois la première ligne du fichier HFSQL où N = le nombre de lignes de ce dernier au lieu de renvoyer les données de chaque lignes. j'ai esseyé des trucs pendant 2 jours mais je comprend pas, visiblement idLigne++ ne sert qu'a se placer a la ligne suivante pour réécrire tabRub[idCol] qui renvois la même chose a chaque ligne. Comment puis-je redéfinir la variable tabRub de sorte que je puisse lui passer en paramètre la colonne ET la ligne de la case qu'il doit écrire ?
Miembro registrado
4.361 mensajes
Publicado el 26,diciembre 2019 - 17:32
1-Dans un premier temps, concernant le début de ton code, celui ci sera nettement plus "léger"
sLstRub est une chaîne //Liste des rubriques détaillée
sRubriqueEnCours est chaîne //Rubrique parcourue
tabRubriques est tableau <agrandissement=1> de chaîne
tabType est tableau <agrandissement=1> de chaîne

sLstRub=HListeRubrique(UneTable,hLstDetail)

POUR TOUTE chaîne sRubriqueEnCours de sLstRub SEPAREE PAR RC
TableauAjoute(tabRubriques,ExtraitChaîne(sRubriqueEnCours,1,TAB))
TableauAjoute(tabTabType,ExtraitChaîne(sRubriqueEnCours,2,TAB))
FIN

2-Pourquoi ne pas tous simplement utiliser la fonction HExporteXLS (https://doc.pcsoft.fr/fr-fr/?1000023934)

--
Il y a peut être plus simple, mais, ça tourne
Mensaje modificado, 26,diciembre 2019 - 17:35
Miembro registrado
2 mensajes
Publicado el 26,diciembre 2019 - 17:47
Voroltinquo a écrit :
> 2-Pourquoi ne pas tous simplement utiliser la fonction HExporteXLS (https://doc.pcsoft.fr/fr-fr/?1000023934)

Haha ... et bien parce que je n'ai pas assez chercher dans la doc voilà tout x). Et bien j'essaye ça du coup, merci beaucoup ^^.
Miembro registrado
4.361 mensajes
Publicado el 26,diciembre 2019 - 18:51
Il est vrai qu'elle est bien planquée celle là, elle n'est même pas dans le "voir aussi" de HImporteXLS.

--
Il y a peut être plus simple, mais, ça tourne