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 :

SQL Local (Firedac FDLocalSQL) et agrégats


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut SQL Local (Firedac FDLocalSQL) et agrégats
    Bonjour,

    Jusqu'à présent en FDLocalSQL je me contentais de joindre deux tables de base de données différentes et ce avec succès.
    J'ai voulu obtenir un résumé (montant total de factures) d'une requête plutôt complexe. J'ai d'abord songé à utiliser un champ agrégat créé dans la liste des champs mais je n'obtenais rien (c'était aussi une première ratée pour moi) puis j'ai testé avec le Local SQL. Pour moi il s'agissait d'une requête simple SELECT COUNT(*) NUM, SUM(SOLDE) TOTAL FROM FDQFacturesQuelle ne fut pas ma surprise d'obtenir une valeur pour NUM mais un zéro pointé pour TOTAL !

    Bien sûr je peux passer par des moyens plus "classiques" (une boucle while not EOF) pour obtenir le résultat souhaité mais ...

    La question est donc double :
    - Puisque, apparemment, mon problème d'agrégat est lié quelqu'un a déjà utilisé cette technique ?
    - Êtes-vous "tombé" sur ce genre de requête locale sans problème ?
    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

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    J'utilise sans problème des agrégats en LocalSQL.

    Mais je constate une différence de comportement avec champs guillemetés :
    SUM(SOLDE) ou SUM(`SOLDE`) : une erreur est générée si le champ n'existe pas (normal).
    SUM("SOLDE") : renvoi zéro si le champ n'existe pas !

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonsoir,

    j'ai contourné le problème mais je me pose toujours la question, pourquoi cela ne fonctionne pas le seul doute que je puisse émettre est que la colonne SOLDE est une colonne calculée dans la requête initiale.
    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 ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Lorsqu'il y a une fonction d'agrégation comme "sum" peut être faut il ajouter "group by"

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Merci mais non, je parle là des "champs" fkAggregate (champ pour distinguer de colonne de la table) agrégat le "SUM" est dans la déclaration

    Nom : Capture.PNG
Affichages : 306
Taille : 25,6 Ko

    Le Group est géré par le GroupingLevel dans mon cas sur la table entière donc = 0
    (P.S. Cette notion reste encore floue dans mon esprit )

    Nom : Capture_2.PNG
