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

HyperFileSQL Discussion :

tri les enregistrements retournée par une requête


Sujet :

HyperFileSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut tri les enregistrements retournée par une requête
    J'ai un petit soucis pour gérer les enregistrement retournée par une requête et j'ai besoin d'une petite aide svp.

    j'explique ,je cherche à trier des enregistrements retournée par une requête et les classées dans une table par bloc des pages ,lors de chargements de n premiers enregistrements le tri se fait parfaitement mais le problème se pose si je parcours ma requête pour afficher les restes des pages , j'ai constaté que les résultats ne garde pas le même tri renseigné dans le clause "ORDER BY".

    Alors le question qui se pose Comment je peux garder le trié des résultats d'une requête pendant toute la période de sa exécution ?

  2. #2
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Bonjour, ( un petit bonjour aurais été gentil soit dit en passant)

    Et bienvenue sur ce forum.
    En ce qui concerne ton problème peux tu nous donner plus de détails.

    Quand tu explique que tu veux "trier des enregistrements retournée par une requête" tu veux le faire comment? par programmation avec les ordres SQL (Order by, etc...)

    Qu'entends tu par "table par bloc des pages" ?

    Tu dis que ça marche plus lorsque tu "parcours ma requête pour afficher les restes des pages"

    Comment fais tu ce parcours ?

    Donne le plus de précision possible.
    Ce que tu appel table est-ce un champ table ou un fichier d'une base de donnée?
    Si tu exécute ta requête dans l'éditeur de requête, est-elle correcte?
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    Tout d'abord je te remercie pour ta réponse rapide et je suis désolé pour l'absence d'expression de politesse
    En fait, je suis entrain d'afficher les résultat d'une recherche dans une Table. Or il ne s'agit pas de tous les résultat car le chargement de tous les enregistrements nécessite un temps considérable, c'est pourquoi je n'affiche que 20 enregistrement et laisse le choix à l'utilisateur de voir le reste des résultat en sélectionnant une page bien déterminée (Comme c'est le cas d'une recherche Google !)
    Mon problème c'est que je désire effectuer le tri sans recourir à la ré-exécution de la requête. J'aimerai bien faire le tri dans ma source de données.
    Est ce que c'est possible d'après vous car j'ai bien cherché mais en vain.
    Il y a une autre piste que je suis en train d'explorer maintenant, il s'agit d'utiliser les Vues. Mais j'arrive pas à connecter une vue à une requête.
    J'espère bien que tu as bien saisi mon problème. Je serai reconnaissant si tu pourra m'aider à le résoudre.
    Merci encore.
    Bien cordialement

  4. #4
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Pas de souci pour le bonjour...

    Comment affiche tu que 20 enregistrement?
    Quel code utilise tu pour afficher les autres?

    Peux tu nous le donner?
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    1)Actuellement j'utilise ce boucle qui me retourne les résultats que je veux mais non triée
    par exple gnMin=1 et gnMax=20 :pour afficher les 20 premier enregistrement

    POUR i=gnMin A gnMax

    HLit(SdMaRequete_CONTACTS,i)
    TableAjouteLigne(TABLE_CONTACTS,SdMaRequete_CONTACTS.tiers

    fin

    2)par contre ce 2ème boucle me retoune tout les enregistrements de la reqête sans limites(je veux pas sa) et bien triée (c'est sa que je cherche d'être triée)

    Pour tout SdMaRequete_CONTACTS

    TableAjouteLigne(TABLE_CONTACTS,SdMaRequete_CONTACTS.tiers

    Fin

    comment je peux utiliser le 2ème boucle on le passant les bornes gnMin et gnMax pour afficher que les enregistrement voulu et bien triée.

  6. #6
    Membre expert
    Avatar de mail.spam
    Homme Profil pro
    Développeur Windev et technicien maintenance
    Inscrit en
    Janvier 2008
    Messages
    1 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Windev et technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 1 914
    Points : 3 803
    Points
    3 803
    Par défaut
    Une solution serai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    i est entier = 1
    Pour tout SdMaRequete_CONTACTS
     
    TableAjouteLigne(TABLE_CONTACTS,SdMaRequete_CONTACTS.tiers 
     
    i++
    si i = gnMax alors sortir
     
    Fin
    ainsi tu lis ta requête et tu sors de ta boucle quand i vaut gnmax
    la touche est ton amie. l'aide ne mord pas quand on la consulte...
    PS : n'oubliez jamais que nous ne sommes pas avec vous sur le projet. Donc plus vous donnez d'informations et d'exemples de codes et plus nous pourrons vous aider. (Un exemple vaut mieux que de longs discours...)

    Pensez à utiliser les votes et à cliquer sur , merci

  7. #7
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Bonjour à vous deux.
    D'abord j'ai une question : tu travailles bien en Windev ? (pas Webdev ni Windev mobile) ?
    Si oui, quelle version de Windev ?
    Je vais répondre à la suite comme si tu étais en windev.
    Le tri dans la requête, c'est bien ORDER BY à la fin, dans le code SQL.
    Pour afficher des blocs de données, tu peux utiliser la clause LIMIT, toujours en SQL.

    Parce que ce que tu fais actuellement, c'est que tu charges la totalité de tes enregistrements dans une source de données (donc en local, dans le programme).

    Mais pour le problème de lenteur d'affichage par contre, je ne suis pas sûr que ça soit la meilleure solution. En effet, pour un utilisateur, savoir s'il doit aller à la page 10 ou 11 relève un peu du hasard.
    Je te conseillerais donc d'utiliser l'instruction MultiTache(-1)
    Elle rend la main à l'utilisateur, et il peut intervenir et commencer à regarder ses données.

    C'est en tous cas la solution que j'utilise.

    Un exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SI HLitPremier(sdMaRequete) ALORS
        BOUCLE
            MultiTache(-1)
            TableAjouteLigne(TABLE_CONTACTS,sdMaRequete_CONTACTS.tiers)
        A FAIRE TANTQUE HLitSuivant(sdMaRequete)
    FIN
    La table se charge et l'utilisateur conserve la main.

    Attention tout de même à une chose : pendant ce traitement, l'utilisateur peut utiliser la totalité de l'application. Il peut donc par exemple, recliquer sur le bouton qui a lancé ce code.

    Une méthode simple consiste donc à griser le bouton pendant le traitement, et le ré-activer ensuite.

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    cette solution affiche toujours les 20 premiers enregistrement de la requête seulement

    mais si je veux afficher la page 2 : c_a_d gnMin=20 et gnMax=40

    je veux positionner sur l'index de requête dans le mémoire et non pas de compter chaque fois les 20 premiers enregistrement et le boucle s'arrête

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    bonjour Bowen , mail.spam,

    Merci pour vous mais le problème existe toujours

    mon problème c'est de parcourir la requête par un boucle on passaant à la

    boucle gnMin et gnMax et en assurant le tri faite par ORDER BY

    Merci de m'aider svp.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 303
    Points : 815
    Points
    815
    Par défaut
    Salut à tous.

    @badysoom,
    Pour parcourir un fichier dans l'ordre des enregistrements, il faut t'assurer que la fonction HyperFile que tu utilises respectes l'ordre de parcours.

    Or, l'accès direct par HLit ne respecte pas l'ordre de parcours (lit l'aide en ligne).

    Tu dois utiliser des fonctions qui respectent l'ordre de parcours:
    • HPremier et/ou HLitPremier,
    • HLitSuivant
    • HAvance pour te positionner sur une ligne précise
    • entre autres...


    Dans ta situation, quelle que soit la page, il me semble préférable de faire comme ça:
    1. se replacer sur le premier enregistrement (HPremier ou HLitPremier),
    2. si nécessaire avancer de n enregistrements pour "sauter au 1er enregistrement de la bonne page" (HAvance),
    3. lire les n enregistrements à ajouter à la table (HLitSuivant).


    N.B. peut être que si on utilise HLit avec la constante hNumEnrEnCours, l'ordre de parcours n'est pas perturbé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HLit(<Nom du fichier> , hNumEnrEnCours )
    Quelqu'un aurait-il la réponse ?
    Bowen... au hasard ?

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Désolé OnePoint, mais cette fois je vais te contredire.
    (je n'ai pas de quoi tester sous la main, mais je suis assez sûr de moi pour l'écrire)
    HLit, sur une requête, lit les enregistrements dans l'ordre.

    badysoom, le code que tu cherches à faire c'est donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    nPage = 2    //Admettons que tu reçoives le numéro de page, dans cet exemple je prends 2.
    gnMin = 20 * (nPage -1)
    gnMax = 20 * nPage
    POUR i = gnMin _A_ gnMax
        SI HLit(sdMaRequete_CONTACTS,i) ALORS TableAjouteLigne(TABLE_CONTACTS,sdMaRequete_CONTACTS.tiers)
    Mais ce code ne sera efficace que si tu conserves les résultats de ta requête.
    Ce qui te donnera un résultat qui ne se rafraichit pas.

    Par contre, comme le résultat continue à se charger pendant que l'utilisateur consulte la première page, la suite de la consultation sera très rapide.

    Mais je persiste et je signe, la consultation avec la solution de mon premier message est la plus simple pour l'utilisateur.

  12. #12
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    bonjour Mes amis,

    Merci beaucoup pour tous vous aide et enfin aprés vos aides j'ai résolu mon problème de parcours de requete et voila ma solution.


    i=1
    //se positionner sur le 1ère enregistrement retourner par la requête

    HLitPremier(SdMaRequete_CONTACTS)
    //Avancer jusqu'a atteindre le 1ère indice de la page considére
    HAvance(SdMaRequete_CONTACTS,gnMin-1)

    TANTQUE PAS HEnDehors(SdMaRequete_CONTACTS) ET i<=gnNbreLigne
    TableAjouteLigne(TABLE_CONTACTS,SdMaRequete_CONTACTS.code_contact,

    // sortir de boucle si on attient le nbre de ligne fixer par page
    SI i=gnNbreLigne ALORS SORTIR
    i++
    HLitSuivant(SdMaRequete_CONTACTS)
    FIN

    Merci beaucoup

  13. #13
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2002
    Messages : 899
    Points : 1 103
    Points
    1 103
    Par défaut
    Si la solution que tu as trouvé te conviens, penses à mettre sur ton post.
    Sinon, tu peux aussi corriger tes portes de sortie de boucle. (elles sont en double), et tenter avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HLit(SdMaRequete_CONTACTS, gnMin)
    à la place de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //se positionner sur le 1ère enregistrement retourner par la requête 
     
    HLitPremier(SdMaRequete_CONTACTS)
    //Avancer jusqu'a atteindre le 1ère indice de la page considére
    HAvance(SdMaRequete_CONTACTS,gnMin-1)
    Ce qui te fera gagner réellement du temps quand tu seras en fin de fichier. (parce que là, tu fais un vrai parcours de tout le début du fichier à chaque fois).

    Et bon courage pour tes futurs développements.
    Une simple question de curiosité par contre : tu montes ce mécanisme pour lire combien d'enregistrements ?

  14. #14
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut requête vers excel
    bonjour à tous

    Dans mon appli je dois crééer et alimenter un fichier Excel avec des

    valeurs qui viennent d'une requête et non pas d'une table

    si quelqu'un a une idee je suis preneur.
    merci et bon dev.

  15. #15
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    salut à tous,

    je veux directement parcourir ma requête et exporter les résultat vers excel sans passer par une table

    aider moi svp

Discussions similaires

  1. [PDO] compter les lignes retournées par une requête SELECT
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/01/2015, 14h40
  2. Réponses: 3
    Dernier message: 16/08/2006, 16h05
  3. traiter les groupes retourné par la requête GROUP BY
    Par mgemc2 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/08/2006, 13h16
  4. Réponses: 2
    Dernier message: 07/07/2006, 01h26
  5. [SQL] Valeur retournée par une requête...
    Par Empty_body dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/01/2006, 22h13

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