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

  1. #1
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut [FB 3] Pourquoi je ne récupère pas toutes les colonnes ?
    Bonjour,

    j'ai trois tables : clients, commandes, détails
    - détails est lié à commandes par le n° de commande NUMCOM
    - commandes est lié aux clients par le n° de client NOCLI

    Je veux la liste des clients qui ont commandé un article donné 'xxxxxx', avec le prix payé et la date de la commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT clients.nom, commandes.datecom, details.pu, details.code_article FROM clients, commandes, details
    WHERE  details.code_article='xxxxxx'
    AND commandes.numcom=details.numcom AND clients.NOCLI=commandes.NOCLI
    Je récupère bien les colonnes nom du client, date de la commande, mais pas le pu...
    J'ai beau chercher, je ne vois pas

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 614
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    49
    Par défaut
    Bonjour,

    Si vous aviez fait une requête "normalisée" en spécifiant correctement les jointures peut-être aurait-ce été plus flagrant.

    Je veux la liste des clients qui ont commandé un article donné 'xxxxxx', avec le prix payé et la date de la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT clients.nom, c.datecom, d.pu, d.code_article 
      FROM Details D JOIN COMMANDES C ON c.numcom=d.numcom
                             JOIN CLIENTS on clients.NOCLI=c.NOCLI
    WHERE d.code_article='xxxxxx'
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  3. #3
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut
    oui, je suis d'accord c'est plus lisible ! Merci !
    En fait, ça marchait, la colonne pu était vide dans la table pour les trois codes articles que je testais ! Quelle andouille je fais....

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    6 955
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 6 955
    Points : 21 936
    Points
    21 936
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Le fait que PU soit vide ne change rien à l'affaire puisque la colonne PU n'est ni un critère de jointure, ni un critère de restriction...

    Pour plus de lisibilité, il faut non seulement coder les jointures avec l'opérateur JOIN pour distinguer ce qui concerne la jointure de ce qui concerne la restriction, mais aussi affecter un alias à chaque table, pour identifier facilement quelle colonne provient de chaque table.

    Le tout avec une présentation soignée qui permet de maintenir plus facilement les requêtes.

    Exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT CL.nom
         , CO.datecom
         , DT.pu
         , DT.code_article 
    FROM       clients   as CL
    inner join commandes as CO
       on CO.NOCLI=CL.NOCLI
    inner join details   as DT
       on DT.numcom=CO.numcom 
    WHERE  DT.code_article='xxxxxx'

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 614
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    49
    Par défaut
    Bonjour,

    c'est vrai que, par flemme, je n'ai pas mis d'alias à la table CLIENTS, ni le INNER du JOIN (INNER étant par défaut, du moins est-ce ce que je compris, pour Firebird
    Citation Envoyé par documentation
    JOIN is same as INNER JOIN
    ).

    Autre point j'aime mettre les tables en ordre "décroissant" donc détails,commandes,clients est-ce une bonne chose @escartefigue en tant que bourreau si tu repasses ici j'aimerai bien avoir ton avis
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    6 955
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 6 955
    Points : 21 936
    Points
    21 936
    Billets dans le blog
    2
    Par défaut
    Bonjour Sergio,

    Ma remarque s'adressait surtout à zarbouine qui n'avait pas utilisé d'alias du tout.

    L'ordre des tables n'a aucune importance, l'optimiseur n'en tient pas compte pour construire sa stratégie, si c'est plus confortable à la lecture, je n'y vois aucun inconvénient, mais bizarrement, j'aurais plutôt choisi la logique inverse en allant de la table dont la population est la plus réduite vers celle dont la population est la plus importante, soit

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FROM CLIENT CL
    INNER JOIN COMMANDE CO
       ON...
    INNER JOIN DETAIL DT
       ON...

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 614
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    49
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    L'ordre des tables n'a aucune importance, mais bizarrement, j'aurais plutôt choisi la logique inverse
    Comme quoi tous les goûts sont dans la nature il serait interssant de voir comment l'optimiseur arrange ça (histoire de lui mâcher le travail) si j'ai du temps à perdre ...
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  8. #8
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut
    Bonsoir à tous les deux,

    discussion intéressante, j'en prends de la graine...
    étonnant la souplesse de SQL, il accepte des syntaxes variées et est bluffant de rapidité pour moi qui vient du BDE !

    Il n'y a qu'une chose regrettable c'est la lenteur de la contruction des index par FBQuery à l'ouverture du query. Par exemple sur une table de quelques dizaines de milliers d'enregistrements, on pouvait utiliser instantanément les index existants sur les tables (dBase et Paradox), sans qu'il ne soit besoin de construire à chaque ouverture, alors qu'avec Firedac, il prend quelques secondes pour construire son index quand on l'ouvre....ce qui encourage à refaire une requête (très rapide si l'index existe dans la base) plutôt qu'utiliser les index.... ou bien je m'y prends comme un un manche ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 614
    Points : 34 046
    Points
    34 046
    Billets dans le blog
    49
    Par défaut
    Bonjour
    Citation Envoyé par zarbouine Voir le message
    Il n'y a qu'une chose regrettable c'est la lenteur de la contruction des index par FDQuery à l'ouverture du query.
    ce qui déborde de ce forum puisque là on est plus sur Delphi et un type particulier de composant d'accès aux données

    Par exemple sur une table de quelques dizaines de milliers d'enregistrements, on pouvait utiliser instantanément les index existants sur les tables (dBase et Paradox), sans qu'il ne soit besoin de construire à chaque ouverture
    Parce qu'ils étaient construits, les extensions DBX etc...
    Alors qu'avec Firedac, il prend quelques secondes pour construire son index quand on l'ouvre....
    Les Threads ça existe
    ce qui encourage à refaire une requête (très rapide si l'index existe dans la base) plutôt qu'utiliser les index...
    .
    Moi je trouve que récupérer "des dizaines de milliers d'enregistrements" c'est largement trop aucun utilisteur ne lira le tout , donc faire une requête restrictive (where, rows, order) est largement mieux
    ou bien je m'y prends comme un un manche ?
    peut-être un peu il faut se débarasser en premier lieu des réflexe paradox

    Mais, ce débat, n'a rien à faire dans ce forum, tout à voir dans le forum Delphi/Base de données
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  10. #10
    Membre habitué
    Homme Profil pro
    Responsable associatif
    Inscrit en
    octobre 2005
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Responsable associatif

    Informations forums :
    Inscription : octobre 2005
    Messages : 204
    Points : 143
    Points
    143
    Par défaut
    Exact, je me suis laissé aller...

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

Discussions similaires

  1. [XL-2010] ListBox ne récupère pas toutes les valeurs des colonnes
    Par Beaubour dans le forum Excel
    Réponses: 7
    Dernier message: 06/06/2019, 11h31
  2. Réponses: 1
    Dernier message: 22/04/2013, 17h10
  3. Un slot qui ne récupère pas toutes les données
    Par bilou_2007 dans le forum Débuter
    Réponses: 0
    Dernier message: 18/04/2011, 22h03
  4. Réponses: 1
    Dernier message: 31/12/2008, 16h50

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