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

Bases de données Delphi Discussion :

mise a jour somme sur dataset filtré


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut mise a jour somme sur dataset filtré
    Bonsoir,

    Tout est dans le titre, mais peut-être pas très clair...
    Je m'explique :

    j'ai un dataset qui contient des champs numeriques et un champ varchar.
    sur ma form, j'ai une dbgrid connectée à ce dataset, et une listbox qui contient toutes les occurences du champs varchar. J'utilise cette listbox pour effectuer un filtre sur le dataset .

    Sur ma form, j'ai egalement un label qui me sert à afficher la somme d'un des champs numeriques. cette somme doit donc varier en fonction du filtre que je vais appliquer.

    Je n'ai pas trouver de solution "élégante" pour effectuer ceci.
    la seule que j'ai trouvée consiste à parcourir le dataset après chaque changement de filtre afin de recalculer la nouvelle somme. Le problème est que je vois le cursor du dataset parcourir la dbgrid en même temps, et ça, comme je le disais, ce n'est pas très élégant...

    Existe-t-il une solution alternative ?
    les champs agrégats, peut-être... si oui, comment ça fonctionne ?

    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Salut;

    voilà ce que j'aurais fais (à ta place ):

    - une requête dont la paramètre est la valeur du edit qui change celui-ci servira dans la clause groupe by puisqu'il s'agit d'une agrégation de données.

    - pour ce qui est de l'effet du DBGrid je te conseil d'utiliser les méthodes EnableControls et DisableControls pour justement lutter contre cet effet.


    une petite mise en œuvre du second point : (tiré du help Delphi 7)
    Table1.DisableControls;
    try
    Table1.First; { Aller sur le premier enregistrement qui définit EOF à False }
    while not Table1.EOF do { Boucle jusqu'à ce qu'EOF soit à True }
    begin
    { Traiter chaque enregistrement ici }
    ...
    Table1.Next; { EOF à False en cas de succès*; EOF à True quand Next échoue sur le dernier enregistrement }
    end;
    finally
    Table1.EnableControls;
    end;
    Bonne chance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Merci pour les EnableControls et DisableControls, ça va me permettre déjà de mettre en place une premiere solution.

    Pour la requete, je vais expliquer un peu plus le contexte de mon appli :
    En fait, je n'accède pas directement à la base de données. je passe par un serveur web.
    J'envoie ma requete au serveur web dans une clause "GET" et il me repond en html en equivalent de structure CSV (Coma Separated Values).
    Je fais un "parsing" sur la page html reçue en reponse, et j'alimente un dataset. C'est ce dataset que je manipule ensuite à l'écran avec une dbgrid et quelques dbedit.
    Dans le cas précis qui m'interesse, ma requete me retourne toutes les données d'une date. Ensuite, à l'aide du dataset.filter, je selectionne certains enregistrements. je travaille donc en local sur le résultat d'une requete "wide", car les performances reduites de l'accès à la dbase m'interdisent un acces permanent.

    Donc, dans ce contexte, je ne vois pas comment faire une requete sur le contenu du dataset. Si effectivement c'est possible, alors mon problème sera résolu...

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Re;

    A moins que je n'ai pas bien compris ton DataSet récupère bel et bien les données. A vrai dire je ne vois pas où est le problème. Puis-je savoir par quel composant tu accèdes à tes données ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  5. #5
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Oui, mon dataset récupère bien les données, mais toutes les données pour une date donnée.

    mais je donne la possibilité à l'utilisateur de restreindre (a l'interieur de cette date) la quantité de record affichés dans la dbgrid en appliquant des filtres sur le dataset.

    Prenons un cas concret :
    structure du dataset :
    com_date : date // Date
    com_nom : string // nom du commercial
    com_ca : real // Chiffre d'affaire
    com_dpt : string // Département

    la dbgrid affiche donc tous les records pour une date donnée.
    le label_ca_jour contient la somme du ca de cette date.

    2 listbox différentes permettent à l'utilisateur de filtrer sur un ou plusieurs commerciaux et un ou plusieurs département

    dans ce cas, le dataset contient toujours la totalité des records pour cette date, mais la dbgrid n'en affiche plus qu'une certaine quantité (fonction de ce qui a été selectionné dans les listbox)

    et c'est là que je souhaiterais que le label_ca_jour, soit mis à jour avec la somme des CA "filtrés"

  6. #6
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Bon, voici ce que j'ai fait.
    J'appelle cette fonction à chaque changement de filtre sur le com_dataset. Elle me retourne l'agrégat "sum" sur le champ n°2 du dataset.
    reste qu'à le convertir en pchar pour l'affecter au label_CA.caption

    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
    function MaJCA:integer;
    var CurPos : integer;
    begin
       result := 0;
       with com_dataset do begin
          DisableControls;
          CurPos := RecNo;
          first;
          while not eof do begin
              inc(result,fields[2].AsInteger);
              next;
          end;
          RecNo := CurPos;
          EnableControls;
       end;
    end;
    Merci de ton aide, Just-Soft

    En fait, c'est surtout l'appel à DisableControls / EnableControls qui rend la function vraiment performante (et élégante...)

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

Discussions similaires

  1. Mise A Jour dans un Dataset
    Par Identifiant dans le forum Accès aux données
    Réponses: 2
    Dernier message: 27/12/2007, 11h11
  2. [RJS] mise à jour ajax sur un groupe de checkbox
    Par gyome314 dans le forum Ruby on Rails
    Réponses: 10
    Dernier message: 13/04/2007, 16h02
  3. Mise a jour automatique sur excel?
    Par fredieuric dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/12/2006, 12h41

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