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 :

Avoir un DBGRIB lié à l'union de 2 requêtes


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Avoir un DBGRIB lié à l'union de 2 requêtes
    Bonjour,

    Je travaille sur des bases Firebird sous Delphi.

    Je souhaite connaitre dans ma table CLIENT les 20 derniers enregistrements dont le code est <= à un critère, puis les 20 suivants.

    select first 20 nomabrege, nomclient from client where nomabrege <= 'RTE 2'
    order by 1 desc
    +
    select first 20 nomabrege, nomclient from client where nomabrege >= 'RTE 2'
    order by 1 asc

    Le résultat de ces 2 requetes serait listé dans une DBGRID trié par le nomabregé.
    La requête UNION ne permet pas d'avoir 2 order by.
    Il est possible de faire 2 Query, mais comment créer 1 autre query en prenant le résultat des 2 autres ??
    JE ne sais pas si j'ai été assez claire dans ma demande ...

    Merci d'avance

  2. #2
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Points : 158
    Points
    158
    Par défaut
    je ne suis pas sur d'avoir bien compris ce que tu veux, mais si c'est pour avoir une liste triée par ordre croissant ou décroissant, pq ne pas gérer un évenement bouton ou onclick de ton dbgrid pour changer l'ordre ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Non il ne s'agit pas d'avoir une requete en tri croissant ou décroissant.

    Dans ma base de données CLIENT, j'ai plus de 19000 enregistrements. A la création d'un nouveau client, par exemple RTE, je souhaiterais lister les 20 enregistrements avant RTE et les 20 qui suivent. Faire comme un locate sur 40 enregistrements au lieu des 19000.

    Au fait merci pour ton intérêt !!

  4. #4
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Désolé de te contredire mais ce order by est toléré
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    select first 20 nomabrege, nomclient from client where nomabrege <= 'RTE 2'
    union
    select first 20 nomabrege, nomclient from client where nomabrege >= 'RTE 2'
     
    order by 1 asc

    cela devrait fonctionné, non ?
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Oui cette reqûete est tolérée, mais le résultat est incorrect.

    Je me retrouve avec 20 clients dont le code client est avant RTE + 20 après le code RTE mais le choix de ces 40 est aléatoire, et c'est ensuite qu'il me trie le résultat: je vais avoir des codes commançant par A, par M, par Z.

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Rajoute un champ fantome pour le tri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select first 20 nomabrege, nomclient,'A20' as Tri from client where nomabrege <= 'RTE 2'
    union
    select first 20 nomabrege, nomclient,'B20' as Tri from client where nomabrege >= 'RTE 2'
     
    order by 3,1 asc
    Il te mettra en premier les 20 lignes avec A20, puis les 20 avec B20
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    On est d'accord que le 3ème champs est inexistant dans la table, ou je me plante ?!?
    J'ai tenté ta solution, mais j'ai le même résultat (c'est à dire 20 enr. avant le code RTE mais pas ceux qui se trouvent juste avant + 20 enr. après dans le désordre).

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par SOBZH
    On est d'accord que le 3ème champs est inexistant dans la table, ou je me plante ?!?
    Oui, le champ n'existe aps, ca rajoute seulement a ton resultat de requete un champ Tri avec our valeur A20 dans la première requete et B20 dans la 2em

    J'ai tenté ta solution, mais j'ai le même résultat (c'est à dire 20 enr. avant le code RTE mais pas ceux qui se trouvent juste avant + 20 enr. après dans le désordre).
    Ton problème peux venir du faite que tes critères de recherche de données ne sont pas les bon.

    Le First 20 va juste limiter l'afficahge au 20 premièr enregistrement qui correspondront au critères de recherche et pas au 20 derniers de la liste (il te manque un critère temporel)

    [edit] une idée comme ca, s'il y a la commande First 20, il doit bien y avoir la commande Last 20 non ?
    [/edit]
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Je pense qu'il n'y a pas de critère temporel, puisque je souhaite avoir les 20 enregistrement suivants sur le critère du code client, et les 20 juste avant.

    En schématisant :
    A --------E----------G---------O--------R----RTE-----V-------Z

    Et puis le LAST, ça aurait été trop facile. Je l'avais déjà testé, et cette instruction est inconnue.
    C'est pour cette raison que je souhaitait prendre les 20 premiers en tri décroissant à partir de mon critère RTE.

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Ce RTE 2, c'est un code unique ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Non ce n'est pas un code unique. En fait il s'agit du contenu d'un TDBEDIT, et il est rebalancé en paramètre à la requête.

    Je suis actuellement en train de contourner le pb. C'est à dire que j'ai une requête qui fait les 20 avant : j'incrémente un TStringGrid avec tous les champs.
    Puis je refais une autre requete avec les 20 suivants que je mets également dans le TstringGrid.
    Je te tiens au courant de l'avancée de l'idée.

    Sinon je suis encore preneuse d'une vraie solution, je trouve que la mienne n'est pas très convenable !!!

  12. #12
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Je vois pas vraiment de solution a ton problème en plus c'est une recherche sur alphanumérique et en général l'ordre des données n'est pas comme le numérique

    RTE 2
    RTE 20
    RTE 2000
    RTE 3

    Etc ...
    Sinon essaie ca (même si c'est pas très propres)

    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
     
    select 
      nomabrege, nomclient 
    from 
      client 
    where 
      nomabrege in 
      (Select first 20 nomabrege from client where nomabrege <= 'RTE 2' order by 1 desc)
    union
    select 
      nomabrege, nomclient 
    from 
      client 
    where 
      nomabrege in 
      (Select first 20 nomabrege from client where nomabrege >= 'RTE 2' order by 1 asc)
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Ton idée me paraissait vachement bien sur le papier mais à l'exécution, il me sort toute la table. Je ne comprends pas pourquoi.
    J'ai tenté de faire ta requête sans l'UNION pour voir ce qu'il me donnait en réponse.
    "select nomabrege, nomclient from client
    where nomabrege IN
    (Select first 20 nomabrege from client where nomabrege <= 'RTE 2' order by 1 desc)
    order by 1 desc" -> ça me donne tous les clients dont le code est avant 'RTE 2'. Il ne prend pas en compte le FIRST dans le SELECT.

    Sinon j'ai mon collègue qui a eu une illumination. Faire une requête des 20 avant le critères. Je stocke le nom du 20ème client. Puis je fais un Query qui me prends les 40 clients après le nom stockée de ma 1ère requête.
    Encore une bidouille !!

  14. #14
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Sinon tu as testé comme çà ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select first 20 nomabrege, nomclient from client
    where nomabrege IN
    (Select nomabrege from client where nomabrege <= 'RTE 2' order by 1 desc)
    On sait jamais c'est peut être que le First n'était pas dans le bon select ^^

    PS: Pense à utiliser les balise de code pour les requete c'est quand même plus lisible
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. UNION de 2 requêtes dont l'une d'elle contient une jointure
    Par xtremdisc dans le forum Requêtes
    Réponses: 6
    Dernier message: 08/07/2011, 11h45
  2. Réponses: 12
    Dernier message: 28/09/2010, 17h02
  3. [Report studio] Union de 3 requêtes
    Par aureliegro dans le forum Cognos
    Réponses: 2
    Dernier message: 10/06/2008, 17h10
  4. avoir un enregistrement avec des zéros quand la requête est vide
    Par dodie84 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/05/2008, 14h41
  5. Union de 2 requêtes d'analyse croisée
    Par Bqrt37 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 27/06/2007, 09h20

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