Bonjour à tous,
J'ai eu besoin de developper une fonction récursive qui permet de : quand on efface un élément, il faut supprimer tous ses sous élément récursivement.
Ces éléments sont tous classés dans une base de données avec un numéro, et un numéro père.
Ma fonction récursive fait :
-si un élément n'a pas de fils, alors on le delete de la BD
-sinon on cherche ses éléments fils et on appelle récursivement la fonction sur ces derniers.
Voici mon code :
Cependant, j'ai une erreur à un moment donné que je ne comprend pas (n'étant pas habitué à l'ASP).
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 <%Sub suppressionRepertoire(numElmt) 'récupération du nombre de fils du répertoire requete = "SELECT num as nbFils FROM FS_Partage WHERE pere = "&numElmt Response.Write("Comptage du nombre de fils pour "&numElmt&"<br/>") query oConn, oRS, requete If Not oRS.EOF Then nbFils = oRS.recordcount Response.Write("NB fils pour "&numElmt&" : "&nbFils&"<br/>") End IF 'si le répertoire n'a pas de fils c'est que l'on peut l'effacer if nbFils = 0 then 'effacement de l'élément requete2 = "DELETE from FS_Partage WHERE num ="&numElmt Response.Write("Suppression du répertoire numéro "&numElmt) query oConn, oRS, requete2 'sinon else Response.Write("Répertoire num "&numElmt&" en recherche"&"<br/>") 'on recherche tous les sous éléments du répertoire requete3 = "SELECT num FROM FS_Partage WHERE pere = "&numElmt query oConn, oRS, requete3 nbRow = oRS.recordcount 'pour chacun d'entre eux, on recommence. for i=1 to nbRow Response.Write("Recherche dans repertoire numéro "&oRS.fields("num")&"<br/>") suppressionRepertoire(oRS.fields("num")) oRS.movenext next end if End Sub%>
Voici les affichages que j'ai :
Comptage du nombre de fils pour 2
NB fils pour 2 : 2
Répertoire num 2 en recherche
Recherche dans repertoire numéro 3
Comptage du nombre de fils pour 3
error '80020009'
/IntraGDC/TESTPROD/partage.asp, line 50
La ligne 50 correspond à la ligne suivante :
Donc selon les affichages, le début fonctionne bien, l'algorithme trouve bien que l'éléments à 2 fils. Il appelle donc récursivement la procédure et au moment ou il doit compter le nombre de fils de cet élément, il fait cette erreur sans une once d'explication...
Code : Sélectionner tout - Visualiser dans une fenêtre à part requete2 = "DELETE from FS_Partage WHERE num ="&numElmt
J'aimerai savoir si l'un d'entre vous pouvait m'expliquer d'où vient le problème : niveau ASP, niveau BD ou niveau algorithmique ?
Merci beaucoup
A+
Matthieu
Partager