perte de la source de données dans une procédure récursive
Bonjour, pour une fois je vous soumets un problème hyper simple à expliquer, j'ai une procédure de calcul de cout d'une gamme de fabrication.
Cette gamme de fabrication est concue comme un arbre orienté, donc avec des noeuds qui pointent vers des suivants, tout ça dans un table sql server qui s'appelle gam.
Donc je parcours mon "arbre" de fabrication en partant du sommet (la dernière opération d'une gamme pointe vers une opération fictive 0) et je distribue de manière récursive ma procédure sur les différents fils de mon noeud courant.
Jusqu'ici que du classique.
Donc ça fonctionne bien tant que je descends dans l'arbre, ça plante au premier retour de procédure dans le TANT QUE, au HLitSuivant(Rs). L'erreur est la suivante :
Citation:
Vous avez appelé la fonction HLitSuivant.
Fichier <Rs> inconnu dans l'analyse, ou requête ou vue non initialisée.
Comme s'il avait perdu ma source de données au cours des différents appels récursifs.
Voici la procédure si vous voyez qqchose qui vous choque, pourtant le récursif j'ai plutôt l'habitude, mais c'est une première sos windev :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| PROCEDURE CoutFabrication(LOCAL aid est un entier, LOCAL op est un entier)
Rs est une Source de Données
Rs2 est une Source de Données
Sql est une chaîne
cout_op est un numérique
cadence_op est un numérique
nom_atelier est une chaîne
taux_atelier est un numérique
cout_enfants est un numérique
cout_fab est un numérique
cout_composants est un numérique
cout_apres_op est un numérique
// ON VA CHERCHER L'ATELIER DE L'OP, LE COUT ...
Sql = "SELECT * FROM gam, atl WHERE gam_article = " + aid + " AND gam_op = " + op + " AND gam_atelier = atl_id"
SI PAS HExécuteRequêteSQL(Rs,Cnx,hRequêteDéfaut ,Sql) ALORS
Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo()+ RC + RC + Sql)
RENVOYER -1
FIN
SI HLitPremier(Rs) ALORS
cout_op = Rs.gam_cout
cadence_op = Rs.gam_cadence
nom_atelier = Rs.atl_nom
taux_atelier = Rs.atl_taux
FIN
// on prend la gamme de l'article est on descend l'arbre progressivement jusqu'aux feuilles (op initiales)
Sql = "SELECT * FROM gam, atl WHERE gam_article = " + aid + " AND gam_op_suivante = " + op + " AND gam_atelier = atl_id"
SI PAS HExécuteRequêteSQL(Rs,Cnx,hRequêteDéfaut ,Sql) ALORS
Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo()+ RC + RC + Sql)
RENVOYER -1
FIN
cout_enfants = 0
HLitPremier(Rs)
TANTQUE PAS HEnDehors(Rs)
cout_enfants = cout_enfants + CoutFabrication(aid, Rs.gam_op)
HLitSuivant(Rs)
FIN
SI op <> 0 ALORS
// DANS TOUS LES CAS ON CALCULE LE COUT DE FABRICATION, LE COUT EN COMPOSANTS
// CALCUL DU COUT DE FABRICATION
SI nom_atelier = "STRAITANCE" ALORS
cout_fab = cout_op
SINON
cout_fab = taux_atelier / cadence_op
FIN
Info(cout_fab)
// COUT DES COMPOSANTS
Sql = "SELECT * FROM nmcl, art WHERE nmcl_article = " + aid + " AND nmcl_op = " + op + " AND nmcl_fourniture = art_id"
SI PAS HExécuteRequêteSQL(Rs2,Cnx,hRequêteDéfaut ,Sql) ALORS
Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo()+ RC + RC + Sql)
RENVOYER -1
FIN
HLitPremier(Rs)
TANTQUE PAS HEnDehors(Rs2)
cout_composants = cout_composants + Rs2.art_prix_revient
HLitSuivant(Rs2)
FIN
cout_apres_op = cout_enfants + cout_fab + cout_composants
Sql = "UPDATE gam SET gam_cout_avant_op = " + cout_enfants + ", gam_cout_apres_op = " + cout_apres_op + " WHERE gam_article = " + aid + " AND gam_op = " + op
SI PAS HExécuteRequêteSQL(Rs2,Cnx,hRequêteDéfaut ,Sql) ALORS
Erreur("Erreur d'initialisation de la requête"+RC+HErreurInfo()+ RC + RC + Sql)
RENVOYER -1
FIN
FIN
RENVOYER cout_apres_op |
Comme d'habitude je vous remercie par avance car je suis certain que la solution va fuser !!!
Merci