Fonction recursive [Résolu]

Signaler
Messages postés
64
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
27 septembre 2007
-
Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016
-
salut, j'aun probleme dans ma fonction recursive que j'ai ecrit en vba, j'ai trouver le probleme mais je ne sais pas le reparer:

if  recursive(XXX1 ,XXX2 )=true then
       return true
end if

je ne veut pas ecrire qlqchose comme return recursive(XXX1,XXX2) car je voudrai pas renvoyer la valeur faux

le probleme c'est que recursive(XXX1 ,XXX2 ) renvoi false (je l'est verifier avec un affichage) mais elle entre quand meme dans le test if (et donc a la fin je renvoi true)

est ce que qlq sait pourquoi?

12 réponses

Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Voilà, c'est bien ce que je pensait. Tu confond avec le return.



infoNonUtilise False ou infoNonUtilise True ne fait pas sortire de la fonction.
Il faut ajouter un Exit Function après.








__________
Kenji

(


Nouveau forum VBA/Office
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
52
Salut,
(j'espere ne pas dire de bêtise)
Return True en vba n'est pas la syntaxe pour renvoyer une valeur pour une focntion (ca l'est en .NET, mais pas en VBA)

essaie plutot
'jsai pas si c'est clair
If recursive(XXX1, XXX2) = True Then
     recursive(XX1, XX2) = True 'XX1 etant les valeur avant d'appeler la second recursive
End If , ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Salut,

J'aurais plutot mis
if recursive(XXX1 ,XXX2 )=true then
  recursive = true
  Exit Function
end if







__________
Kenji

(


Nouveau forum VBA/Office
Messages postés
64
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
27 septembre 2007

salut, merci pour vos reponse

j'ai essayer les deux solution mais ca donne la meme chose...

(vous aviez raison return true ne fonctionne pas du tout)
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
52
Salut,
Si elle n'est pas trop grosse, peu être pourrais tu mettre le code de la dite fonction

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
64
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
27 septembre 2007

elle est grosse et compliqué ..... j'ai mis en rouge la valeur de retour et le test:

Function infoNonUtilise(base, NomTable, Id)
    Dim resultatFinal As Boolean
    Dim maxRelation As Integer
    Dim RecordsetMaxRelation As DAO.Recordset
    Dim RecordsetClePrimaire As DAO.Recordset
    Dim RecordsetTemp As DAO.Recordset
    Set RecordsetMaxRelation = CurrentDb.OpenRecordset ("SELECT * FROM relationTableCEP where TableClasse2='" & NomTable & "'", dbOpenDynaset)

    If RecordsetMaxRelation.EOF = False Then
        RecordsetMaxRelation.MoveFirst

        Do While RecordsetMaxRelation.EOF = False
            Set RecordsetTemp CurrentDb.OpenRecordset("SELECT " & RecordsetMaxRelation("TableClas<wbr>se1") & ".dtmaj as dateMAJ FROM " & RecordsetMaxRelation("TableClas<wbr>se1") & "," & RecordsetMaxRelation("TableClas<wbr>se2") & " where " & RecordsetMaxRelation("TableClas<wbr>se1") & "." & RecordsetMaxRelation("FK") & " " & RecordsetMaxRelation("TableClas<wbr>se2") & "." & RecordsetMaxRelation("PK"), dbOpenDynaset)
            If RecordsetTemp.EOF = False Then
MsgBox (RecordsetMaxRelation("TableCla<wbr>sse1") & "-->" & RecordsetMaxRelation("TableClas

<wbr>se2"))
                RecordsetTemp.MoveFirst
                If Format(RecordsetTemp("dateMAJ"<wbr>), "yyyy") > Trim(Format(Date, "yyyy") - 3) Then

                    infoNonUtilise = False
                Else </wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

                    Set RecordsetClePrimaire = CurrentDb.OpenRecordset("SELECT * FROM niveauTableCEP where nomTable='" & RecordsetMaxRelation("TableClas<wbr>se1") & "'", dbOpenDynaset)
                    RecordsetClePrimaire.MoveFirst</wbr>

                   
If infoNonUtilise(base, RecordsetMaxRelation("TableClas<wbr>se1"), RecordsetClePrimaire("cle")) = false Then
                        infoNonUtilise = False
                    End If</wbr>
                End If
            End If
            RecordsetMaxRelation.MoveNext
        Loop
    Else

        infoNonUtilise = True
    End If
   

End Function
Messages postés
64
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
27 septembre 2007

ca m'etonnerai que vous lisiez ca.....

je veut juste savoir pourquoi le test if recursive(XXX1 ,XXX2 )=true then est tjs vrai...
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
30
Juste en regardant le code, je propose
Ne faudrais t-il pas sortire de la fonction après

infoNonUtilise = False
?


Sinon, ben un débuggage pas-à-pas s'impose (ca risque être long mais il faut être patient)







__________
Kenji

(


Nouveau forum VBA/Office
Messages postés
64
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
27 septembre 2007

infoNonUtilise = False 
est dans un if, on sort si cette condition est verifier

en tout cas ya un truc qui cloche, j'ai mis un msgbox avant et apres le
infoNonUtilise = True

MsgBox("test1")
infoNonUtilise = True
MsgBox("test2")

et la il m'affiche les deux.......  il ne doit pas afficher la deuxieme non??
et vu que il renvoi pas true il entre dans le test...
Messages postés
64
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
27 septembre 2007

ahhhhh ok dac, merci bien je v essayer
Messages postés
64
Date d'inscription
mardi 5 septembre 2006
Statut
Membre
Dernière intervention
27 septembre 2007

merci c super ca marche :DDDDD
Messages postés
201
Date d'inscription
mardi 7 octobre 2003
Statut
Membre
Dernière intervention
10 mai 2016

j'ajouterai que pour éviter les retours d'erreur à la con ,
déclare ta fonction avec le type retourné :

Function infoNonUtilise(base, NomTable, Id) as boolean

en plus, sans ça, tu pourrais avoir des surprise d'utilisation mémoire...

coïto ergo sum