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 :

[TDataModule] Intérêt de séparer les accès aux données?


Sujet :

Bases de données Delphi

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

    Informations forums :
    Inscription : octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut [TDataModule] Intérêt de séparer les accès aux données?
    Je pensais que l'interêt du datamodule était de séparer les composants d'accès à une base, du reste de l'application mais j'en suis pas convaincu.

    Soit l'exemple suivant:

    un module de données "DataModule1" sur lequel je place un CLientDataset1(MyBase) et un Datasource1.
    une fiche "Form1" sur laquelle je place un DBGrid1.
    une fiche "Form2" sur laquelle je place un DBGrid2.

    A.Séparer l'accès aux données des fiches

    Je créé une instance de TDataModule1 dans ma fiche Form1. Si je souhaite effectuer des actions avant la sauvegarde d'un enregistrement, je dois donc ajouter mon code dans l'évènement 'BeforePost' du ClientDataSet1, ce qui me lie donc mon module et ma fiche, même chose avec le datasource1 si je souhaite réagir au changement d'état(dsInsert, dsBrowse...), sur l'évènement 'OnStateChange'.

    Ma Form1 et mon datamodule1 vont donc se retrouver liés de manière importante.


    B. Réutiliser mon Datamodule1 sur d'autres fiches.


    Je créé une instance de TDataModule1 dans ma fiche Form2. Si je souhaite effectuer des actions avant l'ajout d'un enregistrement, je dois donc à nouveau ajouter mon code dans l'évènement 'BeforePost' du ClientDataSet1, dans lequel est déjà présent le code qui le lie à la fiche Form1, je devrais donc mettre des conditions pour ne pas avoir d'erreurs.

    je trouve ça plutôt lourd à gérer, avec un risque important d'erreurs.

    N'est'il pas plus simple de mettre les composants d'accès aux données directement sur les fiches en ayant besoin ?


    Y'a un truc que j'ai pas dû saisir ?


    Si quelqu'un peut m'éclairer, ce serait sympa !

  2. #2
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2002
    Messages : 467
    Points : 1 307
    Points
    1 307
    Par défaut
    Ma Form1 et mon datamodule1 vont donc se retrouver liés de manière importante
    Vu que les contrôles éditent les données, c'est bien qu'à un moment ils se recontrent quand même :-) La séparation doit avoir lieu dans le code : ce qui concerne les données, dans un datamodule, ce qui concerne la présentation, dans une form. La liaison entre les 2 se fait avec un DataSource.

    dans lequel est déjà présent le code qui le lie à la fiche Form1
    Le code associé à ClientDataset1 sera dans DataModule1. Si tu utilises ce DataModule dans Form1 et Form2, le même code sera utilisé. Il est donc hors de question, par exemple, de faire référence à Form1 ou 2 dans le datamodule ! D'ailleurs, un datamodule ne doit même pas savoir qu'il existe une form quelque part qui l'utilise.

    N'est'il pas plus simple de mettre les composants d'accès aux données directement sur les fiches en ayant besoin
    Plus simple peut-être, mais tu vas te retrouver avec un programme mal construit. C'est valable éventuellement pour les très petits programmes (1 fenêtre avec 1 table ayant 1 zone et 1 seul enregistrement :-)

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  3. #3
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    juillet 2002
    Messages
    1 134
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : juillet 2002
    Messages : 1 134
    Points : 1 158
    Points
    1 158
    Par défaut
    Pour moi,
    j'utilise presuqe toujours un Datamodule pour mettre les compo Database et transaction vu que je travaille avec Interbase.
    Et puis quand plusieurs fiches peuvent partager une source de donnée, je le met dans le datamodule

    A+
    On progresse .....

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    octobre 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    J'ai pas tous compris...
    Citation Envoyé par Bloon
    Si tu utilises ce DataModule dans Form1 et Form2, le même code sera utilisé. Il est donc hors de question, par exemple, de faire référence à Form1 ou 2 dans le datamodule ! D'ailleurs, un datamodule ne doit même pas savoir qu'il existe une form quelque part qui l'utilise.
    Bloon
    Mais si je veux remplir mon DBRadioGroup1 qui est dans Form1, il faut bien qu'il soit connu du datamodule donc y faire référence ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    constructor TForm1.Create(AOwner: TComponent; const AProduit: integer);
    begin
      inherited Create(AOwner);
     
      FModule1 := TDataModule1.Create(Self);
    end;
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    implementation
    {$R *.dfm}
    uses
      Unite1,  // Form1
      Unite2;  // Form2
     
    // Pointeur vers Form1 et Form2
    var
      PForm1: TForm1;
      PForm2: TForm2;
     
    constructor TDataModule1.Create(AOwner: TComponent);
    var
      i: integer;
    begin
      inherited Create(AOwner);
     
      PForm1 := TForm1(AOwner);
     
    //  PForm2 := TForm2(AOwner)
    end;
     
    procedure TDataModule1.DataSource1DataChange(Sender: TObject; Field: TField);
    begin
      if not Assigned(PForm1) then Exit;
      if not cdsSousProduit.Active then cdsSousProduit.Open;
     
      // Référence vers les composants de Form1.
      with PForm1 do
      begin
          ....
          while not Eof do
          begin
            DBradioGroup1.Values.Add(cdsSousProduit_spd_id.AsString);
            DBradioGroup1.Items.Add(cdsSousProduit_spd_libelle.AsString);
            Next;
          end;
        end;
      end;
     
      // Là ça bloque !
    {  with PForm2 do
      begin
        .....
      end;
    }
    end;

  5. #5
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2002
    Messages : 467
    Points : 1 307
    Points
    1 307
    Par défaut
    Le datasource doit être sur la fom (donc un datasource sur Form1 et un autre sur Form2)

    Et par exemple, dans le constructeur de tes 2 fenêtres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataSource1.DataSet := FModule1.Query1;
    Quant à DataSource1DataChange, il se trouve maintenant dans Form1 et Form2.

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

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

    Informations forums :
    Inscription : octobre 2002
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci Bloon !

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

Discussions similaires

  1. MVVM - WPF, les accès aux données et le ViewModel
    Par ptit_tof57 dans le forum Design Patterns
    Réponses: 1
    Dernier message: 10/02/2011, 20h13
  2. Comment gérer au mieux les accès aux données MySQL
    Par akaii dans le forum Accès aux données
    Réponses: 10
    Dernier message: 15/07/2010, 07h49
  3. Réponses: 1
    Dernier message: 24/10/2006, 16h59
  4. Réponses: 2
    Dernier message: 22/06/2006, 12h03

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