IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Déplacer une branche d'un arbre dans une arborescence


Sujet :

Langage SQL

  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut Déplacer une branche d'un arbre dans une arborescence
    Bonjour à tous,

    J'ai construit une arborescence en suivant à la lettre cet exemple:
    http://sqlpro.developpez.com/cours/arborescence/

    Tout marche à merveille seulement, j'aimerais avoir la possibilité de déplacer une branche dans l'arbre en choisissant son parent.
    J'ai fait des trucs comme ça mais ça ne marche pas pour tous les cas de figures:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    procedure TcdrInventaire.deplacerLieu(id, idParent: Integer);
    var lie,lieTemp,lieParent: lieu;
    begin
      lie := getLieu(id);
      lieParent := getLieu(idParent);
      // Ajouter l'espace nécessaire
      req := 'UPDATE lieux SET liefin=liefin+'+IntToStr((lie.fin+1)-lie.deb)+' WHERE liefin>='+IntToStr(lieParent.fin);
      EffectuerRequeteDivers(req);
      req := 'UPDATE lieux SET liedeb=liedeb+'+IntToStr((lie.fin+1)-lie.deb)+' WHERE liedeb>='+IntToStr(lieParent.fin);
      EffectuerRequeteDivers(req);
      // Déplacer les bornes
      lieTemp := getLieu(id);
      req := 'UPDATE lieux SET liedeb=liedeb-('+IntToStr((lie.fin+1)-lieParent.fin)+'),liefin=liefin-('+IntToStr((lie.fin+1)-lieParent.fin)+'), '
        +'lieniv='+IntToStr(lieParent.niv+1)+' WHERE liedeb>='+IntToStr(lieTemp.deb)+' AND liefin<='+IntToStr(lieTemp.fin);
      EffectuerRequeteDivers(req);
      // Supprimer l'espace vide
      req := 'UPDATE lieux SET liefin=liefin-'+IntToStr((lie.fin+1)-lie.deb)+' WHERE liefin>='+IntToStr(lie.deb+((lie.fin+1)-lie.deb));
      EffectuerRequeteDivers(req);
      req := 'UPDATE lieux SET liedeb=liedeb-'+IntToStr((lie.fin+1)-lie.deb)+' WHERE liedeb>='+IntToStr(lie.deb+((lie.fin+1)-lie.deb));
      EffectuerRequeteDivers(req);
    end;
    Lieu est une structure de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      type lieu = record
          id,parent,niv,deb,fin: Integer;
          code,lib: String;
      end;
    Quel est le pb ?

    Merci d'avance.

  2. #2
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    En se basant sur l'exemple du cours, admettons que je veuille déplacer avion dans terrestre(faire un avion sans ailes, quoi ).

    Pour préparer l'espace, ça marche bien... C'est après que ça coince !

  3. #3
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Salut,

    Pense au minimum à respecter les Conseils à lire avant de poster, perso, Je ne connais pas le langage utilisé dans ta procédure, et en outre, tu ne décris pas vraiment le problème que tu rencontres ...

    Néanmoins, ce souci ayant déjà été posé, je te renvoie au post suivant (trouvé via une recherche sur le mot "intervallaire") : Gestion d'arbres par représentation intervallaire

    La solution est donnée en T-SQL, à toi de voir si tu comprends et si peux adapter,

    Bon courage,
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour Xo,

    Je connais très bien ces règles et fait au mieux pour les respecter...

    J'ai effectué des recherches avant de poster, seulement, je ne savait pas que mon besoin était lié au mot "intervallaire" (que j'utilise peu, voire pas du tout).

    Pour ce qui est du langage, c'est du Pascal (Delphi) mais peu importe car ce qui compte c'est les requetes (j'ai mis le code pour le nom des variables).

    Le lien que tu m'as donné est sympathique mais je ne peux pas l'utiliser car je suis en access et le transac SQL, c'est pas trop ça...
    Je pense que je vais faire une boucle sur les elements désirés, les inserer dans l'endroit destination et les supprimer de l'endroit d'origine ensuite.
    Ca m'embête car c'est lourd et source d'erreur mais je croit que je suis devant un mur.

    Merci pour la rapidité de ta réponse.

Discussions similaires

  1. Réponses: 40
    Dernier message: 21/06/2007, 17h58
  2. Réponses: 22
    Dernier message: 11/06/2007, 23h24
  3. Réponses: 1
    Dernier message: 16/05/2007, 12h51
  4. [MySQL] récupérer dans une boucle chaque information MySQL dans une variable différente
    Par gtenthorey dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/05/2007, 22h34
  5. Réponses: 2
    Dernier message: 20/06/2006, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo