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 :

TClientDataSet et les aggrégats


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 55
    Points
    55
    Par défaut TClientDataSet et les aggrégats
    Bonjour les delphistes

    Après m'être pris la tête avec les aggrégats du ClientDataSet, j'ai enfin compris le fonctionnement. Ouf !
    Sauf une chose ! bien évidemment ce que j'aurais le plus besoin...

    Voilà: mon ClientDataSet contient 4 champs de type data et 1 champ aggregat.
    Champ1: Ref (string)
    Champ2: Design (string)
    Champ3: Qte (integer)
    Champ4: QteScan (integer)
    Champ5: QteMissed; un TAggregateField qui a pour expression sum(Qte)-sum(QteScan)

    La table est remplie de manière 'manuelle' avec des .Insert - .Post
    L'index en place est basé sur Ref;Design et le GroupLevel à 2
    Ce que je veux affiché dans mon DBGrid: Ref, Design et QteMissed
    A l'exécution l'aggrégat se calcule bien mais une ligne s'affiche à chaque fois qu'il existe un couple Ref;Design dans la table
    Une bonne requete SQL avec un group by ne m'aurait pas affiché ces doublons.

    Voilà un exemple pour ceux qui comprennent pas bien

    Contenu inseré dans le table :
    Ref ; Design ; Qte ; QteScan
    R1 ; Truc1 ; 1 ; 0
    R2 ; Truc2 ; 4 ; 1
    R1 ; Truc1 ; 2 ; 1

    Ce qui s'affiche :
    Ref ; Design ; QteMissed
    R1 ; Truc1 ; 2
    R1 ; Truc1 ; 2
    R2 ; Truc2 ; 3

    Ce que je veux voir :
    Ref ; Design ; QteMissed
    R1 ; Truc1 ; 2
    R2 ; Truc2 ; 3

    Si qqun a un bon tuyau, j'en veux bien un bout

    Peck777

  2. #2
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Et pourquoi tu ne filtre pas ta table ?
    Si vous êtes libre, choisissez le Logiciel Libre.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    oui mais avec quel critère ? ? ? ?
    les filtes ne servent pas à ça

  4. #4
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    De quelle façon tu utilise ClientDataSet ? Autonome ou relié a un TQUERY par un fournisseur (DataSetProvider) ? Car dans le deuxieme cas tu peux spécifier une commande SQL dans la propriété "COMMANDTEXT" du TClientDataSet.
    Si vous êtes libre, choisissez le Logiciel Libre.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    J'ai bien sûr essayer de relier un provider à mon DataSet, mais le passage d'une commande n'est pas autorisé dans ce cas. Ceci dit ça serait beaucoup trop facile d'ailleurs, il existe des librairies de composants payantes qui proposent des composants qui font ça.

  6. #6
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Bien sûr que c'est plus facile, il suffisait de mettre la propriété "Options"/"poAllowCommandText" du fournisseur (TDataSetProvider) a "True" pour que la commande SQL fournit dans la propriété "COMMANDTEXT" du TClientDataSet soit prise en compte.
    Jette un coup d'oeil a l'aide de delphi sur le sujet.
    Si vous êtes libre, choisissez le Logiciel Libre.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par TryExceptEnd Voir le message
    Bien sûr que c'est plus facile, il suffisait de mettre la propriété "Options"/"poAllowCommandText" du fournisseur (TDataSetProvider) a "True" pour que la commande SQL fournit dans la propriété "COMMANDTEXT" du TClientDataSet soit prise en compte.
    Jette un coup d'oeil a l'aide de delphi sur le sujet.
    Je connais cette propriété, merci cela ne fonctionne pas, j'ai essayé comme tu as dit, à la conception tout semble aller, mais quand j'appelle .Execute de mon ClientDataSet, j'ai une jolie exception 'not permitted'...

    Donc, voilà ...

    J'avais bien sur consulter l'aide à ce sujet, mais il semble que ce soit surtout utilie lorsque la source de données est externe (xml par exemple). bref, à priori, les sources de données internes ne possédant pas de 'moteur' de base de données, une requete SQL ne peut donc pas être interprétée.

  8. #8
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 574
    Points
    574
    Par défaut
    Donc ton composant ClientDataSet est indépendant, il fallait le préciser !
    Si vous êtes libre, choisissez le Logiciel Libre.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    Ben oui c ce que j'ai mis dans mon premier post, j'y insert les lignes une à une.

    Bon, pour conclure, je dirais qu'il n'y a pas de solutions.
    Les champs aggrégats c'est bien, mais ça ne fonctionne pas tout à fait comme un GROUP BY comme j'ai pu le lire sur plein de site, y compris sur developpez...

    bises à tous

  10. #10
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    48
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Août 2007
    Messages : 48
    Points : 43
    Points
    43
    Par défaut
    Bonjour Peck 777

    je vois bien ce que tu veux. J'ai ouvert une discussion là dessus il y quelques temps déja et je n'ai reçu aucune mais aucune réponse même pas une ironie ! Je me demande encore pourquoi.

    Je te reprend le post ici, peut-être que tu y trouvera quelque chose :

    La méthode GetGroupState de TClientDataSet renvoie une information sur la position de l'enregistrement en cours par rapport au groupe en cours ( Premier, Milieu, Dernier, Premier et Dernier, voir pour cela DefIndexs ou AddIndex et GroupingLevel ) Soit !

    Quelqu'un at-il tenté d'utiliser cela pour grouper des enregistrements comme le ferait la clause Group by d'une requête ?

    J'ai essayé sans succès les solutions suivantes :
    A - Définir un champ calculé ( Premier : Boolean par exemple ) et le mettre à true si GetGroupState me dit que je suis sur le premier en registrement du groupe .
    Ca marche mais au moment de filtrer l'ensemble sur Premier tous les enregistrements sont filtrés ! ( L'ensemble semble vide ). Le résultat est le même quand Premier est défini comme champs calculé interne.

    B
    - Cloner l'ensemble de donnée et renseigner le champs calculé (Premier : Boolean) du nouvel ensemble ( nouveau curseur en fait ) avec le résultat de la méthode GetGroupState du premier ensemble ( premier curseur ), après avoir fait un locate sur le premier ensemble pour synchroniser les enregistrements.
    Ca marche jusque là mais le deuxième curseur ne filtre pas ( sans message d'erreur d'ailleurs).

    C- Proceder comme pour B mais copier le Data du premier ensemble au lieu de le cloner. Là ca marche. Mais cette solution ne convient pas dans mon cas.
    En effet, l'ensemble de donnée sous-jacent ( structure imposée ) n'a pas de clé primaire et pas de champs permettant d'en composer une non plus. De ce fait je suis dans l'impossibilité de localiser dans le premier ensemble l'enregistrement à synchronizer avant de renseigner Premier du second ensemble. ( à moins d'utiliser RecNo ? Tiens !)

    Une requête permetterait bien entendu de faire ça mais je laisse cette solution en dernier recours.
    Hum ! après re-lecture je me dis que à part la question ceci n'est peut-être pas bien clair.

    Sinon fait une recherche sur TRxQuery peut-être que ça peux te dépanner.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 60
    Points : 55
    Points
    55
    Par défaut
    Je me souviens avoir vu ce post, mais à l'époque je n'étais pas encore familiariser avec ça.
    Je peux répondre à ta question A: c normal que tu ne puisse pas filtrer directement sur ta colonne calculée. essaie éventuellement d'utiliser OnFilterRecord.

    je chercherais un composant spécifique lorsque j'aurais d'autres besoins.
    Ma solution de filtrage 'manuelle' suffit amplement.

    merci qd même

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

Discussions similaires

  1. filtre sur les aggrégats dans WebI
    Par sono_strass dans le forum Webi
    Réponses: 8
    Dernier message: 11/04/2011, 17h25
  2. Réponses: 3
    Dernier message: 03/03/2008, 19h02
  3. Grouper les enregistrements d'un TClientDataSet ?
    Par gduo200 dans le forum Bases de données
    Réponses: 0
    Dernier message: 27/08/2007, 17h06
  4. Fonction aggrégat pour la médiane et les quantiles
    Par bdkiller dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 06/04/2006, 14h27
  5. developpement base de donnée: Les champs d'aggrégat
    Par Jahrnee dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 19h39

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