Affichages : 298
Taille : 20,9 Ko

    et tu noteras que j'ai fait un test en ajoutant un second champ agregat (le nombre d'enregistrements) qui lui me renvoie bien une valeur

    Il va falloir que je fasse un test plus poussé dans un petit programme à part (comme d'habitude)
    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

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Déjà, je m'en arrache les cheveux qui me restent
    requête de base :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT F.ANNEE,F.NUMERO,F.MNT_TOT,F.MONTANT_PAYE,MNT_TOT-MONTANT_PAYE SOLDE FROM FACTURES F
    WHERE CLIENT='2000'

    valeurs agrégats souhaitées
    122, 74800.56, 73986.74, 813.82


    et premier test rapide (pas en encore du localSQL)
    Nom : Capture_1.PNG
Affichages : 298
Taille : 38,5 Ko
    C'est le COUNT qui ne se montre pas le reste est correct
    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

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    De mémoire il doit y avoir une relation maître détail pour les fonction d'agrégat avec des setRange

  8. #8
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT F.ANNEE,F.NUMERO,F.MNT_TOT,F.MONTANT_PAYE,MNT_TOT-MONTANT_PAYE SOLDE FROM FACTURES F
    WHERE CLIENT='2000'
    tu es sûr de ta syntaxe SQL ?
    j'aurais écrit :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT F.ANNEE,F.NUMERO,F.MNT_TOT,F.MONTANT_PAYE,(MNT_TOT-MONTANT_PAYE) as SOLDE FROM FACTURES F
    WHERE CLIENT='2000'

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par pprem Voir le message
    tu es sûr de ta syntaxe SQL ?
    OUI, ce côté ne pose aucun souci oui
    avec Firebird les parenthèses ne sont pas obligatoires, et le AS est optionnel

    non, c'est bien les agrégats qui me posent quelques soucis
    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

  10. #10
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    OUI, ce côté ne pose aucun souci oui
    avec Firebird les parenthèses ne sont pas obligatoires, et le AS est optionnel

    non, c'est bien les agrégats qui me posent quelques soucis
    ok, pas de bol alors

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Ce que je ne comprends pas c 'est pourquoi le COUNT de l'agrégat de fonctionne pas dans cet essai alors que dans mon problème de départ il s'agissait de l'inverse
    d'un autre côté, la requête de départ était nettement plus complexe (requête qui fonctionne pas la peine de revenir dessus sauf, peut-être sur les jointures j'ai toujours un peu de mal avec)
    Code sql : 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
    22
    23
    24
    SELECT F.CLIENT,SUBSTRING(F.ANNEE FROM 1 FOR 4) A,F.NUMERO,a.ID,F.ANNEE,0.00 AS MNT_TOT,F.MONTANT_PAYE*-1 MONTANT_PAYE,
           MAXVALUE(F.DATE_ECHEANCE,COALESCE(F.ECH2,F.DATE_ECHEANCE),COALESCE(F.ECH3,F.DATE_ECHEANCE)) ECHEANCE,     
           0.00 AS SOLDE,
           NULL AS DATE_FACTURE,
           a.DATE_ACTION, a.MONTANT,a.COMMENTAIRE,
           F.CLIENT||' '||C.NOM||', '||C.PAYS NOM,
           TRIM(F.ANNEE)||'-'||F.NUMERO IDFACTURE 
    FROM Factures f JOIN Factures_PAIEMENT a ON f.ANNEE=a.ANNEE_facture and f.NUMERO=a.NUMERO_facture
                    JOIN CLIENTS C ON F.CLIENT=C.NUM_CLIENT
    AND TRIM(a.COMMENTAIRE)<>''
    &Where
    AND CLIENT=:C
    UNION
    SELECT F.CLIENT,SUBSTRING(F.ANNEE FROM 1 FOR 4),F.NUMERO,0,F.ANNEE,F.MNT_TOT,F.MONTANT_PAYE,
           MAXVALUE(F.DATE_ECHEANCE,COALESCE(F.ECH2,F.DATE_ECHEANCE),COALESCE(F.ECH3,F.DATE_ECHEANCE)) ECHEANCE,
           MAXVALUE(0,F.MNT_TOT-F.MONTANT_PAYE),
           F.DATE_FACTURE,
           NULL,0,P.LIBELLE_PAIEMENT,
           F.CLIENT||' '||C.NOM||', '||C.PAYS NOM, 
           TRIM(F.ANNEE)||'-'||F.NUMERO IDFACTURE
    FROM FACTURES F JOIN CLIENTS C ON F.CLIENT=C.NUM_CLIENT
                    JOIN PAIEMENT P ON F.MODE_PAIEMENT=P.CODE_PAIEMENT
    &Where  
    AND CLIENT=:C

    Comme cette requête était "complexe", faire une seconde requête d'aggrégat pour obtenir les totaux était hors de question, mon idée : puisque Firedac propose des champs aggrégats autant m'en servir pour obtenir les totaux. Le premier essai non concluant, le second fut de copier le DataSet dans un FDMemTable et utiliser les aggrégats sur celle-ci mais je ne sais pourquoi : chou blanc !
    Cela dit, après réflexion, j'ai peut-être des NULL qui trainent

    L'utilisation de l'affichage dans un TListView m'a fait coutourner le problème (puisque TListView fait un while Not EOF pour se remplir, autant revenir à la bonne vieille méthode des cumuls dans la boucle), pour info cela ne serait pas possible avec TGrid. Mais cet insuccès partiel me pèse, j'aime bien rongé l'os s'il se présente
    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 émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Bonjour,
    Tu peux peux être ramener le résultat de ta requête en local dans un dataset en mémoire et faire ensuite et faire ensuite les agrégation sur ce dadaset

Discussions similaires

  1. Travailler sur une base SQL locale à distance
    Par max180 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/09/2012, 15h15
  2. [phpMyAdmin] Soucis d'import de base sql local-> live
    Par Silv4 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 03/04/2012, 11h08
  3. PL/SQL local subprograms
    Par yasstunisien dans le forum PL/SQL
    Réponses: 3
    Dernier message: 04/07/2011, 14h43
  4. [SQL-Serveur][Sybase]Fonctions d'agrégat imbriquées
    Par vincenteraptor dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/06/2006, 09h46
  5. [SQL] Combiner fonction d'agrégation et DISTINCT .
    Par p@radox dans le forum Langage SQL
    Réponses: 5
    Dernier message: 02/12/2004, 17h11

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