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 :

ClientDataSet créé dynamiquement


Sujet :

Bases de données Delphi

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 174
    Points : 38
    Points
    38
    Par défaut ClientDataSet créé dynamiquement
    Bonjour,

    J'essaie en vain de créer par le code plutôt qu'en les posant sur un fiche la grappe des 3 composants :
    TSQLDataSet <- TDataSetProvider <- TClientDataSet
    Il y a des trucs particuliers à faire pour que cela fonctionne ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Inspire toi de ma réponse dans Kbmmemtable / DisableControls / DbGrid

    Un code que j'ai dans mon projet actuel, si cela peut t'inspirer
    C'est un cas particulier où je recopie les données d'un TSQLQuery dans un TClientDataSet, sachant que le TSQLQuery sera libéré avant même que l'on affiche le TClientDataSet dans des TDBEdit, TDBCheckBox ...

    Code c++ : 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
    //---------------------------------------------------------------------------
    /*constructor*/__fastcall T****HardwareAbstractEntity::T****HardwareAbstractEntity(T*****HardwareAbstractModel* AModel)
    {
      FModel = AModel;
     
      // J'hésite à gérer le CDS et DSP en Lazy Loading (surtout pour le mode Use qui ne les utilise pas) !
      FProviderDS = new TDataSetProvider(NULL);
      // FProviderDS n'a pas de DataSet pour le Moment !
      // Fourni un cache d'édition avec les Composants DB car on ne pas modifier le contenu d'un TSQLQuery
      // Par Défaut LogChanges est à true, ainsi les modifications restent en mémoire et cela ne tente pas d'altérer le TSQLQuery en Lecture Seule sans un appel explicite à ApplyUpdates
     
      FClientDS = new TClientDataSet(NULL);
      // Je préfère SetProvider par rapport à ProviderName et sa bidouille avec le Owner !
      FClientDS->SetProvider(FProviderDS);
     
      inherited::DataSet = FClientDS;
    }

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //---------------------------------------------------------------------------
    /*override*/void __fastcall T*****HardwareAbstractEntity::SetDataSet(TDataSet* Value)
    {
      FClientDS->Close();
     
      // Je préfère SetProvider par rapport à ProviderName et sa bidouille avec le Owner !
      FClientDS->SetProvider(FProviderDS);
      FClientDS->PacketRecords = -1; // garanti la copié des données !
      FProviderDS->DataSet = Value;
      if (Value)
        FClientDS->Open(); // Copie les Données d'un seul coup !
     
      FClientDS->SetProvider(NULL);
      FProviderDS->DataSet = NULL; // on détache, on ne conserve que la copie en mémoire
    }

    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //---------------------------------------------------------------------------
    void __fastcall T*****ORPersistent::SetDataSet(TDataSet* Value)
    {
      FDataSet = Value;
      if (DataSource)
        DataSource->DataSet = FDataSet;
    }

    Code c++ : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    //---------------------------------------------------------------------------
    int T*****HardwareAbstractEntity::InternalLoadByLinkedHardwareID(int ALinkedHardwarePrimaryID, bool KeepCacheForEdit/* = false*/)
    {
      int Result = -1;
     
      try
      {
        TSQLQuery *InternalTmpDataSet;
     
        if (ALinkedHardwarePrimaryID)
          InternalTmpDataSet = SelectByLinkedHardwareID(ALinkedHardwarePrimaryID, MetaData->PublishedFields->CommaText);
        else
          InternalTmpDataSet = SelectWhere("0 = 1", MetaData->PublishedFields->CommaText); // Clause Toujours Fausse donc Empty !
     
        try
        {
          // RecordCount ne doit pas être utilisé sur un TSQLQuery
          if (ALinkedHardwarePrimaryID)
            Result = InternalTmpDataSet->IsEmpty() ? -1 : 1;
          else
            Result = InternalTmpDataSet->IsEmpty() ? 0 : -1;
     
          DataSet = NULL;
          if (KeepCacheForEdit)
            DataSet = InternalTmpDataSet; // Le DataSet est dupliqué en mémoire
          else
            Assign(InternalTmpDataSet); // Copie des Données dans les propriétés publiées
        }
        __finally
        {
          delete InternalTmpDataSet;
        }
      }
      catch(const Exception &e)
      {
        T*****HardwareAbstractProvider::GetProvider()->Util*****->Trace(*****FormatException("%0:s::InternalLoadByLinkedHardwareID : %2:s [%1:s]", this, e), "", true, true);
        throw;
      }
     
      return Result;
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Salut

    En ce qui concerne la grappe, tu peux répartir les grains TSQLDataSet et TDataSetProvider dans un Datamodule et le dernier grain ClientDataSet sur la fiche, ça soulage déjà pas mal.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. Creation de fiche dynamique
    Par Mouss26 dans le forum C++Builder
    Réponses: 7
    Dernier message: 24/07/2002, 08h56
  2. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 12h50
  3. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 13h36
  4. Réponses: 4
    Dernier message: 13/05/2002, 17h43
  5. repertoire temp dynamique
    Par killpilot dans le forum C
    Réponses: 2
    Dernier message: 26/04/2002, 17h19

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