1. #1
    Membre régulier
    Homme Profil pro
    Développeur & Scrum Master
    Inscrit en
    août 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur & Scrum Master
    Secteur : Industrie

    Informations forums :
    Inscription : août 2010
    Messages : 100
    Points : 72
    Points
    72

    Par défaut 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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2004
    Messages
    1 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : juin 2004
    Messages : 1 893
    Points : 3 110
    Points
    3 110

    Par défaut

    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
    Homme Profil pro
    Développeur & Scrum Master
    Inscrit en
    août 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur & Scrum Master
    Secteur : Industrie

    Informations forums :
    Inscription : août 2010
    Messages : 100
    Points : 72
    Points
    72

    Par défaut 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 éprouvé
    Femme Profil pro
    Consultant fonctionnel
    Inscrit en
    janvier 2012
    Messages
    555
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : janvier 2012
    Messages : 555
    Points : 1 285
    Points
    1 285

    Par défaut

    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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2004
    Messages
    1 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : juin 2004
    Messages : 1 893
    Points : 3 110
    Points
    3 110

    Par défaut

    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
    Homme Profil pro
    Développeur & Scrum Master
    Inscrit en
    août 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur & Scrum Master
    Secteur : Industrie

    Informations forums :
    Inscription : août 2010
    Messages : 100
    Points : 72
    Points
    72

    Par défaut

    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
    Homme Profil pro
    Développeur & Scrum Master
    Inscrit en
    août 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur & Scrum Master
    Secteur : Industrie

    Informations forums :
    Inscription : août 2010
    Messages : 100
    Points : 72
    Points
    72

    Par défaut

    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 confirmé
    Avatar de frenchsting
    Homme Profil pro
    mutlitâche-multifonction
    Inscrit en
    juin 2003
    Messages
    2 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : mutlitâche-multifonction
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 2 840
    Points : 4 773
    Points
    4 773

    Par défaut

    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 par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur & Scrum Master
    Inscrit en
    août 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur & Scrum Master
    Secteur : Industrie

    Informations forums :
    Inscription : août 2010
    Messages : 100
    Points : 72
    Points
    72

    Par défaut

    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 confirmé
    Avatar de frenchsting
    Homme Profil pro
    mutlitâche-multifonction
    Inscrit en
    juin 2003
    Messages
    2 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : mutlitâche-multifonction
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 2 840
    Points : 4 773
    Points
    4 773

    Par défaut

    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 par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur & Scrum Master
    Inscrit en
    août 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur & Scrum Master
    Secteur : Industrie

    Informations forums :
    Inscription : août 2010
    Messages : 100
    Points : 72
    Points
    72

    Par défaut 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 confirmé
    Avatar de frenchsting
    Homme Profil pro
    mutlitâche-multifonction
    Inscrit en
    juin 2003
    Messages
    2 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : mutlitâche-multifonction
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2003
    Messages : 2 840
    Points : 4 773
    Points
    4 773

    Par défaut

    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 par là : et puis n'hésitez à passer par là : ou par un autre moteur de recherche...
    Pas de question par MP s'il vous plait. Le forum est fait pour cela...

    Make it real not fantasy

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/11/2009, 10h18
  2. Récupérer le dernier enregistrement d'une table
    Par killuaster dans le forum PHP & MySQL
    Réponses: 4
    Dernier message: 02/03/2007, 11h55
  3. récupérer le dernier enregistrement d'une table
    Par kuhnden dans le forum Access
    Réponses: 4
    Dernier message: 21/02/2007, 21h47
  4. [C#/Oracle] Comment obtenir le dernier enregistrement d'une table ?
    Par heavydrinker dans le forum Accès aux données
    Réponses: 1
    Dernier message: 10/08/2006, 17h03
  5. comment rechercher les derniers enregistrement d'une table ?
    Par hornetboy dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/09/2005, 09h13

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