Recursivite

Résolu
redrad Messages postés 8 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 10 août 2007 - 27 déc. 2005 à 13:11
redrad Messages postés 8 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 10 août 2007 - 29 déc. 2005 à 10:22
Bonjour

Voici mon problème

Sur un programme Vba Access j'utilise une fonction récursive que voici qui fonctionne très bien :

Function Nomenclature(Article As String, Rang As Long, Variante As String)

Set Db = CurrentDb
Sql = "SELECT * FROM Nomenclature" & " WHERE [Article]='" & Article & "' " & "AND [Variante]='" & Variante & "' ORDER BY [Composant]"
Set Rs = Db.OpenRecordset(Sql)

With Rs
If .RecordCount > 0 Then
.MoveFirst
Do While Not .EOF
MsgBox .Fields("Composant")
Call Nomenclature(.Fields("Composant"), Rang + 1, .Fields("Variante_Comp"))
.MoveNext
Loop
End If
.Close
End With
Rang = Rang - 1

End Function

j'ai traduit cette même fonction en delphi
que voici :

Procedure Nomenclature (Article : String ; Rang : Integer ; Variante : String) ;

begin


Sql :='Select * From Nomenclature Where [Article]=' +
QuotedStr(Article) + ' And [Variante]=' + QuotedStr(Variante) + ' ORDER BY [Composant]';
Rs:=CoRecordset.Create
RS.Open(Sql, Cnx, adOpenStatic, adLockOptimistic, adCmdText );

With RS do Begin
if (RecordCount > 0) then begin
MoveFirst;
While Not EOF DO Begin
Showmessage (Fields['Composant'].Value + '///'+ Article);
Nomenclature(Fields['Composant'].Value, Rang + 1,Fields['Variante_Comp'].Value) ;
MoveNext;
end ;
end ;
Close ;
end ;
Rang:=Rang - 1

end ;


mais le problème c'est que elle ne fonctionne pas de la même façon au niveau du recordset
redrad

5 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
28 déc. 2005 à 17:19
pourrait tu nous preciser de quelle façon elle ne fonctionne pas ?

resultat erroné ?
erreur de compilation ?
erreur d'execution ?
debordement de memoire ?

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
3
redrad Messages postés 8 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 10 août 2007
28 déc. 2005 à 21:15
redrad
0
redrad Messages postés 8 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 10 août 2007
28 déc. 2005 à 21:24
Procedure Nomenclature (Article : String ; Rang : Integer ; Variante : String) ;

begin

Sql :='Select * From Nomenclature Where [Article]=' +
QuotedStr(Article) + ' And [Variante]=' + QuotedStr(Variante) + ' ORDER BY [Composant]';
Rs:=CoRecordset.Create
RS.Open(Sql, Cnx, adOpenStatic, adLockOptimistic, adCmdText );

With RS do Begin
if (RecordCount > 0) then begin
MoveFirst;
While Not EOF DO Begin
Nomenclature(Fields['Composant'].Value, Rang + 1,Fields['Variante_Comp'].Value) ;

//LE PROBLEME SE TROUVE ICI SUR LE MOVENEXT
//IL M'EST IMPOSSIBLE DE PASSER A L'ENREGISTREMENT
//SUIVANT CAR LE RECORDSET EST FERMER
//ALORS QU'EN VB JE POUVAIS PASSER A L'ENREGISTREMENT SUIVANT UNE FOIS LA PREMIERE RECURSIVITE FINI
MoveNext;
end ;
end ;
Close ;
end ;
Rang:=Rang - 1

end ;

j'espère avoir était clair

Merci
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 déc. 2005 à 04:18
deja je pense que tu ne devrais pas créer RS dans ta procedure ... cela semble illogique et peu posé probleme avec la recursivitée.

a moins de faire un truc genre :

if RS = nil then RS := CoRecordSet.Create;

a part cela ... tout a l'air bon j'ai l'impression.

<hr size="2" width="100%">La theorie c'est quand on sait tout, mais que rien ne fonctionne.
La pratique c'est quand tout fonctionne, mais que personne ne sait pourquoi.
<hr>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
redrad Messages postés 8 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 10 août 2007
29 déc. 2005 à 10:22
j'ai essayé est toujours le même problème
Ma base de donnée est une Nomenclature voici un exmple
//Structure de ma base de donnée
Champ Composé Champ Composant
15-811655 501-811655
15-811655 502-811655
501-811655 0043-0010
501-811655 0044-0010
502-811655 0040-0050


//Le résultat que je veux obtenir est celui ci :
Rang Article
1 15-811655
2 501-811655
3 0043-0010
3 0044-0010
2 502-811655
3 0040-0050


Merci d'avance
0
Rejoignez-nous