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

Contribuez Pascal Discussion :

Manipulation de la relation maître-détail


Sujet :

Contribuez Pascal

  1. #1
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut Manipulation de la relation maître-détail
    Bonjour à tous

    On va utiliser:

    EDI: Laz 1.6

    SGDBR: FireBird 2.5.6+FlameRobin.

    Datasets: SqlQueries

    à fin de manipuler la relation maître-détail en mode Multi-postes.

    RÈGLES DE GESTION:

    La table 'ACHATS' est la table maître, la table 'DACHATS' est la table détails.

    A fin d'éviter un conflit entre les valeurs de champ clé primaire 'ACHATS.NUM_ACHH', je l'ai relié à un générateur 'GNACHATS',

    et à chaque insertion d'un enregistrement dans la table 'ACHATS', le générateur attribue une nouvelle valeur à ce champ.

    Cette même valeur est transmise au champ 'DACHATS.NUM_ACH_DA' à chaque insertion d'un enregistrement dans la table 'DACHATS'.

    L'ajout d'un nouvel enregistrement dans la table 'DACHATS' n'est pas permise si la facture est déjà réglée, i.e: RGL_ACH=1.

    La suppression d'un enregistrement dans la table 'ACHATS' n'est pas permise si ce dernier possède des enregistrements dans la table 'DACHATS',

    il faut d'abord supprimer ces derniers.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TABLE ACHATS
    ( NUM_ACHH	INTEGER NOT NULL,    //clé primaire unique
      DAT_ACH	DATE DEFAULT 'TODAY',// date d'achat
      CD_FRSH	SMALLINT,            // code fournisseur
      REF_ACH      VARCHAR(15),          // ex: 1/2016 , 5/2017
      RGL_ACH	SMALLINT DEFAULT 0,  // 0  facture non réglée, 1 facture réglée.
     PRIMARY KEY (NUM_ACHH));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TABLE DACHATS
    (NUM_ACH_DA  INTEGER ,              // clé
     REF_PRD_DA  INTEGER ,              //double 
     PUHT_DA     NUMERIC(10,2) ,        // prix unitaire achat
     PUV_DA      NUMERIC(10,2),         // prix unitaire vente
     EXP_DA      DATE ,                 // date d'expiration d'un produit
     QTE_DA      NUMERIC(10,2) ,        // quantité achetée d'un article
     PRIMARY KEY(NUM_ACH_DA,REF_PRD_DA));
    Création du générateur à l'aide de FlameRobin:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE GENERATOR GNACHATS;
    SET GENERATOR GNACHATS TO 0;
    Attribution du générateur à la table 'ACHATS'.

    Nom : GNACHATS2.png
