{Access}

FrancoisR -  
 FrancoisR -
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
Configuration: Linux
Epiphany 2.22

5 réponses

  1. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    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
  2. FrancoisR
     
    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
  3. LatelyGeek Messages postés 1774 Date d'inscription   Statut Membre Dernière intervention   550
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. FrancoisR
     
    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