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

Composants VCL Delphi Discussion :

DBGrid ou StringGrid ou autre


Sujet :

Composants VCL Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut DBGrid ou StringGrid ou autre
    bonjour,

    j'ai par exemple une base de donnée avec Prix_unitaire , quantité , durée
    dans une dbgrid j'affiche Prix_unitaire , quantité , prix_tot , durée
    en faisant la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select  Prix_unitaire , quantité ,  Prix_unitaire * quantité as prix_tot , durée
    jusque la, ça va, mais je voudrais pouvoir changer la valeur de la cellule ou il y a le total (mais qui correspond a aucun champ), en changeant le total, je voudrais que ça me recalcule le "Prix_unitaire" , mais la cellule prix_tot est du coup en lecture seule... comment on peut faire ?

    2ème problème (pas important, juste pour la présentation), le champ "durée" est un entier, donc ça affiche 1,2,3, etc. peut on afficher le texte "1 mois" au lieu de 1 mais quand on change la valeur, on tape que 2, et non 2 mois... je sais pas si je suis clair.. , en fait, qu'il y ait le mot "mois" a l'affichage mais que la cellule corresponde toujours a l'entier "durée" de la base de donnée..


    j'ai essayé de passer par un stringgrid, mais du coup, les autres champs boolean sont galère car il faut gérer la case a cocher, et puis c'est moins pratique pour mettre a jour la base...


    bref, y'a moyen de faire ce que je veux avec un dbgrid ou faut que je continues avec un stringgrind ou y'a un autre compo plus adapté ?

    merci

    ps: info supp delphi 2006 ADOquery mssql

    exyacc

  2. #2
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    pour la mise à jour de la valeur, il faut utiliser un champ calculé.

    pour l'affichage modifié, de mémoire, c'est ongettext et onsettext du composant TField (TIntegerField par exemple) qui gère ça

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    c'est sur l'ADOquery qu'on trouve le champs calculé ?

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Il faut ajouter un champ et indiquer qu'il s'agit d'un champ calculé. Le calcul se fait dans l'evenement OnCalcfields

    http://docs.embarcadero.com/products...alcFields.html


    http://www.componentace.com/calculated-field-delphi.htm

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    ok merci.
    je cherchais un bouton dans l'editeur de champ de l'adoquery alors qu'il suffisait de faire click droit dans le fenetre vide...

    je regarde ça
    encore merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    dans mon AdoQuery j'ai maintenant: select Prix_unitaire , quantité , durée

    j'ai ajouté un champ calculé prix_tot (il a créé un adoqueyprix_tot)

    dans le OnCalcFields de mon adoquery j'ai mis

    dataSet.fieldByName('prix_tot').AsCurrency := dataSet.fieldByName('Prix_unitaire ').AsCurrency* dataSet.fieldByName('quantité ').AsInteger;


    j'ai bien la valeur prix_tot qui reapparait dans ma dbgrid, mais je suis toujours en lecture seule dessus, j'ai oublié quelque chose ?

    apres je suppose qu'il faut clicker sur le champ calculé prix_tot et mettre dans l'évevement on change, quel valeur je veux modifier (ici prix_unitaire) quand je change le total, c'est ça ?
    mais il me laisse pas la changer...

  7. #7
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    une propriété autoedit dans le tadoquery ?

  8. #8
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    pour la mise à jour de la valeur, il faut utiliser un champ calculé.
    Il me semble que les champs calculés (FieldKind = fkCalculated) ne sont pas éditables même si ReadOnly est bien à, False.
    Je ne connais pas ADO mais la première approche me parait bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select  Prix_unitaire , quantité ,  Prix_unitaire * quantité as prix_tot , durée from table
    Générer les fields du tadoquery et regarder le field Prix_tot il doit être en ReadOnly= True. Mettez le à False.

    Et gérer dans l'évènement 'OnValidate' du fieldPrix_tot le changement du
    fieldPrixUnitaire.asCurrency := fieldPrix_tot.ascurrency / FieldQuantite.asCurrency;

    Enfin faudrait s'assurer que quantité n'est pas zero :p

    Apres si quantité est prix unitaire sont des champs modifiables cela devient plus compliqué il faudra probablement aussi gérer dans le OnValidate de ces fields le recalcul de Prix_tot tout en s'assurant d'avoir désactivé le OnValidate du fieldPrix_Tot sinon vous risquez de boucler :p

    En résumer :
    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
    Form.ADOQueryPrix_totValidate(Sender: TField);
    var MaProc : TFieldNotifyEvent;
    begin
      If ADOQueryQuantite.asCurrency <> 0 then
      begin
        MaProc := ADOQueryPrix_Unitaire.OnValidate;
        ADOQueryPrix_Unitaire.OnValidate := nil;
        ADOQueryPrix_Unitaire.AsCurrency := ADOQueryPrix_Tot.asCurrency / ADOQueryPrix_Quantite.Ascurrency;
        ADOQueryPrix_Unitaire.OnValidate := MaProc;
      end;
    end;
    Form.ADOQueryQuantiteValidate(Sender: TField);
    var MaProc : TFieldNotifyEvent;
    begin
        MaProc := ADOQueryPrix_tot.OnValidate;
        ADOQueryPrix_tot.OnValidate := nil;
        ADOQueryPrix_tot.AsCurrency := ADOQueryPrix_Unitaire.asCurrency * ADOQueryPrix_Quantite.Ascurrency;
        ADOQueryPrix_tot.OnValidate := MaProc;
    end;
     
    Vous pouvez utiliser le ADOQueryQuantiteValidate dans le OnValidate du field ADOQueryPrix_Unitaire plutot que de recopier le même code.


    Citation Envoyé par exyacc Voir le message
    2ème problème (pas important, juste pour la présentation), le champ "durée" est un entier, donc ça affiche 1,2,3, etc. peut on afficher le texte "1 mois" au lieu de 1 mais quand on change la valeur, on tape que 2, et non 2 mois... je sais pas si je suis clair.. , en fait, qu'il y ait le mot "mois" a l'affichage mais que la cellule corresponde toujours a l'entier "durée" de la base de donnée..
    Utilisez les propriétés des fields : soit par programme
    DisplayFormat := '0 mois';
    EditFormat := '#';
    Soit dans l'EDI lors de la conception.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    merci pour vos réponses.

    Prix_tot il est bien en ReadOnly= False. mas je peux toujours pas le modifier

    Prix_tot , le champ calculé est donc un Tcurrencyfield, dans les propriétés keyfields, lookupdataset, lookupkeyfields, lookupresultfields , j'ai rien mis, pas ça le pb ?



    cdmt

  10. #10
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    ça me parait normal puisqu'il est calculé. Sa valeur dépend des éléments de calcul et pas de la saisie utilisateur.
    S'il faut pouvoir le modifier il faut agir autrement. Le champ doit faire partie de la table résultats.
    La modification manuelle sera alors possible. La mise à jour en fonction des autres valeurs peut se faire à partir des changements de ces valeurs. Il faut détecter le moment où ces valeurs changent pour mettre à jour la valeur prixtot

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    oki, donc en fait il a pas de différence entre faire un champ calculé et faire le calcul dans la requête ?

    sachant que je peux pas modifier la table, ni la base (propriétaire), il me reste juste la solution d'un stringgrid ?

  12. #12
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    J'ai donné une réponse qui fonctionne, il suffit de suivre mes explications et vous y arriverez...

    Ne pas utiliser de champs calculé par delphi (de type "FieldKind = fkCalculated") car ils ne sont pas modifiables.

    Suivez mes explications, si vous ne comprenez pas dites où vous buttez, j'essayerai de détailler plus.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    barbibulle, en fait j'avais tout compris ... de travers
    quand tu as dis : "regarder le field Prix_tot il doit être en ReadOnly= True. Mettez le à False." j'etais dans les champs de la dbgrid au lieu de l'adoquery (j'avais les 2 fenêtres d'ouvertes), donc du coup le readonly etait a false donc je me suis dis, ah, peut etre que son truc marche pas avec ADO.... apres j'ai relu : "Je ne connais pas ADO mais la première approche me parait bien" , ma première approche c’était avec une stringgrid donc voila j'avais tout faux...


    bref, j'ai bien re suivi ce que tu as dis, et ça marche ! :o) il met bien le PU a jour quand je change le total, par contre quand je remplace par ex 12 par 13 dans le tot, il reste a 12 dans l'affichage, je dois changer d'enregistrement et revenir dessus pour voir 13, j'ai du mettre un adoquery.requery dans le 'OnValidate' , normal ?

    comme tu le dis plus bas, les 2 champs sont modifiables, donc je vais essayer ton code , j'ai aussi un autre champ %remise qui lui aussi modifie ces champs la...je vais tester tout ça, et je reviens pour dire le résultat.

    merci encore

    cdmt

  14. #14
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Bonjour ,

    J'aime bien la solution de Frédéric Barbibulle que je :plussoie: , il faudrait peut être aussi regarder du côté de la propriété cacheupdate . Je ne suis pas un fan de ADO moi non plus , mais j'ai souvenance d'avoir pu gérer des champs ajoutés (donc calculés) de cette manière .

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    salut Sergio

    tu dis que tu es pas fan de ADO,
    je suis sous delphi 2006, MS sqlserver
    y'a mieux que ADO ?

  16. #16
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Re,

    pour preuve que je ne suis pas fan , je viens de voir que cacheupdate ne semble pas présent avec ADO
    Actuellement (D7,D2010) je suis très ZEOSDBO mais avec XE(4 dans mon cas) je serais très bientôt Firedac
    donc , si je devais utiliser D2006 et msSQL j'utiliserai certainement ZEOSDBO mais je ne sais quelle version de msSQL est supportée

  17. #17
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Citation Envoyé par exyacc Voir le message
    bref, j'ai bien re suivi ce que tu as dis, et ça marche ! :o) il met bien le PU a jour quand je change le total, par contre quand je remplace par ex 12 par 13 dans le tot, il reste a 12 dans l'affichage, je dois changer d'enregistrement et revenir dessus pour voir 13, j'ai du mettre un adoquery.requery dans le 'OnValidate' , normal ?
    Non ce n'est pas normal. Je n'ai pas Delphi 2006 pour tester mais sous D7 ça fonctionne (enfin je n'ai pas essayé avec ADO mais avec les IBX)

    Peut être un problème avec la requete refresh. Autant la requete Insert, Update ne doivent pas avoir le champ Prix_Tot (issu du select (prix_unit*Quantite) as Prix_Tot from...) autant la requete refresh doit être similaire à celle du select.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Par défaut
    cool, ça marche.

    j'ai du ajouter un query.requery dans le onchange, sinon j'avais des problèmes de raffraichissment

    merci à tous (surtout a Barbibulle )


    a+

    cdmt

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

Discussions similaires

  1. D'un DBGrid à un StringGrid
    Par nanine85 dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/05/2009, 11h38
  2. Coller une ligne Excel vers un StringGrid ou autre
    Par Kok1k1du dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/11/2008, 18h20
  3. Réponses: 2
    Dernier message: 08/01/2007, 20h26
  4. Ou trouver dbgrid, et autres
    Par Lecomte olivier dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/06/2006, 16h45
  5. Question sur la stringgrid et autres problemes .
    Par jamah dans le forum Composants VCL
    Réponses: 1
    Dernier message: 01/12/2005, 17h58

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