{Access}

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

  • Votes
  • Date
  • Date décroissante
  1. 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...
    1. 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
      1. 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.
        1. 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