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

Delphi Discussion :

[Delphi7] Dataset mémoire


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Par défaut [Delphi7] Dataset mémoire
    Bonjour,
    je novice en Delphi, je viens du monde VB.net et j'ai un problème avec la création d'un dataset mémoire pour pouvoir travailler en mode déconnecté.

    Ce que fait mon programme:
    j'ai 2 tables (identiques: meme nom de colonne, meme nombre de colonne, meme types) que j'ai relié à 2 datasources. Je les affiche sur un Form dans 2 datagrids differents, j'ajoute, modifie ou supprime à chaque tables des enregistrements...jusque là tout va bien.

    Le but de mon programme est de synchroniser les 2 tables, c'est a dire afficher dans une troisème table la fusion de mes 2 tables pour n'avoir que les données à jour.

    Problème: je veux le faire en passant par un dataset mémoire sur lequel je pourrai par la suite travailler.
    Mais je n'arrive pas a trouver la manière de "construire" mon dataset. Voila mon bout de code (qui ne fonctionne pas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    fChamp1,fChamp2: Tfield;
     
    fChamp1:=Tfield.Create(nil);
    fChamp2:=Tfield.Create(nil);
     
    DataSource3.DataSet.Fields.Add(fChamp1);
    DataSource3.DataSet.Fields.Add(fChamp2);
    DataSource3.DataSet.Fields[0].Value:= 'Ca marche';
    DataSource3.DataSet.Fields[1].Value:= 'bien';
    Est-ce que quelqu'un pourrait me guider et me donner un exemple de code?

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Par défaut
    Salut

    Ce que tu peux faire est travailler avec TClientDataSet (onglet Data Access). Tu peux definir les champs en dessin et apres appeler a son méthode CreateDataSet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if CDS.Active then CDS.Close;
    CDS.CreateDataSet;
    Maintenant tu puex travailler avec le CDS comme normalement (Insert, Edit, Last, First, Prior, Next,.........)

    A+

  3. #3
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    Citation Envoyé par seemax
    je novice en Delphi, je viens du monde VB.net
    <troll>tu as fais un très bon choix </troll>

    Citation Envoyé par seemax
    et j'ai un problème avec la création d'un dataset mémoire pour pouvoir travailler en mode déconnecté...
    Mais je n'arrive pas a trouver la manière de "construire" mon dataset. Voila mon bout de code (qui ne fonctionne pas):
    peux-tu être plus précis ? tu obtiens un message d'erreur ? si oui lequel ? si non est-ce que le programme fonctionne de façon inattendue ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Par défaut
    cadetill:
    merci, je vais essayer ce composant, je ne connaissais pas, mais je vais quand meme essayer de trouver le moyen de creer un dataset reelement memoire, que je puisse gerer comme un tableau.

    denokan:
    quand j'arrive en pas à pas sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataSource3.DataSet.Fields.Add(fChamp1);
    je tombe sur une erreur pas tres explicite: "Le projet à provoqué une classe d'exception EAccessViolation avec le message: violation d'acces à l'adresse 00543EDA; Processus stoppé."

    En fait j'ai l'impression que lorsque j'essaye de créer la structure de mon Dataset, je n'utilise pas le bon composant. En VB.net, j'instanciai un dataset, je créai des colonnes typées que je lui affectait, et je pouvais travailler comme avec une base, puis-je faire cela en Delphi?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juin 2004
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Andorre

    Informations forums :
    Inscription : Juin 2004
    Messages : 219
    Par défaut
    Salut

    Citation Envoyé par seemax
    cadetill:
    merci, je vais essayer ce composant, je ne connaissais pas, mais je vais quand meme essayer de trouver le moyen de creer un dataset reelement memoire, que je puisse gerer comme un tableau.
    Bon, un TClientDataSet peut etre un tableau memoire si on travaille comme j'ai descrit. En fait, pour ton DateSource as besoin de quelque composant DataSet (pour lui assigner a son propieté DataSet => ça c'est ton erreur, tu n'as aucun dataset crée => DataSource3.DataSet = nil). C'est tableau peut etre le TClientDataSet

    A+

  6. #6
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Salut!

    Je crois que tu t'embarques dans quelque chose de gros si tu veux créer un dataset déconnecté from scratch.

    Choses importantes à comprendre avant de commencer:

    TDataset est une calsse de bases qui sert à créer des classes spécialisées dans la manipulation de données. Normalement, on ne devrait jamais utiliser directement les objets TDataset mais les objets TTable/TADOTable, TQuery/TADOQuery, TClientDataset, etc. qui dérivent tous (par héritage) de TDataset. La classe TDataset est incomplète et est (probablement) inutilisable si elle n'est pas et complétée par héritage.

    Quand tu fais DataSource.DataSet, tu accèdes à la référence d'un objet TDataSet assigné à l'objet TDataSource (et si tu comprends le polymorphisme et ce que j'ai décrit dans le paragraphe précédent, tu comprendras que la propriété DataSet pourra alors contenir un TQuery, TTable, etc. ). Mais ça ne garantie pas que la propriété DataSet est initialisée avec une instance de TDataSet. Si tu n'as pas construit d'objet (ou placé de composants sur ta fiche et lié ce dernier au DataSource), il est fort probable que DataSet soit Null. Fais ce test pour voir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if DataSource.DataSet = nil then
      Showmessage('DataSet = nil')
    else
      Showmssage('DataSet <> nil');
    Maintenant qu'on a une base pour travailler, attardons-nous sur les classes qu'on peut utiliser.

    TQuery/TADOQuery. En gros c'est un peu l'équivalent du DataReader en .NET mais qui n'est pas en avancement seulement (on peut faire "précédent" ou "début" ou "fin", etc.). On peut aussi y mettre une requête d'écriture (INSERT, UPDATE, DELETE) ce qui a pour effet de ne pas retourner de jeux d'enregistrements. Autre spécification intéressante : le TADOQuery n'est pas en lecture seule. On peut ouvrir une requête (SELECT * FROM MATABLE), modifier quelques valeurs et renvoyer les changement à la base.

    TTable/TADOTable. En gros, ça fonctionne comme un query dont la requête serait faite sur une seule table seulement et sur toute les colonnes.

    Aucun de ces objets ne permettent de créer un DataSet en mémoire. Le Query lit les colonnes (existantes) qui tu auras spécifié et le Table lit TOUTES les colonnes d'une table (toujours existante) de la BD.

    C'est du TClientDataSet dont tu as besoin .

    Ça vient de l'aide de mon Delphi 7 :
    TClientDataSet represents an in-memory dataset.
    Avec ce code tu pourras créer ton DataSet:

    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
     
       if DataSource.DataSet <> nil then
          DataSource.DataSet.Free;
     
       DataSource.DataSet := TClientDataSet.Create(DataSource);
     
       with DataSource.DataSet as TClientDataSet do
       begin
          Close;
     
          with FieldDefs do
          begin
             Add('Champ1', ftString, 100);
             Add('Champ2', ftInteger);
             Add('Champ3', dtFloat);
          end;
     
          CreateDataSet;
          Open;
       end;
    Enfin, l'aide de Delphi (ainsi que la FAQ section Delphi) est ton ami! Il est impossible d'abuser de ces ressources .


    Bon dev!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2004
    Messages : 52
    Par défaut
    Merci slimjoe, impressionnante explication, c'est exactement ce qu'il me fallait. J'ai encore plens d'automatismes à prendre et il faut que je reflechisse differemment du VB.net, il y a plus de différences que je pensais (déjà au niveau de l'aide!).
    Je vais utiliser le TClientDataSet, c'est ce qu'il me faut.

    Merci.

  8. #8
    Membre émérite
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Par défaut
    dans ton cas, puisque tu connais déjà la syntaxe .NET, ne serait-il pas plus judicieux de t'orienter vers Delphi .NET ?

  9. #9
    Membre émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Par défaut
    Citation Envoyé par seemax
    et il faut que je reflechisse differemment du VB.net, il y a plus de différences que je pensais
    Pour avoir travaillé dans les 2 environnements (plus en Delphi qu'en VB entendons nous ), j'ai remarqué qu'il n'y avait pas tant de différences que ça. Bon, il est certain que les 2 langages privilégient des technologies différentes (ADO.NET VS ADO traditionnel par exemple) mais à la base, ça reste de la programmation orientée objets. La seule différence majeure qui existe entre les environnements (et j'insiste là-dessus parce que je passe beaucoup trop de temps à corriger le code de mes camarade de travail qui viennent du .NET), en Delphi on détruit ce que l'on créé. Il n'y a pas de garbage collector sous Delphi (sauf Delphi pour .NET j'imagine). Si tu fais TClientDataSet.Create, assure toi de mettre un MonClientDataSet.Free quand tu n'en as plus besoin.

    Bon dev!

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

Discussions similaires

  1. [Tutoriel] Découvrez comment développer un Dataset en mémoire
    Par Pedro dans le forum Bases de données
    Réponses: 17
    Dernier message: 29/03/2019, 01h30
  2. Problème de mémoire avec les datasets
    Par Hartdrooz dans le forum C#
    Réponses: 6
    Dernier message: 06/05/2008, 21h22
  3. [Delphi7 + FB1.5.3] Erreur de rafraichissement du dataset.
    Par Andry dans le forum Bases de données
    Réponses: 5
    Dernier message: 03/03/2006, 15h43
  4. [VB.NET][dataset] libérer de la mémoire
    Par JauB dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/01/2006, 12h58

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