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

WinDev Discussion :

HLitPremier et HLItSuivant pour remplacer une requete, mais non [WD23]


Sujet :

WinDev

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 67
    Points : 62
    Points
    62
    Par défaut HLitPremier et HLItSuivant pour remplacer une requete, mais non
    Salut,
    je suis coincé sur un bout de code : je voulais éviter de faire une requête pour récupérer toutes les valeurs d'une rubrique via HLitSuivant.

    Je dois récupérer toutes les valeurs et en faire un totale de chaque mois. J'utilise donc une table qui possède date / valeur.

    Mon problème : pour démarrer je récupère bien la première date mais pas la première valeur ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Pour la premiere date
    HLitPremier(JourMeteo,DateJour)
    SI HTrouve(JourMeteo) ALORS    
        PremiereDate = JourMeteo.DateJour
        MoisTrouve = EntierVersMoisEnLettre(DateVersEntier(PremiereDate))
        dDernierJour = DernierJourDuMois(PremiereDate)
    FIN 
     
    //Pour la premiere valeur : me trouve une valeur plusieurs jour après la premiere date / premier dans la liste !!
    HLitPremier(JourMeteo,TempMin)
    SI HTrouve(JourMeteo) ALORS
        nTemperatureMin = JourMeteo.TempMin
    FIN
    Ensuite je voulais utiliser le HLitSuivant : mais fonctionne pas (c'était trop beau...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TANTQUE PremiereDate <= dDernierJour
     
            HLitSuivant(JourMeteo,TempMin)
            SI HTrouve(JourMeteo) ALORS
                        nTemperatureTot += JourMeteo.TempMin
            FIN
             PremiereDate..Jour +=1
     
    FIN

    Bref, je vais passer par une requête mais je voulais au moins comprendre pourquoi ma première valeur TempMin n'est pas la premiere trouvée.

    En vous remerciant de vos lumières.

  2. #2
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 375
    Points : 9 710
    Points
    9 710
    Par défaut
    Bonjour,

    Tu ne nous donnes pas la structure du fichier JourMeteo, donc c'est difficile de répondre. Mais de toutes façons ton code est très étrange.

    Dans la première partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Pour la premiere date
    HLitPremier(JourMeteo,DateJour)
    SI HTrouve(JourMeteo) ALORS    
        PremiereDate = JourMeteo.DateJour
        MoisTrouve = EntierVersMoisEnLettre(DateVersEntier(PremiereDate))
        dDernierJour = DernierJourDuMois(PremiereDate)
    FIN
    Tu fais une lecture sur une clef "DateJour" pour initialiser tes variables PremiereDate et dDernierJour. Pourquoi pas.
    Ensuite, tu cherches les valeurs, mais tu fais ta lecture sur la clef TempMin. C'est normal que les résultats ne soient pas corrects.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Pour la premiere valeur : me trouve une valeur plusieurs jour après la premiere date / premier dans la liste !!
    HLitPremier(JourMeteo,TempMin)
    SI HTrouve(JourMeteo) ALORS
        nTemperatureMin = JourMeteo.TempMin
    FIN
    Pareil pour la partie sur le HLitSuivant.

    Tu aurais pu faire un truc de ce genre
    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
     
    // Pour la premiere date
    HLitPremier(JourMeteo,DateJour)
    SI HTrouve(JourMeteo) ALORS    
        PremiereDate = JourMeteo.DateJour
        MoisTrouve = EntierVersMoisEnLettre(DateVersEntier(PremiereDate))
        dDernierJour = DernierJourDuMois(PremiereDate)
    FIN 
     
    //Pour la premiere valeur : me trouve une valeur plusieurs jour après la premiere date / premier dans la liste !!
    HLitRecherche(JourMeteo,DateJour,PremiereDate)
    Tantque pas HEndehors(JourMeteo) et JourMeteo.DateJour<=dDernierJour
        nTemperatureTot += JourMeteo.TempMin
       HLitSuivant(JourMeteo, DateJour)
    FIN
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Si on veut faire des traitements de ce genre (calculer le total pour chaque individu) dans une boucle avec hLitSuivant, la structure du programme est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    hLitPremier(Fic)  
    tantque pas hEnDehors()
       Total=0
        OldCle = Fic.Cle
        Tantque pas hEnDehors() et Fic.Cle =OldCle
            Total = Total + Fic.valeur
             hLitSuivant()
        Fin
        Trace ( "Individu : " + OldCle + " Total =" + Total )
    Fin
    Mais ça devient vite compliqué.
    L'utilisation de requête est beaucoup plus efficace (lisibilité du code, rapidité du traitement, saturation du réseau)
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 67
    Points : 62
    Points
    62
    Par défaut
    Merci Jon et TBC92, en effet y'avait en effet des parties du code bizarre...
    Ça fonctionne bien comme ça, j'obtiens bien l'addition des températures min et max séparées, j'en ai fait une moyenne pur chaque
    J'aurai voulu au final faire ça pour chaque mois, faire que à chaque fin de boucle, PremiereDate devienne la premiere date du mois suivant, et recommencer la boucle, mais ça deviendrai trop complexe... je vais plutôt m'orienter sur une requête plus propre comme l'indique TBC.
    Bref.
    Merci pour l'aide précieuse

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    MoisTrouve est une chaîne
    PremiereDate est une Date 
    dDernierJour est une Date
    nTemperatureMin est un entier
    nTemperatureTotMin est un entier = 0
    nTemperatureTotMax est un entier = 0
     
    // Pour la premiere date
    HLitPremier(JourMeteo,DateJour)
    SI HTrouve(JourMeteo) ALORS    
        PremiereDate = JourMeteo.DateJour
        MoisTrouve = EntierVersMoisEnLettre(DateVersEntier(PremiereDate))
        dDernierJour = DernierJourDuMois(PremiereDate)
    FIN 
     
    HLitRecherche(JourMeteo,DateJour,PremiereDate)
    i est un entier = 0
    TANTQUE JourMeteo.DateJour<=dDernierJour
     
        nTemperatureTotMin += JourMeteo.TempMin
        //Trace(JourMeteo.TempMin+" "+JourMeteo.DateJour+" "+nTemperatureTotMin)
     
        nTemperatureTotMax += JourMeteo.TempMax
        //Trace(JourMeteo.TempMax+" "+JourMeteo.DateJour+" "+nTemperatureTotMax)
     
        HLitSuivant(JourMeteo, DateJour)
        i++
    FIN
    RENVOYER ((nTemperatureTotMin/i), (nTemperatureTotMax/i),MoisTrouve)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 237
    Points : 305
    Points
    305
    Par défaut
    Bonjour,
    Et remplir une table mémoire avec une ligne par mois et sur chaque ligne : mois, total température, nombre de mesures, température mini, température maxi.

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2003
    Messages
    942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2003
    Messages : 942
    Points : 1 933
    Points
    1 933
    Par défaut
    Dans ces cas là une requête sera toujours plus efficace qu'un parcours.
    Philippe,


    N'hésitez à lever le pouce si mon aide vous a été utile.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 67
    Points : 62
    Points
    62
    Par défaut
    Avec une requête c'est plus simple : suffit de prendre datedebut et datefin pour faire requeter les valeurs et faire les moyennes des températures.
    Je pense que y'aurai une requete sql plus efficace avec AVG(TempMin) au lieu de le faire dans le code ?

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    PROCÉDURE MoyenneTemp()
    sMoisTrouve est une chaîne ANSI
    nNbOccReq est un entier
    dPremiereDate est une Date 
    dDernierJour est une Date
    nTemperatureMin est un entier
    nTemperatureTotMin est un entier = 0
    nTemperatureTotMax est un entier = 0
    nPluie est un entier = 0
    TouteFinDate est une Date = "20210403"
    clMemoireTemp est un MJourMeteo
     
     
    ZoneRépétéeSupprimeTout(FEN_TableauBord.ZR_Temp)
    ////////////////////////////// 1 //////////////////////////////////////
    HLitPremier(JourMeteo,DateJour)
    SI HTrouve(JourMeteo) ALORS     
     
        dPremiereDate = JourMeteo.DateJour
        //Trace("1ere date avant tanque : "+dPremiereDate)
     
        j est un entier = 1
     
        TANTQUE PAS HEnDehors(JourMeteo) ET dPremiereDate<=TouteFinDate
            //Trace("---------DEBUT TANTQUE j : "+j)//////////////////////////////////////////////
     
            sMoisTrouve = EntierVersMoisEnLettre(DateVersEntier(dPremiereDate))
            dDernierJour = DernierJourDuMois(dPremiereDate)
     
            //Trace("debut mois : "+dPremiereDate+" --mois trouve : "+sMoisTrouve+" --dernier jour"+dDernierJour)////////////////////
     
            //Requete date debut et fin
            REQ_Temp.ParamDateDebut = dPremiereDate 
            REQ_Temp.ParamDateFin = dDernierJour
     
            SI HExécuteRequête(REQ_Temp,hRequêteDéfaut) = Vrai ALORS
                nNbOccReq = HNbEnr(REQ_Temp)
                //Trace("nombre occ : "+nNbOccReq)
                i est un entier = 1
                POUR TOUT REQ_Temp
     
                    nTemperatureTotMin += REQ_Temp.TempMin
                    //Trace("temp min ajout : "+nTemperatureTotMin+" i : "+i)
     
                    nTemperatureTotMax += REQ_Temp.TempMax                
                    //Trace("temp max tot mon ajout : "+nTemperatureTotMax)
     
                    nPluie += REQ_Temp.Pluie
     
                    FichierVersMémoire(clMemoireTemp,REQ_Temp)
                    m_tabMesTemperatures.ajoute(clMemoireTemp)                
     
                    i++
     
                FIN
            SINON 
                Avertissement("Erreur requete REQ_Temp - "+ErreurInfo)
            FIN // FIN du POUR TOUT REQ
     
            //calcul des moyennes temperatures
            nTemperatureTotMin = nTemperatureTotMin/nNbOccReq
            nTemperatureTotMax = nTemperatureTotMax/nNbOccReq
            nPluie = nPluie/nNbOccReq
            //Trace("FIN -- -- -- -- temp moy min : "+nTemperatureTotMin)
            dDernierJour..Jour +=1 
            dPremiereDate = dDernierJour
            //Trace("FIN -- - -- -- nouvelle prem date : "+dPremiereDate+" --FIN FIN FIN")
     
     
     
            //ajoute dans zone repetée
            ZoneRépétéeAjouteLigne(FEN_TableauBord.ZR_Temp, nTemperatureTotMin+"°C", nTemperatureTotMax+"°C", sMoisTrouve, nPluie+"mm")
     
            nTemperatureTotMin = 0
            nTemperatureTotMax = 0
            nPluie = 0
     
            j++    
     
        FIN//fin TANTQUE
     
    FIN

  8. #8
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 805
    Points : 5 253
    Points
    5 253
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Dans ta requête, il faut une colonne MoisDate et calculer tes moyennes sur ce MoisDate via un GROUP BY avec les date dans le résultat de ta requête initiale du style :
    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
    16
     
    SELECT 
         SUBSTR(JourMeteo.Date,5,2)+LEFT(JourMeteo.Date,4) AS MoisAnnée,
         AVG(JourMeteo.TempMin) AS TempMin,
         AVG(JourMeteo.TempMax) AS TempMax
    FROM
        JourMeteo
    WHERE
        JourMeteo.PK_JourMeteo IN
        (
         SELECT PK_JourMeteo
         FROM JourMeteo
         WHERE JourMeteo.Date BETWEEN {pDateMin} AND {pDateMax}
        )
    GROUP BY
        MoisAnnée
    Tu peux éventuellemnt ajouter un CASE...WHEN sur le SUBSTR(JourMeteo.Date,5,2) pour avoir le mois en lettre
    Plus besoin de boucles, de calcul du mois suivant...,il n'y a qu'à exécuter la requête
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 67
    Points : 62
    Points
    62
    Par défaut
    Merci Voroltinquo, elle est classe ta requête

  10. #10
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Et pourquoi pas plus simplement :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT 
         SUBSTR(JourMeteo.Date,5,2)+LEFT(JourMeteo.Date,4) AS MoisAnnée,
         AVG(JourMeteo.TempMin) AS TempMin,
         AVG(JourMeteo.TempMax) AS TempMax
    FROM
        JourMeteo
    WHERE
        JourMeteo.Date BETWEEN {pDateMin} AND {pDateMax}
    GROUP BY
        MoisAnnée

    SQL est un outil extraordinaire.
    Ici, il n'y a qu'un fichier... mais un jour, tu sauras faire des requêtes avec 10 fichiers, ou même plus !
    Et tu verras que c'est toujours aussi simple, et toujours aussi efficace.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  11. #11
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2017
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2017
    Messages : 2 805
    Points : 5 253
    Points
    5 253
    Billets dans le blog
    1
    Par défaut
    C'est en effet plus simple, j'étais resté sur l'idée de la requête initiale qui récupérait les jours concernés...
    On va dire que c'est une introduction à l'instruction IN ...
    Il y a peut-être plus simple, mais ça tourne.
    Quand tout a échoué utilisez l'option RTFM

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/09/2006, 14h06
  2. cmt se connecté a oracle pour faire une requete avec python
    Par dipajero dans le forum Bibliothèques tierces
    Réponses: 6
    Dernier message: 28/12/2005, 20h22
  3. Aide pour optimiser une requete
    Par Akanath dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/09/2005, 11h05
  4. En difficulté pour faire une requete
    Par Fonzy17 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/03/2005, 10h56
  5. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22

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