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 régulier
    Comment récupérer le dernier enregistrement d'une table sous Hyperfile
    Bonjour à tous.
    J'ai une table pesée avec des enregistrements. Je souhaite récupérer le dernier enregistrement dont le couple de clés (vehicule, remorque) est égal aux paramètres passés lors de l'éxécution de la requête. j'ai pour cela la requête suivante:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     Afficher tous les PECLEUNIK tels que CODEVE  est égal à 'Param_codeve' ET CODERB  est égal à 'Param_coderb' ET VALIDE  est égal à 1 . 
     Le résultat est trié selon la valeur de PECLEUNIK par ordre croissant. Seules les 1 dernières lignes de la requête (selon le tri) 
     seront affichées.
    je précise que lors des tests j'ai souvent enlever :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Seules les 1 dernières lignes de la requête (selon le tri) seront affichées.
    afin de mieux me rendre compte de l'ordre des résultats.

    Alors ce que je constate. c'est que d'une exécution à une autre (parfois le même jour, parfois le lendemain), les résultats sont souvent ordonnés du plus petit au plus grand ou du plus grand au plus petit. Je me serai attendu à ce que l'ordre du rendu des résultats ne change pas.
    Alors à la question comment je m'en suis rendu compte, c'est d'abord dans mon programme en cours d'éxécution et ensuite e utilisant l'outil de test de requête intégré de l'éditeur de requête windev. Concrètement, pour le même jeu de données,
    un coup je reçois:
    • 49
    • 52
    • 67
    • 98

    un coup je reçois :
    • 98
    • 67
    • 52
    • 49


    Les premières fois j'ai d'abord cru qu'il inversait sa pile de résultat et qu'il fallait lire de bas en haut, mais si l'ordre change alors je ne sais plus où donner de la tête.

    Je précise que je suis sous Windev 17.
    Alors je suis à la recherche de solution. Peut être suis-je passé à côté de quelque chose lors de la création de ma requête. Ou mieux, s'il existe un autre moyen d'obtenir le même résultat (obtenir le dernier enregistrement d'une table ayant le couple véhicule+remorque égal au paramètres donnés), je suis preneur.

  2. #2
    Membre expert
    Bonjour,

    Est-ce qu'il serait possible d'avoir le code SQL généré par l'assistant ?
    Car je ne comprends pas pourquoi tu as 4 clés remontées, d'après ce que je comprends du texte descriptif de la requête.

  3. #3
    Membre régulier
    Code complet
    Merc de m'aider.
    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
    SELECT BOTTOM 1 
      TABLE.PECLEUNIK AS PECLEUNIK,  
      TABLE.CODEP1 AS CODEP1,  
      TABLE.P AS P,  
      TABLE.VALIDE AS VALIDE,  
      TABLE.IMAGEP1 AS IMAGEP1,  
      TABLE.IMAGEP2 AS IMAGEP2
    FROM 
      TABLE
    WHERE 
      TABLE.CODEVE = {Param_codeve}
      AND  TABLE.CODERB = {Param_coderb}
      AND  TABLE.VALIDE = 1
    ORDER BY 
      PECLEUNIK ASC

  4. #4
    Membre expérimenté
    Pourquoi ne pas créer une clef composée de Véhicule+Remorque+Pecleunik ?
    Elle te servira sûrement à autre chose.
    Après :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    HFiltre(TonFichier,TaCleComp,[Véhicule+Remorque+Pecleunik,HMinval],[Véhicule+Remorque+Pecleunik,HMaxval])
    HlitDernier(TonFichier,TaCleComp)

  5. #5
    Membre expert
    Malgré le SQL, je ne comprends pas comment tu reçois un jeu de données de 4 enregistrements.

    +1 à la proposition de serendib.

    Si tu veux rester sur SQL, je ferai plutôt comme cela :
    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
    SELECT TOP 1
      TABLE.PECLEUNIK AS PECLEUNIK,  
      TABLE.CODEP1 AS CODEP1,  
      TABLE.P AS P,  
      TABLE.VALIDE AS VALIDE,  
      TABLE.IMAGEP1 AS IMAGEP1,  
      TABLE.IMAGEP2 AS IMAGEP2
    FROM 
      TABLE
    WHERE 
      TABLE.CODEVE = {Param_codeve}
      AND  TABLE.CODERB = {Param_coderb}
      AND  TABLE.VALIDE = 1
    ORDER BY 
      PECLEUNIK DESC

  6. #6
    Membre régulier
    Citation Envoyé par serendib Voir le message
    Pourquoi ne pas créer une clef composée de Véhicule+Remorque+Pecleunik ?
    Elle te servira sûrement à autre chose.
    Après :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    HFiltre(TonFichier,TaCleComp,[Véhicule+Remorque+Pecleunik,HMinval],[Véhicule+Remorque+Pecleunik,HMaxval])
    HlitDernier(TonFichier,TaCleComp)
    Je recherche le PECLEUNIK du dernier enregistrement dans MonFichier tel que Véhicule et Remorque sont égaux à leur paramètres respectifs. Je ne connais pas la fonction HFiltre, mais j'ai l'impression que je dois lui passer Véhicule+Remorque+Pecleunik.

    Hors justement je ne connais aucun PECLEUNIK au moment de l'exécution et il se peut meme qu'il n'y est pas d'enregistrement dans la table avec Véhicule+Remorque égaux aux paramètres respectifs. Pourrais tu me donner un exemple concret basé sur mon problème stp? La doc n'a pas d'exemple avec des clés composés.

  7. #7
    Membre régulier
    Citation Envoyé par Lo² Voir le message
    Malgré le SQL, je ne comprends pas comment tu reçois un jeu de données de 4 enregistrements.
    J'ai précisé plus haut que j'ai les 4 résultats lorsque j'enlève ceci:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Seules les 1 dernières lignes de la requête (selon le tri) seront affichées.

    et j'ai fais cela dans mes test pour vérifier que la liste était bien ordonné en sens inverse. Pour faire simple, c'était juste un exemple qui montre que tantot en exécution j'ai 49 et tantôt 98.

    Pour la proposition que tu me fais je l'ai déjà testée. Maintenant je me demande si cela ne peut pas être dû à l'ordre de la clé de parcours de ma table.

  8. #8
    Expert éminent
    2 pistes :
    - La première : ton Windev est-il a jour ? Je me souviens que c'est à partir de WD17 que de gros progrès avaient été fait concernant les retours de requête SQL).
    - La deuxième : Ton PECLEUINK est-il un id auto ? Ta table est elle régénérée à chaque exécution ?

    Sinon, la solution de Serendib me semble très efficace.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

  9. #9
    Membre régulier
    Mon windev 17 n'est pas à jour ca c'est sûr.
    PECLEUNIK est un id autogénéré. Je ne sais pas si la table est regénérée à chaque exécution. Comment le savoir stp?

    Concernant la proposition de SerenDb, peux-tu stp me faire un retour quant à la difficulté que j'ai avancé:
    Je recherche le PECLEUNIK du dernier enregistrement dans MonFichier tel que Véhicule et Remorque sont égaux à leur paramètres respectifs. Je ne connais pas la fonction HFiltre, mais j'ai l'impression que je dois lui passer Véhicule+Remorque+Pecleunik.

    Hors justement je ne connais aucun PECLEUNIK au moment de l'exécution et il se peut meme qu'il n'y est pas d'enregistrement dans la table avec Véhicule+Remorque égaux aux paramètres respectifs. Pourrais tu me donner un exemple concret basé sur mon problème stp? La doc n'a pas d'exemple avec des clés composés.
    Cette solution peut elle marché pour moi?

  10. #10
    Expert éminent
    as tu testé de faire une boucle du style ;
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    btrouve est booleen = faux
    HlitDernier(TABLE, PEKleunik)
    tantque pas (hendehors(TABLE) ou trouve)
     si TABLE.CODEVE = Param_codeve et TABLE.CODERB = Param_coderb et TABLE.VALIDE = 1 alors 
        btrouve = vrai
      fin
      Hlitprecedent(TABLE, PEKleunik)
    Fin
    si btrouve alors
      info("gagné")
    sinon
      avertissement("perdu")
    fin


    Pour ce qui est de savoir si la table est régénérée à chaque fois, c'est à toi de me le dire...
    Quant à savoir si tu as des infos qui correspondent réellement dans ta base, je te conseille d'utiliser wdmap et d'aller faire un tour dans ton fichier...
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

  11. #11
    Membre régulier
    Merci pour ce bout de code
    J'imaginais déjà me refaire un ordre dans le code (non SQL). Donc déjà merci pour ce code. Quant au fait que la table soit regénérée, je ne sais pas ce que tu entends par là. Est ce un concept ou une fonctionnalité de windev. J'avoue que je ne suis pas un dur de windev.

    Merci.

  12. #12
    Expert éminent
    Ce que je veux dire par régénérée, c'est qu'elle est vidée au lancement du programme, puis qu'elle est alimentée par des opérations faites par l'utilisateur.

    Après, la solution de Serendib de créer une clé composée te simplifierait la vie. Il faut juste savoir si tu peux modifier l'analyse de ton projet.
    Commencez toujours appuyer sur la touche F1 et puis n'hésitez à passer par un moteur de recherche...
    Le forum est fait pour répondre aux questions : pas la peine de me les envoyer par MP. Merci.

    Make it real not fantasy.

###raw>template_hook.ano_emploi###