Affichages : 315
Taille : 3,4 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      MDT: TMDT;
      sc:variant;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMDT.T_AchatsAfterInsert(DataSet: TDataSet);
    begin
    sc:=T_Achats.FieldValues['NUM_ACHH'];
    T_Dachats.Filtered:=true;
    if T_Dachats.FieldValues['NUM_ACH_DA']<> Null then
    T_Dachats.Filter:='NUM_ACH_DA='+inttostr(sc);
    T_Achats.FieldValues['DAT_ACH']:=Date;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TMDT.T_DachatsBeforeInsert(DataSet: TDataSet);
    begin
      if sc=Null then
    Abort;
     if T_Achats.FieldValues['RGL_ACH']=1 then //Facture déjà réglée.
     begin
      MessageDlg('Facture réglée','Ajout de produits non permise !!',mtWarning,[mbOK],0);
      Abort
     end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMDT.T_DachatsAfterInsert(DataSet: TDataSet);
    begin
     T_Dachats.FieldValues['NUM_ACH_DA']:=T_Achats.FieldValues['NUM_ACHH'];
     T_Dachats.FieldValues['EXP_DA']:=Date+700; // le produit est supposé expiré dans deux ans.
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMDT.T_AchatsAfterScroll(DataSet: TDataSet);
    begin
      sc:=T_Achats.FieldValues['NUM_ACHH'];
    if sc<>Null then
    begin
      T_Dachats.Filtered:=true;
      T_DAchats.Filter:='NUM_ACH_DA='+IntToStr(sc)  ;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TMDT.T_AchatsBeforeDelete(DataSet: TDataSet);
    begin
      if T_DAchats.FieldValues['NUM_ACH_DA']<>Null then
      begin
      MessageDlg('Supprimer les produits d''abord !!',mtWarning,[mbOK],0);
      Abort
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMDT.T_AchatsAfterDelete(DataSet: TDataSet);
    begin
      T_Achats.applyupdates(-1);
      F_MAINFORM.Transaction.CommitRetaining;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMDT.T_DachatsAfterDelete(DataSet: TDataSet);
    begin
      T_DAchats.ApplyUpdates ;
      F_MAINFORM.Transaction.CommitRetaining;
    end;

    merci à tous

  2. #2
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonsoir à tous,

    J'ai voulu traiter par ces codes l'enregistrement des deux tables T_Achats et T_Dachats.

    En fait quand l'enregistrement 'n' de la table T_Achats est validé, le curseur se positionne automatiquement
    sur le premier enregistrement.

    Afin de fixer sa position, j'ai ajouté les deux méthodes: 'processMessages' et 'locate' au code suivant.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TMDT.T_AchatsAfterPost(DataSet: TDataSet);
    begin
      T_Achats.applyupdates(-1);
      F_MAINFORM.Transaction.CommitRetaining;
      T_Achats.Refresh ;
     
      // revenir à l'enregistrement en cour.
      Application.ProcessMessages ; 
      T_Achats.Locate('Num_achh',IntToStr(sc),[]);
    end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TMDT.T_DachatsAfterPost(DataSet: TDataSet);
    begin
      T_Dachats.applyupdates(-1);
      F_MAINFORM.Transaction.CommitRetaining;
      T_Dachats.Refresh ;
    end;

  3. #3
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Points : 680
    Points
    680
    Par défaut
    Bonjour à tous

    Mon application utilisait cette méthode pour gérer les relations maître-détails.

    Au début tout fonctionnait parfaitement, mais plus le nombre de factures augmentait(maintenant 63),

    plus le déplacement entre enregistrements devient lent voire insupportable.

    J'ai tellement reflichi à ce que pourrait être la cause de cette lourdeur pour deviner que c'est

    à cause de 'Filtre' suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <s>procedure TMDT.T_AchatsAfterScroll(DataSet: TDataSet);
    begin
      sc:=T_Achats.FieldValues['NUM_ACHH'];
    if sc<>Null then
    begin
      T_Dachats.Filtered:=true;
      T_DAchats.Filter:='NUM_ACH_DA='+IntToStr(sc)  ;
    end;
    </s>
    qu'il a fallu le substitué par une 'SQL'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select NUM_ACH_DA ,REF_PRD_DA,EXP_DA, QTE_DA,PUHT_DA,PUV_DA  from Dachats
    where NUM_ACH_DA=:I;  //ligne ajoutée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     procedure TMDT.T_AchatsAfterScroll(DataSet: TDataSet);
    begin
      sc:=T_Achats.FieldValues['NUM_ACHH'];
    if (sc<>Null) and (MDT.T_Dachats.Active=true) then
    begin
    T_DAchats.Close;
    T_DAchats.ParamByName('I').AsInteger:=sc ;
    T_DAchats.Open; 
    end;
    merci à vous.

Discussions similaires

  1. Problème de création relation maître détail
    Par codial dans le forum Bases de données
    Réponses: 15
    Dernier message: 28/08/2016, 00h30
  2. Publipostage; Relation maître détails
    Par Just-Soft dans le forum Word
    Réponses: 3
    Dernier message: 12/01/2009, 10h54
  3. Relation maître détail
    Par souminet dans le forum Débuter
    Réponses: 7
    Dernier message: 25/10/2008, 16h37
  4. Réponses: 14
    Dernier message: 07/10/2008, 12h45
  5. Problème de création relation maître détail
    Par codial dans le forum Firebird
    Réponses: 4
    Dernier message: 21/02/2008, 16h33

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