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 :

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 : Sélectionner tout - Visualiser dans une fenêtre à part
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