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

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

    Informations forums :
    Inscription : août 2014
    Messages : 277
    Points : 515
    Points
    515

    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 : 103
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 confirmé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2014
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Algérie

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

    Informations forums :
    Inscription : août 2014
    Messages : 277
    Points : 515
    Points
    515

    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;

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ébutant
    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