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 :

Effectuer une sélection sur un TClientDataSet


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut Effectuer une sélection sur un TClientDataSet
    J'utilise des données que le client, pour des raisons de confidentialité, souhaite enregistrer en format binaire.

    Pour les manipuler je voudrais les charger dans un TClientdataSet.
    Mon problème est que cet objet ne reconnaît pas le SQL.
    Je voudrais donc savoir :
    - si il existe un équivalent permettant de gérer des données en mémoire en disposant du SQL
    - si j'utilise des commandes Filter sur un TClientDataSet je risque d'avoir des pertes de performances. Les données une fois chargées en mémoire ne sont jamais modifiées, je pense que cela devrait aller mais j'aimerais avoir un autre avis

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations forums :
    Inscription : Septembre 2006
    Messages : 6
    Par défaut
    Salut,

    tu utilises quoi comme SGBD et comme type de connection entre Delphi et ta BD (dbExpress,BDE,ADO,...)?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2003
    Messages : 51
    Par défaut
    Salut,

    Pour récupérer des données sql dans un ClientDataset, personellement j'utilise deux métohdes :
    . Ouverture du'un query et boucle sur ce dernier pour charger manuellement le ClientDatset :
    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
     
    Query.close;
    Query.open;
    ClientDataset.Close;
    ClientDataset.CreateDataset;
    While not Query.eof do
    begin
      ClientDataset.Append;
      for i := 0 to Query.fields.count - 1 do
    // Le try..except est là au cas où il ya des champs supplémentaires dans 
    //ton query pour éviter une erreur
      try
        ClientdatSet.fieldbyname(Query.Fields[i].fieldname).Value :=Query.Fields[i].Value;
      except 
      end;
      ClientDataset.Post;
      Query.post;
    end;
    La méthode est simple à mettre en oeuvre mais par contre ne doit être utilisée plutôt que pour de petits ou moyens ensmeble de données. Sinon cela te charge tout en mémoire et peut rpendre du temps.

    . La seconde méthode est de passer par un TProvider. En gros, il te faut une chaine de composant de ce type :
    TQuery --> TProvider --> TClientDataSet
    en les liant de la manière suivante :
    TProvider.dataset = TQuery
    TCLientDataset.Provider = TProvider.
    Pour l'ouverture cela se gère ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      CLientDataset.Close;
      ClientDataset.Open;
    Et tout simplement ton ClientDataset se retrouve chargé avec la possibilité de limiter le nombre d'enregistrement ramené à l'ouverture par la propriété PacketRecords de ton ClientDataset.

    Voilà voilà
    Bon dev à toi

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    Je travaille en Delphi 6 avec des objets TADO
    Le moteur de base est variable : Access ou MySQL

    Mon problème n'est pas de charger le TClientDataSet mais d'utiliser ce qu'il y a dedans avec une méthode de sélection la plus proche possible de SQL.

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Citation Envoyé par Delphi-ne
    J'utilise des données que le client, pour des raisons de confidentialité, souhaite enregistrer en format binaire.

    Pour les manipuler je voudrais les charger dans un TClientdataSet.
    Mon problème est que cet objet ne reconnaît pas le SQL.
    Je voudrais donc savoir :
    - si il existe un équivalent permettant de gérer des données en mémoire en disposant du SQL
    - si j'utilise des commandes Filter sur un TClientDataSet je risque d'avoir des pertes de performances. Les données une fois chargées en mémoire ne sont jamais modifiées, je pense que cela devrait aller mais j'aimerais avoir un autre avis
    Pourquoi passer par le TClientDataSet, les TAdoQuery ne te suffisent pas ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    Je veux bien utiliser les ADOQuery. je les utilise d'ailleurs sur l'ensemble de l'application.
    Le problème est que je ne peux pas stocker les données sous forme de table mais dans un fichier binaire.
    Je sais charger un fichier binaire dans un TClientDataSet avec un loadFromFile mais mon problème se pose après pour effectuer des sélections dessus.
    Ma question est donc de trouver le moyen de combiner les deux : charger un fichier binaire dans un composant mémoire et faire ensuite des sélections.
    A bientôt

  7. #7
    Membre Expert 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
    Par défaut
    filtered sufira largement par example (like) marche trés bien
    pour le trie tu choisi simplement le colone et clientdataset fait l'affaire
    n'oublie pas (disablecontrol et enablecontrol) pour diminuer le temp d'acée au control par clientdataset qu'on tu fait tes manupulations

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Par défaut
    Je préférais avoir cette confirmation.
    J'ai conservé un mauvais souvenir des filtres successifs appliqués sur des TTable.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/09/2006, 14h04
  2. Faire une sélection sur une image en MFC
    Par rider74 dans le forum MFC
    Réponses: 2
    Dernier message: 04/05/2006, 13h55
  3. une requete effectuant une recherche sur tous les champs
    Par raynor911 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/02/2006, 15h06
  4. Faire une sélection sur une image?
    Par sybilla dans le forum MFC
    Réponses: 3
    Dernier message: 29/08/2005, 13h34
  5. Réponses: 1
    Dernier message: 28/03/2005, 12h33

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