1 pièce(s) jointe(s)
Manipulation de la relation maître-détail
Bonjour à tous :P
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:
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:
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:
1 2
| CREATE GENERATOR GNACHATS;
SET GENERATOR GNACHATS TO 0; |
Attribution du générateur à la table 'ACHATS'.
Pièce jointe 222821
Code:
1 2 3
| var
MDT: TMDT;
sc:variant; |
Code:
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:
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:
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:
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:
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:
1 2 3 4 5
| procedure TMDT.T_AchatsAfterDelete(DataSet: TDataSet);
begin
T_Achats.applyupdates(-1);
F_MAINFORM.Transaction.CommitRetaining;
end; |
Code:
1 2 3 4 5
| procedure TMDT.T_DachatsAfterDelete(DataSet: TDataSet);
begin
T_DAchats.ApplyUpdates ;
F_MAINFORM.Transaction.CommitRetaining;
end; |
merci à tous 8-)