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 :

probleme calculatedfield !


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut probleme calculatedfield !
    salam

    je voulais faire un petit calcule dans un champ qui n’existe pas dans ma BDD alors j'ai crée un
    floatfield fieldkind=fkCalculated
    de type float et j'ai fais ma boucle pour affichez les enregistrement comme suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    with myadoquery do
      begin
     
         First;
        while not Eof do
        begin
          Edit;
          FieldByName('Qte.%').AsFloat:= (FieldByName('Qte').AsInteger * 100 ) / volumeproduitpareto.FieldByName('Ssqr').AsInteger;
          post;
         // ShowMessage(FloatToStr(FieldByName('Qte.%').AsFloat)); un petit teste pour voire ce qui ce passe
          Next;
     
        end;
    ce qui ce passe la c'est que le chiffre calculé ce met bien dans le champ Qte.% mais dé que la boucle passe a l'enregistrement suivant le chiffre disparais et ainsi de suite et a la fin je me retrouve avec une colonne vide donc voila je veut gardé les chiffre affichez dans les colonne et merci d'avance.
    Delphi XE8 Architect - Win 10

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon jour
    pas besoin d'une boucle vous faite juste dans l'evenement onCalcFields le code suivent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
    FieldByName('Qte.%').AsFloat:= (FieldByName('Qte').AsInteger * 100 ) / volumeproduitpareto.FieldByName('Ssqr').AsInteger
    end;
    bon courage

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 061
    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 061
    Points : 41 018
    Points
    41 018
    Billets dans le blog
    62
    Par défaut
    Attention à la division par zéro
    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

  4. #4
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    en plus si c'est un simple calcul , tu peut le faire dans la requête
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  5. #5
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Points : 757
    Points
    757
    Par défaut
    Citation Envoyé par edam Voir le message
    en plus si c'est un simple calcul , tu peut le faire dans la requête
    Pas sûr car le diviseur semble venir d'une autre source de données.

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par tarekk73 Voir le message
    bon jour
    pas besoin d'une boucle vous faite juste dans l'evenement onCalcFields le code suivent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Table1CalcFields(DataSet: TDataSet);
    begin
    FieldByName('Qte.%').AsFloat:= (FieldByName('Qte').AsInteger * 100 ) / volumeproduitpareto.FieldByName('Ssqr').AsInteger
    end;
    bon courage
    merci j'ai autre chose a vous demandez (pour évitez l'ouverture d'un autre topic)... j'ai créer un autre champ calculé pour faire un cumule progressif d'un autre champ
    exp :

    champ 1 --- champ calculé

    5 5
    7 12
    20 32
    ...

    s'il y'a un moyen d’accéder a l'enregistrement suivant ça serai génial
    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pareto.FieldByName('valeur_cumulé').AsInteger:=pareto.FieldByName('Qte').AsInteger+pareto.Next.FieldByName('Qte'). AsInteger;

    je sais c'est un mais vaut mieux essayé . s'il y'a un truc similaire ça serai super et merci d'avance.
    Delphi XE8 Architect - Win 10

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    pour moi j'utilise une requette qui fait la somme, mais, là tu dis que les données proviennent de 2 base différent, alors, tu peut utilisé un variable globale et tu parcours l'ensemble de ta table (while not eof do "fais ton calcul" next)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par edam Voir le message
    pour moi j'utilise une requette qui fait la somme, mais, là tu dis que les données proviennent de 2 base différent, alors, tu peut utilisé un variable globale et tu parcours l'ensemble de ta table (while not eof do "fais ton calcul" next)
    c'est ce que j'ai fais mais a chaque fois ça me retourne la valeur original il n y'a pas de cumule .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    with pareto do
    begin
    First;
    b:=0;
     
    while not Eof do
    begin
      b:=b+FieldByName('Qte').AsInteger ;
      FieldByName('valeur_cumulé').AsInteger:=b ;
      Next;
    end;
    end;
    je suis un peut perdu la
    remarque : je fais la boucle dans l’événement oncalculfield .
    quant je la fait dans un bouton , j'aurai droit a une colonne vide .
    Delphi XE8 Architect - Win 10

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut
    j'avais pas bien lu tu ma dit variable globale et moi je l'ai fait en interne ... j'ai rattraper mon coup et je l'ai déclaré en externe ... et puisque j'ai compris que cette événement le calculfield est en lui même une boucle j'ai fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    b:=b+pareto.FieldByName('Qte').AsInteger;
    pareto.FieldByName('valeur_cumulé').AsInteger:=b;
    sans passé par une boucle.

    mai bon malgré que j'ai initialisé b a 0 laure de la déclaration les résultat étais toujours additionné a 16 ... pour remédier a ça j'ai changé l’initialisation de 0 a -16 et j'ai eu mon cumule juste.

    - ça marche est c'est résolu mais j'aimerais bien connaitre l'histoire de ce 16 et merci d'avance .
    Delphi XE8 Architect - Win 10

  10. #10
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut

    ce n'est pas ce que je fais, c'est un cumule=>champs agrégat voir l'aide en ligne, tu ne peut pas le faire dans oncalcul, on plus tu peut pas afficher une donnée agrégat avec des lignes de données, normalement dans onopen de la dataset, tu parcour les lignes et tu fait la (somme, tu cherche le max,min ...), puis tu affiche le résultat dans un chmps normal pas de type bd (TEDit, TLabel,...)
    voir aussi le TClientDataset,
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 061
    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 061
    Points : 41 018
    Points
    41 018
    Billets dans le blog
    62
    Par défaut
    une question (comme ça en passant) Quel est le SGBD utilisé ? (beaucoup de choses peuvent se faire via le SQL)
    une structure des tables serait aussi pas mal
    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

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par edam Voir le message

    ce n'est pas ce que je fais, c'est un cumule=>champs agrégat voir l'aide en ligne, tu ne peut pas le faire dans oncalcul, on plus tu peut pas afficher une donnée agrégat avec des lignes de données, normalement dans onopen de la dataset, tu parcour les lignes et tu fait la (somme, tu cherche le max,min ...), puis tu affiche le résultat dans un chmps normal pas de type bd (TEDit, TLabel,...)
    voir aussi le TClientDataset,
    moi ce que je voulais c'est afficher les résultats dans un DBGRID et pas dans un champ normal
    exp

    quantité quantité cumulé
    5 5
    7 12
    8 20
    7 27
    ...

    dans ma table je n'est que le champ quantité donc il fallait bien le créer dans l'adoquery directement et le calculé directement avec oncalcfield.



    Citation Envoyé par SergioMaster Voir le message
    une question (comme ça en passant) Quel est le SGBD utilisé ? (beaucoup de choses peuvent se faire via le SQL)
    une structure des tables serait aussi pas mal
    c'est access ... c'est un calcule de paréto j utilise une requete pour la comptage des défauts plus un trie ensuite une autre requete qui affiche seulement les 5 premiers enregistrement puisque j'ai pas trouvez un moyen de le faire directement dans la première requete a cause du trie (dé que je fais le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY Count(mon champ) DESC)
    le ne marche pas). voila .
    Delphi XE8 Architect - Win 10

  13. #13
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    tu as dis 2 source, j'ai crus que tu parle de 2 base différent
    ayayayyy, je m’excuse sergio
    1 passe au forum dédier
    2 si la même base tu peut tout faire avec une seul requête lis un peut svp
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2012
    Messages : 238
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par edam Voir le message
    tu as dis 2 source, j'ai crus que tu parle de 2 base différent
    ayayayyy, je m’excuse sergio
    1 passe au forum dédier
    2 si la même base tu peut tout faire avec une seul requête lis un peut svp
    j'ai bien fouillez et c'est ce que j'ai trouvez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with pareto do
    begin
      SQL.Clear;
      SQL.Add('SELECT top 5 code_default,disg_code, Qte, Date1, type_produit');
      SQL.Add('FROM (SELECT tempsdefaults.code_default, defaults.disg_code, Count(tempsdefaults.code_default) AS Qte, tempsdefaults.Date1, Produit.type_produit');
      SQL.Add(       'FROM (defaults INNER JOIN tempsdefaults ON defaults.code_default = tempsdefaults.code_default) INNER JOIN Produit ON tempsdefaults.produit = Produit.produit');
      SQL.Add(       'GROUP BY tempsdefaults.code_default, defaults.disg_code, tempsdefaults.Date1, tempsdefaults.produit, Produit.type_produit');
      SQL.Add(       'HAVING (((tempsdefaults.Date1) Between :date1 And :date2) AND ((Produit.type_produit)='+QuotedStr(produitpareto.Text)+'))');
      Parameters.CreateParameter('date1', ftstring, pdInput, 0,  StrToDate(datepareto1.Text));
      Parameters.CreateParameter('date2', ftstring, pdInput, 0, StrToDate(datepareto2.Text));
      SQL.Add(       'ORDER BY Count(tempsdefaults.code_default) DESC)');
      Open;
    j'aimerai bien faire le cumule de Qte directement dans la requete ça serai plus simple mais j'ai pas réussie .alors je me suis tourné vers un tintegerfield .
    Delphi XE8 Architect - Win 10

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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