{Access}

Fermé
FrancoisR - 16 juil. 2009 à 18:18
 FrancoisR - 20 juil. 2009 à 21:01
Bonjour

J'ai lu pas mal de messages sans solution par rapport à la récursivité... c'est pourquoi je viens vous demander de l'aide en espérant avoir plus de chance !

J'ai une table avec dedans des enregistrements qui ont une relation père/fils.
Par exemple, "site-internet" est le fils de "publications", qui lui même est le fils de "communication".
Chaque enregistrement a donc son propre ID et l'ID de son père.

Je souhaite faire une requête récursive qui puisse m'insérer pour chaque enregistrement sa généalogie sous la forme : ../grandpère/père

Pourriez vous me guider ?

Merci beaucoup.

François
PS : cette requête doit être réalisée sous Access le plus possible avec SQL car je connais pas VBA

5 réponses

LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
16 juil. 2009 à 23:32
Normalement c'est très simple, si les tables sont liées, il n'y a qu'à choisir dans la requête les champs dans les tables correspondantes...
0
Un fils peut avoir un père, un grand père, un arrière grand père, etc...
Ce n'est pas d'un niveau 1 uniquement, c'est pourquoi j'ai du mal.

Apparemment je suis obligé de passer par un script, que j'essaye de rédiger mais ne connaissant pas VBA c'est difficile.
Si tu connais VBA, tu peux toujours me donner un coup de main j'ai pas mal avancé mais je bloque sur une erreur :

http://www.commentcamarche.net/forum/affich 13395999 erreur objet requis

Merci pour ton aide !

François
0
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
20 juil. 2009 à 12:00
Non, tu n'es absolument pas obligé de passer par VBA.

On a déjà eu ce problème avec quelqu'un qui voulait faire la généalogie de ses rongeurs je crois.

Tu n'as qu'à faira parraître plusieurs fois les mêmes tables dans la requête.
0
LatelyGeek Messages postés 1758 Date d'inscription vendredi 4 janvier 2008 Statut Membre Dernière intervention 5 janvier 2023 550
20 juil. 2009 à 12:01
0

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

Posez votre question
Merci de ta réponse !
J'ai fini par me mettre au VBA qui n'est pas un langage très dur, et grâce à une fonction récursive je peux calculer la généalogie.
Finalement c'est une bonne chose, car je m'aperçois que je pouvais pas échapper à VBA car j'ai écris une dizaine d'autres fonctions...

Voici ma fonction récursive :


Function getGenealogie(ID As Integer)
' Cette fonction prend en paramètre l'ID d'un enregistrement, et parcours tous les pères de celui-ci récursivement afin d'établir sa généalogie, donc sa place dans l'arborescence
' Entrée : Integer (ID de l'enregistrement)
' Sortie : String (le chemin complet avec des quotes et des slashs)

Dim ChnSQL As String ' variable contenant la requete SQL
Dim DB As Database ' variable contenant un pointeur vers la base de données
Dim myRec As Recordset ' variable contenant le retour de la requete
Dim IDPERE As Integer ' variable contenant l'id du parent
Dim INTITULE As String ' variable contenant l'intitule de l'objet courant
Dim CheminEnCours As String 'variable contenant le chemin en cours

If ID <> 0 Then

'On récupère les informations de l'intitulé en cours
Set DB = CurrentDb
ChnSQL = "SELECT CODE, ID, INTITULE, IDPERE FROM [NOMENCLATURE-ARCHIVES] WHERE ID=" & ID
Set myRec = DB.OpenRecordset(ChnSQL)
myRec.MoveFirst

With myRec
If myRec.AbsolutePosition > -1 Then
CODE = myRec("CODE")
INTITULE = myRec("INTITULE")
IDPERE = myRec("IDPERE")
End If
End With

'On ferme l'enregistrement
myRec.Close

'creation du chemin avec la page en cours
'Chr(34) correspond à l'insertion d'un double quote, nécessaire pour la création des répertoires sous UNIX afin de gérer les espaces dans les noms
CheminEnCours = Chr(34) & CODE & "-" & INTITULE & Chr(34) & "/"

'creation du chemin complet grace a un appel recursif
CheminComplet = getGenealogie(IDPERE) & CheminEnCours


Else
' return de fonction
getGenealogie = CheminComplet
End If

'On retourne la valeur du chemin
getGenealogie = UCase(CheminComplet)
End Function
0