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 :

Calcul de prix d'achat moyen pondéré d'un produit


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 Calcul de prix d'achat moyen pondéré d'un produit
    Bonjour à tous.

    Cet essai montre comment calculer le PAMP: (Prix d'achat moyen pondéré) d'un produit acheté
    plusieurs fois à des prix différents, dans le champ PRODUITS.PUHT_PRDK.

    Une fois un enregistrement est ajouté modifié ou supprimé dans la table DACHATS, ses valeurs seront transmises automatiquement dans
    la table PRODUITS.


    TABLE PRODUITS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (REF_PRDK   INTEGER NOT NULL,  // réference produit.
     PUHT_PRDK  NUMERIC(10,2) ,         // prix d'achat
     PUV_PRDK   NUMERIC(10,2) ,           // prix de vente
     EXP_PRDK   DATE ,                           // date d'expiration d'un produit.
     QTE_PRDK   NUMERIC(10,2),           // quantité en stock.
     PRIMARY KEY(REF_PRDK));

    TABLE DACHATS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (NUM_ACH_DA  INTEGER ,
     REF_PRD_DA  INTEGER ,
     PUHT_DA     NUMERIC(10,2) ,
     PUV_DA      NUMERIC(10,2),
     EXP_DA      DATE ,
     QTE_DA      NUMERIC(10,2) ,
     PRIMARY KEY(NUM_ACH_DA,REF_PRD_DA));
    1. déclaration de qi // qi:quantité initiale d'un produit dans la table DACHATS qu'on veut modifier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      MDT: TMDT;
      qi:variant;
    2.Initialisation de qi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TF_Achats.FormShow(Sender: TObject);
    begin 
     umdt.qi:=0
    end;
     
    procedure TMDT.T_DachatsBeforeEdit(DataSet: TDataSet);
    begin
       qi:=T_DAchats.FieldValues['Qte_da'];  // cet événement n'aura lieu que si T_DAchats.FieldValues['Qte_da']<>Null. 
    end;
    3. Insertion/MAJ d'un produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    procedure TMDT.T_DachatsAfterPost(DataSet: TDataSet);
    var  ref,Num,Den:Variant;
    begin
     ref:=inttoStr(T_DAchats.FieldValues['Ref_prd_da']);
     
      if  T_PRODUITS.Locate('REF_PRDK',ref,[]) then      // si le produit existe déjà.
      begin
      T_PRODUITS.Edit;
      Num:=(T_DAchats.FieldValues['Puht_da']*(T_DAchats.FieldValues['Qte_da']-qi)+T_PRODUITS.FieldValues['Puht_prdk']*T_PRODUITS.FieldValues['QTE_PRDK']);
      Den:=(T_PRODUITS.FieldValues['QTE_PRDK']+T_DAchats.FieldValues['Qte_da']-qi);
     
      T_PRODUITS.FieldValues['Puht_prdk']:=Num/Den;      //PAMP=Num/Den.
      end
      else
      begin
      T_PRODUITS.Insert;
      T_PRODUITS.FieldValues['ref_prdk']:=T_DAchats.FieldValues['Ref_prd_da'];
      T_PRODUITS.FieldValues['Puht_prdk']:=T_DAchats.FieldValues['Puht_da'];
      end;
      T_PRODUITS.FieldValues['exp_prdk']:=T_DAchats.FieldValues['Exp_da'];
      T_PRODUITS.FieldValues['Puv_prdk']:=T_DAchats.FieldValues['Puv_da'];
      T_PRODUITS.FieldValues['QTE_PRDK']:=T_PRODUITS.FieldValues['QTE_PRDK']+T_DAchats.FieldValues['Qte_da']-qi;
       qi:=0;
      T_Dachats.ApplyUpdates(-1);
      T_PRODUITS.ApplyUpdates(-1);
      Accueil.LOTUSTransaction.CommitRetaining;
    end;
    4. Suppression d'un produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    procedure TMDT.T_DachatsBeforeDelete(DataSet: TDataSet);
    var  Num,Den,ref:Variant;
    begin
      ref:=inttoStr(T_DAchats.FieldValues['Ref_prd_da']);
      T_PRODUITS.Locate('REF_PRDK',ref,[]);
      T_PRODUITS.Edit;
      Num:=(T_PRODUITS.FieldValues['Puht_prdk']*T_PRODUITS.FieldValues['QTE_PRDK']-T_DAchats.FieldValues['Puht_da']*T_DAchats.FieldValues['Qte_da']);
      Den:=(T_PRODUITS.FieldValues['QTE_PRDK']-T_DAchats.FieldValues['Qte_da']);
     
      T_PRODUITS.FieldValues['Puht_prdk']:=Num/Den;
      T_PRODUITS.FieldValues['QTE_PRDK']:=Den;
    end; 
     
     
    procedure TMDT.T_DachatsAfterDelete(DataSet: TDataSet);
    begin
      T_DAchats.ApplyUpdates(-1) ;
      T_PRODUITS.ApplyUpdates(-1); 
      Accueil.LOTUSTransaction.CommitRetaining;
    end;
    merci beaucoup

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Merci pour cette contribution. Mais, pour les non initiés (comme moi), la présentation de l'exemple est un peu trop courte. Pourriez-vous nous en dire un peu plus ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  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
    Bonsoir Roland

    Merci pour cette contribution. Mais, pour les non initiés (comme moi), la présentation de l'exemple est un peu trop courte. Pourriez-vous nous en dire un peu plus ?
    Bien sûr! et merci pour la remarque

    En fait chaque produit doit être représenter d'une manière unique.
    Cependant le même type de produit peut être acheter à des prix différents.
    Donc le champs PRODUITS.PUHT_PRDK doit contenir la moyenne arithmétique de tous les achats appelée PAMP(prix d'achat moyen pondéré)

    Ex:
    Achat 1: on a acheté 10 u d'un produit P à 5 Euro.
    Achat 2: on a acheté 15 u du même produit P à 7 Euro.
    PAMP:=(10X5 + 15X7)/(10+15) soit 6.2 Euro et le champ PRODUITS.PUHT_PRDK contiendra cette valeur.

    Supposant qu'on vendra ce produit à 9 Euro la marge brute serait: 9-6.2=2.8

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par FOCUS77 Voir le message
    En fait chaque produit doit être représenter d'une manière unique.
    Cependant le même type de produit peut être acheter à des prix différents.
    Donc le champs PRODUITS.PUHT_PRDK doit contenir la moyenne arithmétique de tous les achats appelée PAMP(prix d'achat moyen pondéré)

    Ex:
    Achat 1: on a acheté 10 u d'un produit P à 5 Euro.
    Achat 2: on a acheté 15 u du même produit P à 7 Euro.
    PAMP:=(10X5 + 15X7)/(10+15) soit 6.2 Euro et le champ PRODUITS.PUHT_PRDK contiendra cette valeur.

    Supposant qu'on vendra ce produit à 9 Euro la marge brute serait: 9-6.2=2.8
    D'accord, tout cela est parfaitement clair. Mais quel est le système de gestion de bases de données utilisé ? Quels sont les composants utilisés ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    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

    SGDBR: FireBird 2.5.6

    Laz: 1.6 RC2

    Datasets: SqlQueries

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    ton calcul est facile a comprendre
    Mais que ce passe t'il si tu as plus de deux changement de prix dans ton exercice ?

    ne serait il pas plus simple de faire une requette de regroupement pour cette référence
    et de calculer le prix moyen pondéré

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Function TMODULEPRIX.CalculPrixPondere(Ref : integer) : Currency;
    Begin 
    st := 'select REF_PRDK   , SUM(PUHT_PRDK*QTE_PRDK)/Sum(QTE_PRDK) '
    + ' from PRODUIT  ' 
    + ' Where REF_PRDK   =  %d  '
    + ' Group by  REF_PRDK    ';
     
      QRData.Close; 
      QRData.SQL.CLEAR  
      QRData.SQL.ADD(Format(st,[ref]));
      QRData.open;
      Result :=  (QRData.Fields[1].asCurrency);
    end;
    la sans vouloir te fâcher cela ressemble a de la programmation dbase de mes début
    il est peut être utile de se servir du SQL
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    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

    @anapurna

    Mais que ce passe t'il si tu as plus de deux changement de prix dans ton exercice ?
    Et ben le PAMP ne sera pas recalculé il est recalculé uniquement lors du changement de la quantité du produit QTE_PRDK.
    je vais cacher ça à mes clients

    merci pour la remarque.

    st := 'select REF_PRDK , SUM(PUHT_PRDK*QTE_PRDK)/Sum(QTE_PRDK) '
    + ' from PRODUIT '
    + ' Where REF_PRDK = %d '
    + ' Group by REF_PRDK ';
    j'ai préféré utiliser une table à une requête de synthèse car les valeurs QTE_PRDK vont être retranchées lors d'une vente.

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 418
    Points : 5 816
    Points
    5 816
    Par défaut
    salut

    deux solution soit tu accepte des quantité négative soit c'est les élément en stock est donc le calcul ne se fait que sur de l'existant
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  9. #9
    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

    @anapurna

    Merci pour ton aide qui m'a conduit enfin vers la formule magique

    1. déclaration de pi et qi // pi,qi: prix et quantité initiaux à modifier , dans la table DACHATS.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      MDT: TMDT;
      pi,qi:variant;
    2.Initialisation de pi et qi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TF_Achats.FormShow(Sender: TObject);
    begin 
    umdt.pi:=0; umdt.qi:=0
    end;
     
    procedure TMDT.T_DachatsBeforeEdit(DataSet: TDataSet);
    begin
       pi:=T_DAchats.FieldValues['Puht_da']; // cet evenement n'aura lieu que si T_DAchats.FieldValues['Puht_da']<>Null  
       qi:=T_DAchats.FieldValues['Qte_da'];  // ou si T_DAchats.FieldValues['Qte_da']<>Null. 
    end;
    3. Insertion/MAJ d'un produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    procedure TMDT.T_DachatsAfterPost(DataSet: TDataSet);
    var  ref,Num,Den:Variant;
    begin
     ref:=inttoStr(T_DAchats.FieldValues['Ref_prd_da']);
     
      if  T_PRODUITS.Locate('REF_PRDK',ref,[]) then      // si le produit existe déjà.
      begin
      T_PRODUITS.Edit;
     
      Num:=(T_DAchats.FieldValues['Puht_da']*T_DAchats.FieldValues['Qte_da']-(pi*qi)
      +T_PRODUITS.FieldValues['Puht_prdk']*T_PRODUITS.FieldValues['QTE_PRDK']);
     
       Den:=(T_PRODUITS.FieldValues['QTE_PRDK']+T_DAchats.FieldValues['Qte_da']-qi);
     
      T_PRODUITS.FieldValues['Puht_prdk']:=Num/Den;        //PAMP=Num/Den.
      end
      else
      begin
      T_PRODUITS.Insert;
      T_PRODUITS.FieldValues['ref_prdk']:=T_DAchats.FieldValues['Ref_prd_da'];
      T_PRODUITS.FieldValues['Puht_prdk']:=T_DAchats.FieldValues['Puht_da'];
      end;
      T_PRODUITS.FieldValues['exp_prdk']:=T_DAchats.FieldValues['Exp_da'];
      T_PRODUITS.FieldValues['Puv_prdk']:=T_DAchats.FieldValues['Puv_da'];
      T_PRODUITS.FieldValues['QTE_PRDK']:=T_PRODUITS.FieldValues['QTE_PRDK']+T_DAchats.FieldValues['Qte_da']-qi;
       pi:=0; qi:=0;
      T_Dachats.ApplyUpdates(-1);
      T_PRODUITS.ApplyUpdates(-1);
      Accueil.LOTUSTransaction.CommitRetaining;
    end;
    merci à tous

  10. #10
    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

    IL ya bien une exception que j'ai voulu corriger lors de la suppression d'un produit de la table 'T_DAchats' , c'est la division par zéro.
    j'ai ajouté donc une condition:

    4. Suppression d'un produit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TMDT.T_DachatsBeforeDelete(DataSet: TDataSet);
    var  Num,Den,ref:Variant;
    begin
      ref:=inttoStr(T_DAchats.FieldValues['Ref_prd_da']);
      T_PRODUITS.Locate('REF_PRDK',ref,[]);
      T_PRODUITS.Edit;
      Num:=(T_PRODUITS.FieldValues['Puht_prdk']*T_PRODUITS.FieldValues['QTE_PRDK']-T_DAchats.FieldValues['Puht_da']*T_DAchats.FieldValues['Qte_da']);
      Den:=(T_PRODUITS.FieldValues['QTE_PRDK']-T_DAchats.FieldValues['Qte_da']);
     
     if Den<>0 then  //condition ajoutée
      T_PRODUITS.FieldValues['Puht_prdk']:=Num/Den;
      T_PRODUITS.FieldValues['QTE_PRDK']:=Den;
    end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TMDT.T_DachatsAfterDelete(DataSet: TDataSet);
    begin
      T_DAchats.ApplyUpdates(-1) ;
      T_PRODUITS.ApplyUpdates(-1); 
      Accueil.LOTUSTransaction.CommitRetaining;
    end;
    merci à tous

  11. #11
    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 Gestion de stock
    Bonsoir à tous,

    L'inconvenient de l'exemple précédent est que chaque produit est identifié uniquement
    par sa réference, d'où il ne peut être representé que par un seul enregistrement,
    ce qui en contradiction avec la réalité car sa date d'expiration est déterminante si le produit est périssable.

    Donc la table 'PRODUITS' sera scindée en deux autres tables:

    I-DEFINITION DES PRODUITS

    1. La table PRDSBASE: Le produit est identifié par son champ-clé 'REF_PRD', les autres
    champs contiennent les données purement techniques.

    TABLE PRDSBASE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (  REF_PRD Integer NOT NULL,  // réf produit.
       LBL_PRD Varchar(25),           // Nom produit.
       CCTG_TPRD Smallint,            // réf catégorie.
       CFBR_TPRD Smallint,            // réf fabricant.
       CDT_TPRD Varchar(12),        // conditionnement (emballage).
       PRIMARY KEY (REF_PRD));
    2. La table MAJPRDSTK: Le produit est identifié par le champ-clé 'NUM_PRDK', mais aussi par les champs 'REF_PRDK' plus 'EXP_PRDK'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TABLE MAJPRDSTK
    (  NUM_PRDK Integer NOT NULL,
       REF_PRDK Integer,
         PUHT_PRDK NUMERIC(10,2),    // prix d'achat.
       PUV_PRDK  NUMERIC(10,2),       // prix de vente.
       EXP_PRDK Date,                        // date d'expiration d'un produit.
       CDFR_PRD Smallint,                  // réf fournisseur.
       QTE_PRDK  NUMERIC(10,2),      // quantité en stock.
       PRIMARY KEY (NUM_PRDK));
    -Selon les valeurs des champs 'REF_PRDK' et 'EXP_PRDK', chaque produit peut se retrouver dans un stock, en trois états différents,

    représentés par trois sources (enregistrements) différentes .

    1. Les sources disponibles: tout produit dans la date d'expiration n'est pas encore atteinte.

    Selon la valeur de cette date on peut trouver plusieurs produits ayant la même réference (REF_PRDK) et des expirations différentes.

    2. Les sources expirées: tout produit dans la date d'expiration est atteinte.

    3. Les sources libérées: tout stock vide, résultat de l'une des deux premières sources, caractérisé par une 'QTE_PRDK' égale à zéro.

    L'enregistrement n'est pas supprimé, mais il est considéré comme source en instance.

    Cependant, il faut garantir tout d'abort l'inexistence des quantités négatives.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMDT.T_MajPrdStkQTE_PRDKChange(Sender: TField);
    begin
    if T_MajPrdStk.FieldValues['Qte_prdk']<0 then
       T_MajPrdStk.FieldValues['Qte_prdk']:=0
    end;
    En fait, une source disponible est vidée par les ventes, tandis qu'une source expirée est vidée par un transfert de sa 'QTE_PRDK'
    vers une autre Table appelée par exemple 'PRDsEXPIRES', et dans les deux cas, elles se transforment en sources libérées.

    II-INSERTION/MODIFICATION DES PRODUITS.

    L'insertion des produits passe par l'achat d'une nouvelle gamme de produits.
    Lors de la validation d'un enregistrement de la table détails-achats(T_Dachats), le code recherche tout d'abord,
    dans la table T_MAJPRDSTK l'existence d'une:

    Source disponible identique, pour augmenter le champ (QTE_PRDK).
    Si cette source est non disponible, il passe à la recherche d'une:

    Source libérée: pour mettre à jour ses champs (EXP_PRDK) et (QTE_PRDK).
    Si cette source est non disponible, on passera ensuite, à la création d'une nouvelle source dans la table (T_MAJPRDSTK).

    Cependant, il faut garantir que tous les champs soient remplis, afin d'établir cette comparaison, pour cela, on ajoute
    le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TMDT.T_DachatsBeforePost(DataSet: TDataSet);
    begin
    if (T_DAchats.FieldValues['qte_da']=Null) or (T_DAchats.FieldValues['Puht_da']=Null) or (T_DAchats.FieldValues['Puv_da']=Null) then
    Abort;
    end;
    pour insérer ensuite l'enregistrement (il faut déclarer et initialiser les deux variables globales:pi et qi).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    procedure TMDT.T_DachatsAfterPost(DataSet: TDataSet);
    var  Nom,Dom,pf,qf:Variant;
    begin
         //la recherche d'une source disponible identique.
      if  T_MAJPRDSTK.Locate('REF_PRDK;exp_prdk',VarArrayOf([inttoStr(T_DAchats.FieldValues['Ref_prd_da']),DatetoStr(T_DAchats.FieldValues['Exp_da'])]),[]) then
      begin
      T_MAJPRDSTK.Edit;
      if T_MAJPRDSTK.FieldValues['Puht_prdk']=Null then  T_MAJPRDSTK.FieldValues['Puht_prdk']:=0;
      if T_MAJPRDSTK.FieldValues['qte_prdk']=Null  then  T_MAJPRDSTK.FieldValues['qte_prdk']:=0;
      if T_MAJPRDSTK.FieldValues['puv_prdk']=Null  then  T_MAJPRDSTK.FieldValues['puv_prdk']:=0;
     
      pf:=T_DAchats.FieldValues['Puht_da'];
      qf:=T_DAchats.FieldValues['Qte_da'];
     
      Nom:=(pf*qf-(pi*qi)+T_MAJPRDSTK.FieldValues['Puht_prdk']*T_MAJPRDSTK.FieldValues['QTE_PRDK']);
      Dom:=(T_MAJPRDSTK.FieldValues['QTE_PRDK']+qf-qi);
     
      T_MAJPRDSTK.FieldValues['Puht_prdk']:=Nom/Dom;
      T_MAJPRDSTK.FieldValues['QTE_PRDK']:=Dom;
      end    //la recherche d'une source libérée.
      else if T_MAJPRDSTK.Locate('REF_PRDK;QTE_PRDK',VarArrayOf([inttoStr(T_DAchats.FieldValues['Ref_prd_da']),0]),[])  then
      begin
      T_MAJPRDSTK.Edit;
       T_MAJPRDSTK.FieldValues['Puht_prdk']:=T_DAchats.FieldValues['Puht_da'];
       T_MAJPRDSTK.FieldValues['QTE_PRDK']:=T_DAchats.FieldValues['Qte_da'];
       T_MAJPRDSTK.FieldValues['exp_prdk']:=T_DAchats.FieldValues['Exp_da'];
      end
    else   //la création d'une nouvelle source.
    begin
    T_MAJPRDSTK.Insert;
    T_MAJPRDSTK.FieldValues['ref_prdk']:=T_DAchats.FieldValues['Ref_prd_da'];
    T_MAJPRDSTK.FieldValues['Puht_prdk']:=T_DAchats.FieldValues['Puht_da'];
    T_MAJPRDSTK.FieldValues['exp_prdk']:=T_DAchats.FieldValues['Exp_da'];
    T_MAJPRDSTK.FieldValues['QTE_PRDK']:=T_DAchats.FieldValues['Qte_da'];
    end;
    T_MAJPRDSTK.FieldValues['CDFR_PRD']:=FAchats.DBLookupComboBox1.KeyValue;
       T_MAJPRDSTK.FieldValues['puv_prdk']:=T_DAchats.FieldValues['puv_da'];
    end;
     
    if T_DAchats.FieldValues['Ref_Prd_da']<>Null then
    begin
    T_Dachats.ApplyUpdates(-1);
    T_MAJPRDSTK.ApplyUpdates(-1);
    MainForm.Transaction.CommitRetaining;
    end;
    end;
    III- SUPPRESSION DES PRODUITS.

    Lors d'une suppression, le code recherche une source disponible identique, afin de diminuer la valeur de 'QTE_PRDK'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    procedure TMDT.T_DachatsBeforeDelete(DataSet: TDataSet);
    var  Nom,Dom:Variant;
    begin
       T_MAJPRDSTK.Locate('REF_PRDK;exp_prdk',VarArrayOf([inttoStr(T_DAchats.FieldValues['Ref_prd_da']),DatetoStr(T_DAchats.FieldValues['Exp_da'])]),[]);
      T_MAJPRDSTK.Edit;
     
    Nom:=(T_MAJPRDSTK.FieldValues['Puht_prdk']*T_MAJPRDSTK.FieldValues['QTE_PRDK']-T_DAchats.FieldValues['Puht_da']*T_DAchats.FieldValues['Qte_da']);
     Dom:=(T_MAJPRDSTK.FieldValues['QTE_PRDK']-T_DAchats.FieldValues['Qte_da']);
     if Dom<>0 then
    T_MAJPRDSTK.FieldValues['Puht_prdk']:=Nom/Dom;
    T_MAJPRDSTK.FieldValues['QTE_PRDK']:=T_MAJPRDSTK.FieldValues['QTE_PRDK']-T_DAchats.FieldValues['Qte_da'];
     
    T_MAJPRDSTK.ApplyUpdates(-1);
    MainForm.Transaction.CommitRetaining;
    end;
    merci.

  12. #12
    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

    Les codes précédents permettent l'ajout et la réctification des quantités et prix d'achats des produits,

    cependant, en cas d'introduction d'une réference (MDT.T_DAchats.FieldValues['Ref_prd_da']),

    ou d'une date d'expiration (MDT.T_DAchats.FieldValues['Exp_da']) erronée, la rectification n'est pas possible

    car ces deux champs sont la réference de l'enregistrement, et lorsque l'un des deux change, le code procède à la

    création d'un nouvel enregistrement.

    Il a fallu donc procéder à l'ajout de trois nouveaux paramètres(ri:réf initiale) , (xi: date d'expiration initiale)

    et d'une booléenne(ed) qui servent à repérer, en cas d'existence, l'enregistrement erroné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var
      MDT: TMDT;
      pi,qi,ri,xi,ed:variant;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMDT.TDachatsBeforeEdit(DataSet: TDataSet);
    begin
       qi:=T_DAchats.FieldValues['Qte_da'];  if qi=Null then qi:=0;
       pi:=T_DAchats.FieldValues['Puht_da']; if pi=Null then pi:=0;
     
       if  MDT.T_MAJPRDSTK.Locate('REF_PRDK;exp_prdk',VarArrayOf([inttoStr(MDT.T_DAchats.FieldValues['Ref_prd_da']),DatetoStr(MDT.T_DAchats.FieldValues['Exp_da'])]),[]) then
       begin ri:=MDT.T_DAchats.FieldValues['Ref_prd_da']; xi:=MDT.T_DAchats.FieldValues['Exp_da'];   ed:=True end
       else ed:=False;
    end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    procedure TMDT.T_DachatsAfterPost(DataSet: TDataSet);
    var  Nom,Dom,pf,qf:Variant;  rf:integer; xf:TDateTime;
    begin
         //la recherche de la ressource erronée.
      if ed=True then
       begin rf:=ri; xf:=xi end
       else
       begin rf:=MDT.T_DAchats.FieldValues['Ref_prd_da']; xf:=MDT.T_DAchats.FieldValues['Exp_da'] end; //la recherche d'une ressource disponible identique.
     
       if  (MDT.T_MAJPRDSTK.Locate('REF_PRDK;exp_prdk',VarArrayOf([inttoStr(rf),DatetoStr(xf)]),[])) then  
      begin
      T_MAJPRDSTK.Edit;
      if T_MAJPRDSTK.FieldValues['Puht_prdk']=Null then  T_MAJPRDSTK.FieldValues['Puht_prdk']:=0;
      if T_MAJPRDSTK.FieldValues['qte_prdk']=Null  then  T_MAJPRDSTK.FieldValues['qte_prdk']:=0;
      if T_MAJPRDSTK.FieldValues['puv_prdk']=Null  then  T_MAJPRDSTK.FieldValues['puv_prdk']:=0;
     
      pf:=T_DAchats.FieldValues['Puht_da'];
      qf:=T_DAchats.FieldValues['Qte_da'];
     
      Nom:=(pf*qf-(pi*qi)+T_MAJPRDSTK.FieldValues['Puht_prdk']*T_MAJPRDSTK.FieldValues['QTE_PRDK']);
      Dom:=(T_MAJPRDSTK.FieldValues['QTE_PRDK']+qf-qi);
     
      T_MAJPRDSTK.FieldValues['Puht_prdk']:=Nom/Dom;
      T_MAJPRDSTK.FieldValues['QTE_PRDK']:=Dom;
      end    //la recherche d'une ressource libérée.
      else if T_MAJPRDSTK.Locate('REF_PRDK;QTE_PRDK',VarArrayOf([inttoStr(T_DAchats.FieldValues['Ref_prd_da']),0]),[])  then
      begin
      T_MAJPRDSTK.Edit;
      T_MAJPRDSTK.FieldValues['QTE_PRDK']:=T_DAchats.FieldValues['Qte_da'];
      T_MAJPRDSTK.FieldValues['Puht_prdk']:=T_DAchats.FieldValues['Puht_da']; 
      end
    else   //la création d'une nouvelle ressource.
    begin
    T_MAJPRDSTK.Insert;
    T_MAJPRDSTK.FieldValues['QTE_PRDK']:=T_DAchats.FieldValues['Qte_da'];
    T_MAJPRDSTK.FieldValues['Puht_prdk']:=T_DAchats.FieldValues['Puht_da'];
    end;
     
    T_MAJPRDSTK.FieldValues['CDFR_PRD']:=FAchats.DBLookupComboBox1.KeyValue;
    T_MAJPRDSTK.FieldValues['ref_prdk']:=T_DAchats.FieldValues['Ref_prd_da'];
    T_MAJPRDSTK.FieldValues['exp_prdk']:=T_DAchats.FieldValues['Exp_da'];
    T_MAJPRDSTK.FieldValues['puv_prdk']:=T_DAchats.FieldValues['puv_da'];
    end;
     
    if T_DAchats.FieldValues['Ref_Prd_da']<>Null then
    begin
    T_Dachats.ApplyUpdates(-1);
    T_MAJPRDSTK.ApplyUpdates(-1);
    MainForm.Transaction.CommitRetaining;
    end;
    end;
    merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul des stocks au prix moyen pondéré
    Par chekkal dans le forum Débuter
    Réponses: 10
    Dernier message: 20/11/2019, 12h12
  2. Réponses: 2
    Dernier message: 04/06/2015, 17h20
  3. obtenir le dernier prix d'achat par fournisseur et par produit
    Par lidybekham07 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/11/2009, 16h26
  4. Calcul de prix unitaire moyen
    Par smail21 dans le forum Bases de données
    Réponses: 4
    Dernier message: 28/11/2005, 12h10
  5. Gestion de stock - Prix Moyen Pondéré
    Par hugo69 dans le forum Access
    Réponses: 33
    Dernier message: 28/10/2005, 17h03

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