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

 Delphi Discussion :

Champs calculé à partir de 2 tables Paradox


Sujet :

Delphi

  1. #1
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut Champs calculé à partir de 2 tables Paradox
    Bonsoir,
    voilà, j'ai 2 tables paradox
    ARTICLES(N_Item, Designation, Prix_Unitaire, Qte_commandée)
    LIVRAISON(Date_Livraison, N_Item, Qte_Livree)

    Je voudrais ajouté un champs calculé à ma table: LIVRAISON
    Le champs Solde aura pour résulat :
    SOLDE= Qte_Commandee - Qte_Livree

    Le premier champs étant un champs de la 1ère table, et le 2ème étant un champs de la 2ème table

    Par quel moyen puis je effectuer ce calcul automatiquement ?????

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    ouch ,

    s'il y a un seul enregistrement par article facile , mais je ne pense pas que ce soit le cas . De plus il ne me semble pas que Paradox ai des champs calculés genre COMPUTED BY de Firebird. J'en déduis donc que tu veux parler d'un SQL permettant d'obtenir SOLDE ? donc l'utilisation d'une jointure
    JOIN

    je te conseilles d'aller sur les forums Paradox et SQL
    pour Paradox j'y ai lu quelque chose à propos de vues ici le message de tryexceptend
    quant a SQL le cours sur les jointures est
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour obtenir un champ calculé de ce type, il faut utiliser un TQuery et une requête qui va interroger tes deux tables Articles et Livraison.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Select Articles.*, Livraison.*
    From Articles Left Outer Join
      Livraison On Articles.N_ITEM = Livraison.N_Item
    (revoir peut-être la requête car j'ai laissé tomber Paradox pour SQL server depuis longtemps maintenant...)

    A partir de ton composant TQuery, tu affiches l'éditeur de champ puis tu ajoutes un nouveau champ.
    Livraison de type Float et calculé.

    Ensuite, il te suffit de compléter l'événement OnCalcFields du TQuery avec quelque chose comme cela:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DataSet.FieldByName('Livraison').AsFloat :=
      DataSet.FieldByName('Qte_Commandée').AsFloat -
      DataSet.FieldByName('Qte_Livree').AsFloat;
    Attention, le champ livraison ne sera pas ajouté à ta table livraison. Ce champ n'existera que le temps où ta requête est active, donc parfait pour l'affichage ou tout simplement pour accéder à cette valeur lors de tes traitements.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  4. #4
    Membre régulier Avatar de souminet
    Inscrit en
    Novembre 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 351
    Points : 111
    Points
    111
    Par défaut
    Attention, le champ livraison ne sera pas ajouté à ta table livraison. Ce champ n'existera que le temps où ta requête est active, donc parfait pour l'affichage ou tout simplement pour accéder à cette valeur lors de tes traitements.
    En fait, moi j'aurais besoin d'un champs persistant!!
    alors puis je utiliser un traitement (Du code delphi) pour effectuer le calcul (La soustraction) en d'autres termes : l'état du stock en temps réel???
    A chaque retrait d'article l'état du stock doit être actualisé

    Merci+++++++++++++

  5. #5
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    ARTICLES(N_Item, Designation, Prix_Unitaire, Qte_commandée)
    LIVRAISON(Date_Livraison, N_Item, Qte_Livree)
    Selon la logique sous-jacente au modèle de table présenté ce que tu demandes n'est pas possible.
    Peux-tu décrire mieux les règles de gestion qui décrivent l'ajout, et la modification des enregistrement de ces tables.
    Je pourrai ainsi mieux répondre à ta demande

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Le champ Livraison est remis à jour à chaque livraison grâce à l'événement onCalcFields. Où est le problème ?

    La seule restriction se situe, comme je te l'ai expliqué, dans le fait que ce champ ne sera pas ajouté à ta table.

    Pour t'en convaincre applique la procédure que je t'ai décrite.
    Avec Paradox tu ne pourras hélas pas faire mieux, ou alors change de SGBD.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Pascal Jankowski à écrit

    Où est le problème ?
    Imaginons les opérations suivantes créés chronologiquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Ajout articles : 1,"A",15,150 ;
    Ajout livraison : "08/08/2008",1,40
    Ajout articles :  1,"A",15,200 ;
    Ajout livraison : "07/08/2008",1,50
    Avec ces informations peux tu me donner l'état du stock à un instant donné ?
    Bravo monsieur l'astrologue !
    C'est pour celà que je demandait à Souminet de mieux expliquer son problème.

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    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 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    je verai bien un truc dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Select sum(Articles.Qte_commandée) as Qte_commandée
    ,sum(Livraison.Qte_Livree) as  Qte_Livree
    ,sum(Articles.Qte_commandée)-sum(Livraison.Qte_Livree) as CHCALCUL
    From Articles Left Outer Join
      Livraison On Articles.N_ITEM = Livraison.N_Item
    group by Articles.N_ITEM,Livraison.N_Item
    @+ Phil
    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 expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    En créeant simplement deux fonctions qui vont rechercher les quantités commandées et livrées.

    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
     
    function TForm1.getQTE_Commandee(n_item: string): double;
    begin
      Result := 0;
      with TQuery.Create(nil) do
      try
        DatabaseName := 'laDataBase';
        sql.Text := 'select sum(qte_commandee) '+
                    'from Article '+
                    'where n_item = '+quotedStr(n_item);
        try
          Open;
          Result := Fields[0].AsFloat;
        except
          raise;
        end;
      finally
        Free;
      end;
    end;
    function TForm1.getQte_livree(n_item: string): double;
    begin
      Result := 0;
      with TQuery.Create(nil) do
      try
        DatabaseName := 'laDataBase';
        sql.Text := 'select sum(qte_livree) '+
                    'from Livraison '+
                    'where n_item = '+quotedStr(n_item);
        try
          Open;
          Result := Fields[0].AsFloat;
        except
          raise;
        end;
      finally
        Free;
      end;
    end;
    Puis modifier le oncalcfield de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DataSet.FieldByName('Livraison').AsFloat :=
      getQTE_Commandee(DataSet.FieldByName('n_item')) -
      getQte_livree(DataSet.FieldByName('n_item'));
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Par contre si l'on veut réellement gérer un stock on doit s'y prendre tout autrement.
    L'une des solutions consiste à passer par une table des mouvements de stock qui enregistre à chaque mouvement d'entrée ou de sortie la quantité respectivement dans un champ stock_entrees, stock_sorties.

    Les opérations d'entrées sont les suivantes:
    les inventaires, les réceptions de commandes (achats), les retours clients (ventes) (suite à un avoir), les assemblages lors d'une production pour un produit fini, les rééquilibrages de stock.

    Les opérations de sorties sont les suivantes:
    les bons d'expédition, les bons de retour (fournisseurs), les assemblages lors d'une production pour les articles de conditionnement, les rééquilibrages de stock.

    A tout instant pour connaître le stock d'un article
    VS(article) = [Valeur de l'inventaire](article) + [stock_entrees](article) - [stock_sortis](article)

    Il faut bien entendu penser que l'on doit pouvoir gérer plusieurs types d'articles :
    1 - les articles de type lot,
    2 - les articles de type serie,
    3 - les articles de type taille/pointure/couleur
    4 - les nomenclature de production.

    Pour les articles de type lot, il faut ajouter un champ lot dans la table des mouvements pour être capable de calculer l'état en stock d'un lot.

    VS(article)(lot) = [Valeur de l'inventaire](article)(lot) + [stock_entrees](article)(lot) - [stock_sortis](article)(lot)


    De même pour les articles sérialisés ajouter un champ serie dans la table des mouvements. (les quantités en entrée ou en sortie pour un article de ce type est toujours de 1)

    VS(article) = somme([Valeur de l'inventaire](article)(serie)) + somme([stock_entrees](article)(serie)) - somme([stock_sortis](article)(serie))


    C'est encore le même principe pour les articles de type taille/pointure/couleur...

    Quant aux articles de type nomenclature de production.
    il faut quand on assemble ce type d'article
    - effectuer une entrée dans la table des mouvements indiquant la valeur stock_entree son numéro de lot éventuellement.
    - pour les artilces qui le composent (articles de conditionnement), il faut effectuer une sortie de stock et éventuellement instruire chaque numéro de lot.

    Pour résumer la table des mouvements de stock doit disposer au minimum des champs suivants:

    Id,
    ref_piece: référence à une opération de stock
    articleID: référence à une entrée dans la table des articles
    numero_lot:
    numero_serie:
    pointure_taille_couleur:
    stock_entrée:
    stock_sortie:

    On peut y ajouter deux champs:
    cmdes_client:
    cmdes_fournisseurs:
    Cela permet d'effectuer un calcul du stock à terme puisque par définition ce qui est en commande n'est pas encore réceptionné ou envoyé mais devrait l'être sans doute.
    VSAT (article) = VS(article) + cmde_fournisseur - cmdes_client

    Pour la production il faut ajouter un champ:
    Qte_reservee:
    Cela permet de calculer l'état en stock articles de conditionnement avant un assemblage.

    Il y a encore beaucoup à dire sur la gestion des stocks avec notamment les réapprovisionnements automatiques, la gestion des inventaires tournant etc...

    Pour terminer, ce type de table permet d'obtenir une traçabilité complète des mouvements de stock par aticle/lot... et opérations de stock.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  11. #11
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    à Pascal Jankowski
    Merci pour lui (Souminet) ! Quoi que je ne sois pas sur qu'il ait suivi cette discussion.
    PS. Les réunions de Delphinautes existent elles toujours ?

Discussions similaires

  1. [AC-2003] Récupération des résultats de champs calculés formulaires vers une table
    Par Epi d'or dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 16/02/2011, 11h38
  2. Réponses: 3
    Dernier message: 14/10/2010, 10h49
  3. [AC-2003] Champs calculé à partir de 2 tables différentes
    Par p0ulpy dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/04/2009, 14h17
  4. [Table]champ calculé à partir des autres champs
    Par mjihanne dans le forum Access
    Réponses: 10
    Dernier message: 28/03/2007, 17h36
  5. Calcul à partir d'une table
    Par Didi17 dans le forum Access
    Réponses: 1
    Dernier message: 28/10/2005, 08h37

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