PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV (versões anteriores) → Problème d'une conception de nomenclature multi-niveaux
Problème d'une conception de nomenclature multi-niveaux
Iniciado por Manu-dev, jun., 05 2013 1:49 PM - 8 respostas
Publicado em junho, 05 2013 - 1:49 PM
Bonjour à toutes et à tous,

Je débute avec Windev à la demande de mon employeur sur une version 14 qui traînait dans une armoire (à croire que mon prédécesseur à déjà tâté le terrain). Je recherche à créer une nomenclature multi-niveaux avec une table hiérarchique. Pour cela j'ai les éléments suivants :
- 1 fichier "nomenclature" qui contient trois champs : ArticleParent(tnomq_artm), ArticleEnfant(tnomq_arte), Qte(tnomq_qte)
- une fenêtre simple avec un champ de saisie SAI_refmachine et un bouton pour lancer la génération
- une requête SELECT qui va chercher tous les ArticleEnfant correspondant à un ArticleParent défini en paramètre.

En exemple voici un début de contenu du fichier Nomenclature :
VELO | CADRE | 1
VELO | ROUE | 2
VELO | PHARE | 1
CADRE | TUBE | 4
CADRE | ECROU | 6
PHARE | COQUE | 1
ECROU | KIT GRAISSAGE | 1

Mais je souhaite obtenir dans une table hiérarchique Windev une nomenclature multiniveaux qui afficherait :
VELO
| CADRE
-|TUBE
-|ECROU
--|KIT GRAISSAGE
ROUE
PHARE

-|COQUE

Je pense stopper ma nomenclature dans la limite de 10 niveaux
Coté code j'ai l'idée d'appeler la requete sur le niveau 0 et d'inscrire le résultat dans un tableau. Je teste si le tableau contient des éléments et je refais la requete pour chaque élément du tableau que je stocke ainsi de suite dans un autre tableau. Si le tableau ne contient plus d'éléments je remonte d'un niveau et je recommence ma requete...

En code j'ai déjà commencé ceci :

tabNiv0 est un tableau de chaînes
tabNiv1 est un tableau de chaînes
tabNiv2 est un tableau de chaînes
tabNiv3 est un tableau de chaînes
tabNiv4 est un tableau de chaînes
tabNiv5 est un tableau de chaînes
tabNiv6 est un tableau de chaînes
tabNiv7 est un tableau de chaînes
tabNiv8 est un tableau de chaînes
tabNiv9 est un tableau de chaînes
tabNiv10 est un tableau de chaînes

//on ajoute la référence de la machine au niveau 0
TableauAjouteLigne(tabNiv0,SAI_refmachine)
TableAjouteFils(TABLEH_TableHierarchique1,0,SAI_refmachine)

//on requete sur le niveau 0
HExécuteRequête(NomenclatureNiv1,hRequêteInterruptible,SAI_refmachine)
//on teste si il existe des sous-ensembles au niveau 0
SI HLitPremier(NomenclatureNiv1) = Faux ALORS
Info("Votre ensemble ne comporte pas de sous-ensembles")
RAZ()
SINON
TANTQUE HTrouve(NomenclatureNiv1) ALORS
TableauAjouteLigne(tabNiv1,NomenclatureNiv1.tnomq_arte)
HLitSuivant(NomenclatureNiv1)
FIN
FIN


