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

SQL Firebird Discussion :

Algo lecture arbre ou requête


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut [Résolu]Algo lecture arbre ou requête
    Bonjour à tous
    Voilà, j'ai les familles d'articles suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE FAMILLE_ARTICLE (
        CODE_FAMILLE_ARTICLE INTEGER NOT NULL,
        CODE_FAMILLE_PERE INTEGER,
        NOM_FAMILLE_ARTICLE VARCHAR(30));
    J'ai des articles rattachés à une famille (et une seule).
    L'article peut être rattaché à n'importe quelle branche de l'arbre.
    Je voudrais, en Delphi, soit lire toutes les familles et leurs descendantes à partir d'un noeud de l'arbre, pour mettre dans une liste de chaînes les codes familles. Puis traiter cette liste pour en faire des requêtes pour obtenir les articles de la famille sélectionnée et de ses descendants.

    Avez-vous un algo qui fait ça ?
    J'imagine qu'une vue qui permettrait d'avoir tous les code familles (plutôt que de construire par un programme la liste de chaîne), est un doux rêve.

    @+
    fp

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonsoir,

    Pour une réponse Delphi il serait préférable d'aller dans le forum Delphi SGBD.

    Sinon une solution interbase :

    Prendre une solution à base d'une vue est un peu utopique ou du moins serait limité à un nombre de niveau.

    Je plus propre étant de faire une procédure stockée.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Toujour un problème d'algo
    Merci de cette réponse,
    J'ai posté sur le forum Delphi.
    Effectivement les procédures stockées ne sont pas mon fort. Tout au plus j'en ai modifiées quelques-unes. Je pense toujours dans l'ordre: requête, traitement puis vue.
    Dans ce cas le problème reste de trouver l'algo qui permette de faire ça.
    De mes vagues souvenirs de "l'école", je mense savoir que c'est hautement récursif comme problème.
    @+
    fp

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Oui si la profondeur de ton arbre n'est pas limité, le plus simple est de faire des appels récursifs.

    Ce qui reste relativement facile à faire en PS et sera certainement plus performant que des appels depuis Delphi.

    Le principe etant de faire une PS MON_ARBRE avec en entrée :
    Niveau (niveau dans l'arborescence 0 pour la première fois)
    PERE (identifiant du pere. NULL pour la première fois)

    En sortie les colones utiles de la table "famille article" et les colonnes utilises de la table "Articles".

    le corps de la PS MON_ARBRE():

    For select liste des colones utilies famille article..... from Famille_Article where code_famille_pere= :NIVEAU into :liste des variables de sortie des colones famille_article do
    begin
    Mise à null liste des variables de sorties Articles;
    suspend;
    for select liste des colones utiles Articles from articles
    where artcle_code_famille= :CODE_FAMILLE_ARTICLE into
    liste des variables de sorties Articles do
    begin
    Eventuellement Mise à null de liste des variables de sortie des colones famille_article sauf de CODE_FAMILLE_ARTICLE bien entendu
    suspend;
    end;

    EXECUTE PROCEDURE MON_ARBRE :NIVEAU+1, :CODE_FAMILLE_ARTICLE RETURNING_VALUES liste des variables de retour;
    end
    Voilà à quoi ça pourait ressembler, il y a certainement des erreurs mais l'esprits y est...

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    La solution à niveau illimité et sans récursivité est ici :
    http://sqlpro.developpez.com/Tree/SQL_tree.html

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 51
    Points : 32
    Points
    32
    Par défaut Merci
    J'ai tardé pour répondre.
    Merci de vos réponses,
    L'article est intéressant.
    Mais comme je ne peux pas changer le modèle de données, j'ai eu recour à un algo tout simple. Pas performant mais qui a d'autres avantages.
    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
     
    Trouve = Vrai
    Liste_noeud <- Famille_selectionnee
    Tant que Trouve= Vrai
      Tant que non fin de liste_famille
        Si pere appartient Liste_noeud et famille n'appartient pas a Liste_noeud
          Liste_noeud <-  famille
           Trouve = Vrai
        fsi
        Si Trouve = vrai
          Se remettre en debut de liste
          Trouve = False
        fsi
      ftq
    ftq
    @+
    fp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Complexité] Résolution d'une équation de récurrence (algo d'arbre)
    Par sjrd dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 01/12/2007, 11h59
  2. Problème de lecture d'une requête
    Par philippef dans le forum Langage
    Réponses: 3
    Dernier message: 15/05/2007, 11h50
  3. algo d'arbre binaire
    Par sad-evil dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 09/10/2006, 16h44
  4. Cherche principe lecture arbre
    Par Invité(e) dans le forum C
    Réponses: 6
    Dernier message: 03/05/2006, 23h03
  5. inverser la lecture d'une requète
    Par nilaco dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/08/2003, 12h16

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