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));Création du générateur à l'aide de FlameRobin:
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));
Attribution du générateur à la table 'ACHATS'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 CREATE GENERATOR GNACHATS; SET GENERATOR GNACHATS TO 0;
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
Partager