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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 54
    Localisation : Algérie

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

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    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 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    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 ?

  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 : 54
    Localisation : Algérie

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

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    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 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 173
    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 ?

  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 : 54
    Localisation : Algérie

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

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    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 491
    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 491
    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

+ 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