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 : 395
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