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 :

Calculer le total des versements


Sujet :

Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 2
    Points
    2
    Par défaut Calculer le total des versements
    salam,bonjour
    je suis en train de crée un logiciel avec delphi 7 ;
    j'ai une table(versement) qui contient les champs suivants:

    -date_versement (clé principale)
    -versement
    -numero_facture (clé étrangère)
    -total_versement (champ calculé)

    une facture peut avoir plusieurs versements et je veux calculer le total des versements pour une facture.

    alors j'ai crée un champs ( total) calculé dans la table (versement ) et j'ai met dans l'événement oncalcfield:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure
    var v,i:integer;
    begin
    v:=0;
    versement.filter:='numero_facture='+versemtnumero_facture.value;
    versement.filtered:=true;
    versement.first;
    for i:=0 to versement.recordcount-1 do
       begin
           v:=v+versementversement.value;
            versement.next;
       end;
    versementtotal_versement.value:=v;
    end;
    et quand j'exécute, ça se bloque.
    je ne sais pas où est l'erreur.

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Le parcours de la boucle est faux.
    si tu utilises First/Next, il faut tester Eof. (par contre je n'utilise pas les filtres, donc je ne sais pas comment ça va se comporter)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure
    var v,i:integer;
    begin
    v:=0;
    versement.filter:='numero_facture='+versemtnumero_facture.value;
    versement.filtered:=true;
    versement.first;
    while not versement.eof do begin
    v:=v+versementversement.value;
    versement.next;
    end;
    versementtotal_versement.value:=v;
    end;

  3. #3
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    slt ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_versement (clé principale)

    dans une date on peut effectué plusieurs versement , je vous propose de faire un clé versement.
    utilise la procédure de linkin sur ton query de sélection au lieu de la table versement .

  4. #4
    Membre habitué Avatar de abdelghani_k
    Inscrit en
    Octobre 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Octobre 2002
    Messages : 184
    Points : 150
    Points
    150
    Par défaut
    Tu es tombé dans une boucle infinie.

    une telle boucle qui utilise la même table dans un evènement oncalcfield de cette table ca bloque.
    tu changes le code en:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
        qvers.parambyname('num_fac').value:=facturesnumero_facture.value;
        qvers.close;qvers.open
        versementversement.value:=qverssomme.value;
    end;
    qvers est un composant Tquery; ayant comme sql l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(total_versement) as somme from versement where  numero_facture=:num_fac
    et qvers.datasource:=dsfactures; //datasource de facture
    num_fac est le champ clé primaire dans la table facture.

    Linkin a raison pour la boucle (test avec eof).

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    merci a vous tous ,je vais essai vos conseil

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    mais pour calculer le total des versement d'une facture je doit faire le filtre oui ou non? parce que la table versement contient plusieurs versements de plusieurs factures.

  7. #7
    Membre averti Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 342
    Points : 394
    Points
    394
    Par défaut
    Citation Envoyé par moh_oracle Voir le message
    salam,bonjour
    je suis en train de crée un logiciel avec delphi 7 ;
    j'ai une table(versement) qui contient les champs suivants:

    -date_versement (clé principale)
    -versement
    -numero_facture (clé étrangère)
    -total_versement (champ calculé)

    une facture peut avoir plusieurs versements et je veux calculer le total des versements pour une facture.

    alors j'ai crée un champs ( total) calculé dans la table (versement ) et j'ai met dans l'événement oncalcfield:
    Je crois que tes difficultés viennent d'une erreur de conception de tes tables :
    -- ta table TVersements ne peut pas contenir le total de ta facture; donc, il faut :
    -- une table TVersements
    +TVersements
    |+DateVersement (clé principale)
    |+Montant
    |+NumeroFacture (clé étrangère)

    -- et une table TFactures
    +TFactures
    |+NumeroFacture (clé principale)
    |+TotalFacture
    |+RestantDu

    A chaque nouveau versement dans TVersements, tu mets à jour le champ TFactures.RestantDu qui vaut TFactures.TotalFacture moins la somme calculée selon abdelghani_k :
    Citation Envoyé par abdelghani_k (modifié) Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(versement) as somme from TVersements where  NumeroFacture =: num_fac
    Avec cette structure, tu peux trouver facilement les factures complètement acquittées TFactures.RestantDu = 0, les factures non payées TFactures.RestantDu = TFactures.TotalFacture, et les autres ...

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    La logique de archonte est juste.
    Je voudrais juste préciser que si ta base de donnée supporte les champs calculé, il est préférable de mettre le champs TFactures.RestantDu en champs calculé directement dans la base de donnée.

    A+

  9. #9
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    re ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    +TVersements
    |+DateVersement (clé principale) // 
    |+Montant
    |+NumeroFacture (clé étrangère)
    date versement comme clè primaire là
    on peut effectué plusieurs versements dans date données bien sur de plusieurs client .
    y'a une probabilité que le même client fait deux versement la même journée
    je propose N° de versement

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par redoran Voir le message
    date versement comme clè primaire là
    on peut effectué plusieurs versements dans date données bien sur de plusieurs client .
    y'a une probabilité que le même client fait deux versement la même journée
    je propose N° de versement
    Une date ne se limite pas qu'à la date du jour, il y a aussi les heures/Minutes/Secondes/Miliisecondes qui peut très bien faire une clé primaire

  11. #11
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Slt ; rayek dans le cas que vous avez cité avec date -heures-minutes-seconde c'est

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 744
    Points : 5 434
    Points
    5 434
    Par défaut
    Une date ne se limite pas qu'à la date du jour, il y a aussi les heures/Minutes/Secondes/Miliisecondes qui peut très bien faire une clé primaire
    Je ne trouve pas ça très propre !
    En plus un champ date de se format prend beaucoup plus de place qu'un simple entier (Il n'y a pas non plus des millers de versement pour une facture)

    Selon moi la table des versement devrait avoir une clé primaire composée du numéro de facture et d'un ID, la date étant simplement une information.

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par popo Voir le message
    Je ne trouve pas ça très propre !
    En plus un champ date de se format prend beaucoup plus de place qu'un simple entier (Il n'y a pas non plus des millers de versement pour une facture)

    Selon moi la table des versement devrait avoir une clé primaire composée du numéro de facture et d'un ID, la date étant simplement une information.
    Je n'ai jamais dit le contraire c'était juste pour répondre à Redoran que c'était possible et qu'une date n'est pas limitée à la date du jour

  14. #14
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Points : 134
    Points
    134
    Par défaut
    Je me demande s'il n'est pas bien mieux de mettre juste un ID (pas besoin forcément d'une clé composée), la date faisant simplement office de clé étrangère peut-être...
    Moh_Oracle, évite déja de laisser des champs calculés dans tes modèles quand une simple requête peut te renvoyer le résultat!

  15. #15
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Bonjour ; +1 Mstr toute a fait d'accord ;
    Moh utilise la méthode de linkin avec une requête de selection est tu aura ton total pas besoin de faire un filtre , sinon sa marche très bien avec un filtre si je ne me trompe pas

  16. #16
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 744
    Points : 5 434
    Points
    5 434
    Par défaut
    Je me demande s'il n'est pas bien mieux de mettre juste un ID (pas besoin forcément d'une clé composée), la date faisant simplement office de clé étrangère peut-être
    Il s'agit de facturation, ce qui implique qu'une facture peut avoir plusieurs réglements. En général on recherche le règlement par rapport à la facture et non l'inverse ! En plus il va falloir avoir un ID très long et/ou très compliqué pour garantir l'unicité.
    Coupler l'ID avec le numéro de la facture permet non seulement une recherche plus rapide car le numéro de facture est automatiquement indexé mais il permet aussi de multiplier la capacité d'enregistrement puisqu'un ID poura être utilisé plusieurs fois sans provoquer de doublons.

    Pour ma part, je gère les versements avec un ID de type entier couplé avec le numéro de facture.

  17. #17
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    merci pour vos conseils ;

  18. #18
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    salut,j'ai besoin de vos aides encore;
    pour calculer le solde (montant_global-total_versement);
    j'ai met le champ solde (champ calculé) dans la table facture comme il m'a conseil archonte.
    --num_fact
    --montant_global
    --solde
    et dans l'évènement oncalcfield de la table facture:
    facturesolde.value:=facturemontant_global.value - Querytotal_versement.value

    mais a l'exécution un message d'erreur apparis:
    type incompatible :float et extented.

    merci de vos aides

  19. #19
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 744
    Points : 5 434
    Points
    5 434
    Par défaut
    Le "value" ne renvoie pas de type Float, ni de type Extended, il renvoie une donnée de type Variant.

    ll faut utiliser une forme de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mt_glob := MonQuery.FindField('facturemontant_global').AsFloat;
    mt_vers := MonQuery.FindField('total_versement').AsFloat;
    mt_solde := mt_glob-mt_vers;

  20. #20
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 2
    Points
    2
    Par défaut
    abon, je vais l'essai,
    je suis variment nul en delphi ,vous n'avez pas quelle documentation sur delphi.

Discussions similaires

  1. Calculer le total des nombres flottant (map)
    Par Leptitjour dans le forum Débuter
    Réponses: 2
    Dernier message: 28/09/2014, 18h08
  2. Calcul du total des commandes effecutées par client
    Par romain404 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/09/2009, 14h54
  3. [MySQL] Calcul du total des ventes et des consommations
    Par dubitoph dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/10/2007, 17h16
  4. [VBA-A] calcul du total des heures d'une période
    Par aibar dans le forum VBA Access
    Réponses: 2
    Dernier message: 11/06/2006, 00h16
  5. [rave report] Calculer un total
    Par webbulls dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2004, 16h53

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