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

Bases de données Delphi Discussion :

Déplacement d'un noeud d'un TTreeView et ADO


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 21
    Points
    21
    Par défaut Déplacement d'un noeud d'un TTreeView et ADO
    Bonjour à tous.

    Je ne rencontre pas vraiment de difficulté, mais étant débutant dans la manipulation de base de données, j'aimerai avoir vos observations sur la réalisation suivante :

    Dans une fiche, je remplis un TTreeview à partir d'une base de donnée à laquelle j'ai accès via les composants ADO.

    La table à partir de laquelle le Treeview est rempli contient notamment trois champs :
    - NumAuto (Clé primaire)
    - Nom (Nom affiché dans le Treeview)
    - Ordre (Ordre dans lequel l'affichage est fait dans le treeview)

    Lors de la sélection d'un élément du Treeview, les valeurs de tous les champs sont affichés dans des DBEdit.

    La fiche contient également deux boutons permettant de monter ou descendre le nœud sélectionné dans le Treeview.

    Le but est de mettre à jour la table lors du déplacement des nœuds du Treeview en modifiant le champ Ordre.
    Par exemple, j'ai les valeurs suivantes contenant l'ordre suivant :
    A | 1
    B | 2
    C | 3
    Si je sélectionne le deuxième élément (B) et que je le déplace vers le haut, ma table doit alors être mise à jour ainsi qu'il suit :
    B | 1
    A | 2
    C | 3

    J'arrive à faire tout cela, mais je me demande si ma conception est convenable. Merci de me faire part de vos avis sur les deux points suivants :

    1° - Pour savoir à quel élément de la table correspond le nœud sélectionné dans le Treeview, j'affecte lors du remplissage du Treeview à chaque Node.Data la valeur contenu dans le champs NumAuto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NewNode.Data:=pointer(strtoint(MyQuery.FieldValues['NumAuto']));
    Puis lors de la sélection d'un nœud du treeview, je me déplace dans le recordset en récupérant la valeur du data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SelectedID:=integer(MyTreeView.Selected.Data);
    MyDataSource.DataSet.Locate('NumAuto',SelectedID,[loCaseInsensitive])
    2° - Pour remplir le Trreview à partir de la basse de donnée, j'ai recours aux composant ADO suivants :
    TADOConnection (Pour me connecter à la base de donnée)
    TADOTable (Pour indiquer la table contenant les valeurs à afficher)
    TADOQuery (Pour sélectionner les éléments de la tables à afficher)
    TdataSource (Je sais pas trop à quoi çà sert mais j'ai ai besoin pour utiliser le TADOQuery, et pour faire des recherches)

    Après le déplacement d'un des nœuds du treeview au moyen de la fonction MyNode.MoveTo, il convient de mettre à jour deux valeurs du champs ordre : Celui du nœud déplacé, et celui étant affecté par le déplacement.
    Pour cela, je procède ainsi qu'il suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    MyDataSource.DataSet.Locate('NumAuto',integer(NodeRicochet.Data),[loCaseInsensitive])
    MyDataSource.DataSet.Edit;
    MyDataSource.DataSet.FieldByName('Ordre').Value:=OrdreAncien;
    MyDataSource.DataSet.UpdateRecord;
    MyDataSource.DataSet.Locate('NumAuto',integer(NodeToMove.Data),[loCaseInsensitive])
    MyDataSource.DataSet.Edit;
    MyDataSource.DataSet.FieldByName('Ordre').Value:=OrdreNouveau;
    MyDataSource.DataSet.UpdateRecord;
    Merci d'avance pour vos remarques et critiques, et notamment, de l'utilisation :
    - Du Data du nœud pour connaître à quel enregistrement de la base de donnée correspond l'élément sélectionné dans le Treeview
    - De la fonction Locate pour se positionner sur l'enregistrement souhaité et de l'utilisation du composant DataSource pour modifier les valeurs.

    A+

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Sur le principe je dirais tout cela reste cohérent, cependant j'ai quelques remarques:

    1. Dans la mesure où il n'y a pas de hiérarchie Père/Enfant dans tes données pourquoi avoir choisi un TTreeView ?
    2. Je ne vois pas dans l'immédiat l'intérêt d'utiliser un TADOTable et un TADOQuery. Un seul devrait suffire tant pour l'affichage que pour le déplacement.


    De plus:
    Citation Envoyé par mestressat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NewNode.Data:=pointer(strtoint(MyQuery.FieldValues['NumAuto']));
    Ton champ NumAuto est de type string ?
    Citation Envoyé par mestressat
    TdataSource (Je sais pas trop à quoi çà sert mais j'ai ai besoin pour utiliser le TADOQuery, et pour faire des recherches)
    Je pense qu'il est surtout là pour effectuer la liaison avec tes TDBEdit.

    Voilà.

    @+ Claudius

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    numauto est integer
    MyDataSource.DataSet.Locate('NumAuto',integer(NodeToMove.Data),[loCaseInsensitive])
    mais ma question est sur
    MyDataSource.DataSet.UpdateRecord;
    , il est normalement utilisé avec le cache non??
    pour locate c'est ce que j'utlise moi aussi (avec des petit et moyen BD)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Février 2006
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Merci pour vos remarques.

    Pour répondre à vos questions :
    - J'ai choisi un Treeview parce qu'il y a une hiérarchie... mais mes interrogations n'étant pas sur ce point, je n'ai pas indiqué la totalité des champs de ma table pour essayer de ne pas noyer ma demande dans un flot d'informations sans intérêts
    - Mon Champs NumAuto est de type Integer. Je vais essayer cela :
    NewNode.Data:=pointer(MyQuery.FieldValues['NumAuto']);
    - Je ne sais pas ce qu'est le cache. J'utilise UpdateRecord pour enregistrer les modifications. Vaut-il mieux un post ?

    Et pour rebondir, pour les grosses BD, que faut-il utiliser à la place de locate ?

    Enfin, j'ai souvent poser des questions dans les forums, mais je suis rarement capable d'apporter des réponses aux autres.
    Cependant là, je me suis bien pris la tête avec le Treenode et sa relation avec une base de donnée. Je pense pouvoir faire partager cette petite expérience. Pourrait-il être utile que je retranscrive cela dans une sorte de tutoriel ? Si oui, quelqu'un pourra-t-il me corriger ?

    Merci encore à tous

    A+

  5. #5
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    Personnelement j'utilise Locate pour mes recherches sinon je passe par des requêtes SQL c'est plus pratique.
    Quant au choix entre post et Updaterecord, la différence à ma connaissance n'est pas très grande.
    Un conseil DBNavigator à éviter avec ADO
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/08/2013, 03h53
  2. Sélection de plusieurs noeuds d'un TTreeview
    Par Mercusyo dans le forum C++Builder
    Réponses: 1
    Dernier message: 12/12/2012, 16h19
  3. Comment se positionner sur un noeud d'un TTreeView ?
    Par Cazaux-Moutou-Philippe dans le forum Langage
    Réponses: 3
    Dernier message: 18/01/2008, 10h54
  4. [VB6]Déplacement de Noeud dans un branche...
    Par Moskito dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 09/03/2006, 10h34
  5. Couleur des noeuds ds 1 TTreeView
    Par vincent DD dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/09/2002, 13h54

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