:o:( mais est ce que c'est une bonne méthode ou existe t'il un exemple LST ou une méthode pour créer des nomenclatures multi-niveaux en windev ? Là dessus Google est pas trop notre ami, je tombe sur beaucoup de questions mais pas de réponse...

Je remercie par avance chacun d'entre vous pour une éventuelle idée à ce sujet ou une éventuelle piste à explorer.
Publicado em junho, 05 2013 - 2:44 PM
salut !
si tu utilise un table hiérarchique, tu peux lister l'ensemble des données de ton fichier dans la table.

ex:
//On utilise une variable pour la recherche du niveau parceque le fichier n'est pas forcément dans l'ordre
nNiveau est un entier

//Parcours du fichier ou requete
pour TOUT nomenclature

//recherche du parent dans la table hiérarchique pour récupérer sa position dans la table
nNiveau = TableChercheFils(TABLEH_Hierarchique,nomenclature.tnomq_artm)

//si le parent n'est pas trouvé, on l'ajoute
SI nNiveau = -1 ALORS

// ajout du parent
TableAjoute(TABLEH_Hierarchique, nomenclature.tnomq_artm)
//récupération de la position du parent dans la table
nNiveau = TABLEH_Hierarchique..Occurrence

FIN

//ajout du fils dans la table pour son parent
TableAjouteFils(TABLEH_Hierarchique, nNiveau, nomenclature.tnomq_arte)

FIN
Publicado em junho, 05 2013 - 3:20 PM
complément d'unformation :

pour gérer x niveaux, il te suffit d'effectuer la recherche de parent sur les x niveaux et pas seulement sur le niveau 1 (recherche par défaut)

nX est un entier = 10 // maximum de niveau souhaité

//recherche parent déjà présent dans la table
pour i = 1 à nX //maximum de X niveaux

nNiveau = TableChercheFils(TABLEH_Hierarchique,nomenclature.tnomq_artm,i) //i => indice de niveau de recherche

SI nNiveau <> -1 SORTIR //on sort quand on trouve un parent qui correspond pour ne pas boucler inutilement

FIN
Membro registado
5 mensagems
Publicado em junho, 10 2013 - 10:59 AM
oki Marco mille fois merci !
Je teste ton idée et je fais un retour sur le forum.
:merci:

--
Développeur Windev (en herbe) sur WD14
Membro registado
5 mensagems
Publicado em junho, 10 2013 - 11:30 AM
Aïe je reviens sur le sujet j'ai testé ton code Marco sur le projet mais ça me fait une boucle infinie et rien ne s'affiche.... En fait mon fichier Nomenclature contient les nomenclatures de tous les produits de l'usine donc à peu près 200 000 lignes.
J'effectue déjà un premier tri au niveau 0 qui me donne les ensembles du premier niveau.
En d'autres mots je patauge dans les lignes de codes et j'arrive pas à trouver de solutions...

>> Marco, dans quel élément tu entres ton code ? L'initialisation de la table hiérarchique ou un bouton de génération ?

--
Développeur Windev (en herbe) sur WD14
Publicado em junho, 10 2013 - 2:58 PM
Bonjour,
je rentre mon code dans un bouton.

normalement, tu ne devrait pas avoir de boucle infini puisque ton fichier est défini et ton nombre de niveau également.

Voci un nouvelle exemple plus complet. Mais identique au précédent.
J'ai construit un tableau avec les données que tu as fourni en exemple pour simuler ton fichier HF.

tu peu placer ce code dans un bouton ou le placer dans une procédure exécuté à l'initialisation de ta table.

En premier lieu fait un test avec un bouton.

//tableau de test
tabNomenclature est un tableau de chaînes
TableauAjoute(tabNomenclature,"VELO"+TAB+"CADRE"+TAB+"1")
TableauAjoute(tabNomenclature,"VELO"+TAB+"ROUE"+TAB+"2")
TableauAjoute(tabNomenclature,"VELO"+TAB+"PHARE"+TAB+"1")
TableauAjoute(tabNomenclature,"CADRE"+TAB+"TUBE"+TAB+"4")
TableauAjoute(tabNomenclature,"CADRE"+TAB+"ECROU"+TAB+"6")
TableauAjoute(tabNomenclature,"PHARE"+TAB+"COQUE"+TAB+"1")
TableauAjoute(tabNomenclature,"ECROU"+TAB+"KIT GRAISSAGE"+TAB+"1")


//On utilise une variable pour la recherche du niveau parceque le fichier n'est pas forcément dans l'ordre
nNiveau est un entier
nX est un entier = 10 // maximum de niveau souhaité
sParent est une chaîne
sFils est une chaîne
nValeur est un entier
nIndice est un entier

//Parcours du fichier ou requete
POUR TOUT sEnregistrement DE tabNomenclature
//récupération des données => équivalence avec enregistrement d'une requete
sParent = ExtraitChaîne(sEnregistrement,1,TAB)
sFils = ExtraitChaîne(sEnregistrement,2,TAB)
nValeur = ExtraitChaîne(sEnregistrement,3,TAB)

//recherche parent déjà présent dans la table
POUR nIndice = 1 A nX //maximum de X niveaux

nNiveau = TableChercheFils(TABLEH_SansNom1.COL_Arbre,sParent,Vrai,nIndice) //i => indice de niveau de recherche

SI nNiveau <> -1 SORTIR //on sort quand on trouve un parent qui correspond pour ne pas boucler inutilement

FIN

//si le parent n'est pas trouvé, on l'ajoute
SI nNiveau = -1 ALORS
// ajout du parent
TableAjouteFils(TABLEH_SansNom1,Null, sParent)
//récupération de la position du parent dans la table
nNiveau = TABLEH_SansNom1..Occurrence
FIN
//ajout du fils dans la table pour son parent
TableAjouteFils(TABLEH_SansNom1, nNiveau, sFils,nValeur)
FIN
Membro registado
5 mensagems
Publicado em junho, 10 2013 - 3:41 PM
:merci::merci:
Superbe !
J'ai déjà testé avec un bouton sur le tableau de test puis sur le fichier Nomenclature ça fonctionne nickel.

Merci Marco !

--
Développeur Windev (en herbe) sur WD14
Publicado em outubro, 16 2017 - 7:15 PM
Bonjour
Par contre le code ne fonctionne pas si les liens ne sont pas dans le bon ordre :(
Publicado em abril, 22 2022 - 6:41 PM
i:)
bonjour mon ami
Je cherche une methode de facturation d'1 produit composé au momment de vente
P.Composé =Velo
Composants : HDD,RAM,Carte mere,Lecteur,...
Lors je facture l'article Composé(Ordinateur) je veux bien que la sortie des qtés touche uniquement le stock des composants

Sachant bien au moment des entrées des qtés, j'ai saisi uniquement le stock des composants et non de P.Composé