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 :

Calcul et arrondi sur les durées [WD17]


Sujet :

WinDev

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut Calcul et arrondi sur les durées
    Bonjour à tous.

    Je viens vers vous avant de finaliser mon projet sur la façon dont je vais gérer les durées.
    Mon but est simple je veux faire un état mensuel des heures supplémentaires effectuées par des agents.
    A chaque fois qu'un agent dépasse ses horaires je note dans une base de données au format hyperfile:
    --Date de début
    --Date de fin
    --Heure de début
    --Heure de fin
    Ensuite quand je valide un calcul automatique se fait pour savoir combien cela représente comme temps supplémentaire. Pour cela j'utilise les durées avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DateHeureDébut est une DateHeure = SAI_DateDébut+SAI_HeureDébut
    DateHeureFin est une DateHeure = SAI_DateFin+SAI_HeureFin
    TempsHSupp est une durée
    TempsHSupp = DateHeureFin - DateHeureDébut
    Avec ce code je vais par exemple obtenir pour 01h05 d'heure supp la valeur TempHSupp 0010500000.
    Cette valeur je veux l'enregistrer dans la ma base de données mais je ne sais pas sous quel format je doit l'enregistrer car j'ai vu dans l'aide que les variables de durée sont soit une chaine au format "+JHHMMSSLLL" soit un entier correspondant au nombre de millisecondes de la durée.
    De plus le souci est que chez nous les heures sont arrondies au 1/4 d'heure supérieur. Donc dans le cas présent je voudrais réussir à arrondir cette valeur qui représente 01h05 pour qu'elle fasse 01h15.
    Merci de votre aide !

  2. #2
    Expert éminent
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 308
    Points : 9 417
    Points
    9 417
    Par défaut
    Une solution est d'enregistrer le nombre de quarts d'heure (ta rubrique serait donc un entier) : une heure sup te donne 4. Une autre serait d'enregistrer les minutes supplémentaires : pour une heure sup, tu enregistrerais 60 minutes.

    C'est à toi de choisir...

    Pour les arrondis, regarde du coté de la division entière et du modulo...

  3. #3
    Membre éprouvé

    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    402
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 402
    Points : 915
    Points
    915
    Par défaut
    Quand tu dis que les heures sont arrondies au 1/4h supérieur j'imagine que c'est en fin de calcul.
    L'agent qui fait cinq minutes tous les soirs ne se voit pas gratifié d'une heure et quart d'heures supp en fin de semaine quand même?

    Donc pour ton calcul tu dois mémoriser les minutes et pas les 1/4 d'heure

    Il y a plusieurs façons de régler ton problème.
    En voici une :
    Tu vas récupérer une durée sous forme JHHMMSSLLL
    tu utilises une variable de type DateHeure dans ta base de donnée pour l'enregistrer.
    Comme ça pas de conversion à faire tu restes en base 60 pour tes heures.
    Tu fais tes additions d'heures supp en utilisant des variables de type dateheure.
    Ensuite tu fais un arrondi au 1/4 heure supérieur sur la valeur finale.

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Janvier 2011
    Messages : 27
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Je pense que la solution la plus simple est d'utiliser les propriétés du type Durée du WLangage.

    Pour cet exemple précis il faut créer une rubrique de type entier dans la table HFSQL C/S puis pour lire et écrire cette valeur il faut utiliser la propriété ..EnMinutes du type Durée.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TableHF.MaDuree = TempsHSupp..EnMinutes
    Et pour récupérer la durée de la table HF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TempsHSupp..EnMinutes = TableHF.MaDuree
    Si il faut une granularité plus importante on pourra utiliser ..EnSecondes ou ..EnMillisecondes.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    Merci à tous pour vos réponses.
    J'ai trouvé la solution la plus simple pour le stockage... C'est que tout est prévu par Windev... En fait quand Atsibat m'a dit de mettre DateHeure dans la base de données, je me suis dit: "C'est bizarre je n'ai pas vu ce type de données. On a heure et date mais pas dateheure."
    Je suis allé vérifier et en bidouillant j'ai mis Date et je me suis aperçu que effectivement que le sous-type "Date et Heure" existait mais aussi qu'il y avait juste en dessous un sous-type... "Durée".
    Et là mon problème est résolu pour le stockage car après avoir testé, cela fonctionne à merveille !
    Il me reste juste à faire un petit truc pour faire mon arrondi mais là... C'est pas gagné... J'ai encore un peu besoin de vous... Surtout que la base de donnée enregistre la durée au format "+JHHMMSSLLL"...
    Petite précision, un agent qui fait effectivement 5 mn tous les jours va bien avoir 01h15 à la fin de la semaine ! L'arrondi se fait bien à la journée avant de rentrer la valeur dans la base de donnée.
    Mais quand on dépasse c'est rarement de 5 mn...

  6. #6
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Bonjour,

    à la volée pour arrondir à +15, il faut faire un truc du genre (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TempsMinute = (PartieEntiere(TempsMinute/15)*15) + (modulo(TempsMinute,15) > 0 ? 15 sinon 0)
    Bonne suite,

    Nicolas

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 451
    Points
    2 451
    Par défaut
    Bonjour,

    Tout d'abord, vous pouvez simplifier votre FIC en ne retenant que deux rubriques (DateHeureDébut et DateHeureFin) au lieu des quatre que vous nous décrivez.
    Pour cela, il vous suffit de définir vos rubriques comme étant de type date avec un sous-type "DateHeure", dont l'encombrement est identique à celui du type Date ou Heure, soit 8 octets.

    Résultats :
    - division par deux de l'encombrement
    - données "ready" pour les calculs
    - lecture et traitement plus rapide
    - code plus lisible

    Ensuite, normalement, on ne stocke pas de données dérivant d'un calcul.
    Cela peut amener des incohérences dans la base et si vous persistez, vous devriez alors implémenter une routine de contrôle de la cohérence des durées que vous enregistrez.
    Si vous traitez des volumes très importants, ce la peut se comprendre. Dans la plupart des cas, un calcul au moment de l'exploitation est suffisant, ou alors un stockage temporaire en fichier de travail.

    Quant à effectuer votre calcul, travaillez directement avec les données enregistrées en stockant le résultat dans une variable durée comme vous l'envisagiez. Pas besoin de passer par des conversions.

    Enfin, mais je n'ai jamais testé cela, la propriété ..EnHeures d'une variable de type Durée, renvoie une valeur réelle avec donc des décimales que vous pouvez tester.

    Bon travail

    Hemgé

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos réponse.
    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DateHeureDébut est une DateHeure = SAI_DateDébut+SAI_HeureDébut
    DateHeureFin est une DateHeure = SAI_DateFin+SAI_HeureFin
    DuréeHSupp est une Durée = DateHeureFin-DateHeureDébut
    MnHSupp est un entier = DuréeHSupp..Minute
    SELON MnHSupp
    	CAS 0<*<15 : DuréeHSupp..Minute=15
    	CAS 15<*<30 : DuréeHSupp..Minute=30
    	CAS 30<*<45 : DuréeHSupp..Minute=45
    	CAS 45<*<60 :
    		DuréeHSupp..Heure++
    		DuréeHSupp..Minute=00
    FIN
    Ça marche impeccable ! Il ne me reste plus qu'à mettre ça sous forme de procédure/fonction car je vais utiliser cela un grand nombre de fois.
    Ça fait une heure que j'essaye et je n'ai toujours pas pigé comment marche les fonctions...

  9. #9
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Citation Envoyé par meganulos Voir le message
    Il ne me reste plus qu'à mettre ça sous forme de procédure/fonction car je vais utiliser cela un grand nombre de fois.
    Ça fait une heure que j'essaye et je n'ai toujours pas pigé comment marche les fonctions...
    Alors il est grand temps de commencer le guide d'auto-formation
    Et de mettre cette discussion a

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    Je l'ai lu et je viens d'aller vérifier un truc à l'instant dedans mais même avec l'aide de Windev je n'arrive pas à faire ce que je veux !
    Voici ma procédure : Elle fonctionne sans problème mais je voudrais qu'elle me renvoie la variable duDuréeHSupp pour que je puisse m'en servir mais je n'y arrive pas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PROCEDURE ArrondisHeuresSupp(dhDateHeureDébutHSupp est une DateHeure,dhDateHeureFinHSupp est une DateHeure)
    duDuréeHSupp est une Durée =dhDateHeureFinHSupp-dhDateHeureDébutHSupp
    nMnHSupp est un entier =duDuréeHSupp..Minute
    SELON nMnHSupp
    	CAS 0<*<15 : duDuréeHSupp..Minute=15
    	CAS 15<*<30 : duDuréeHSupp..Minute=30
    	CAS 30<*<45 : duDuréeHSupp..Minute=45
    	CAS 45<*<60 :
    		duDuréeHSupp..Heure++
    		duDuréeHSupp..Minute=00
    FIN
    Si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ArrondisHeuresSupp(SC_Fiche.SAI_DateDébut+SC_Fiche.SAI_HeureDébut,SC_Fiche.SAI_DateFin+SC_Fiche.SAI_HeureFin)
    Info(duDuréeHSupp)
    Il me dit : "Erreur :Identificateur 'duDuréeHSupp' inconnu ou inaccessible."

  11. #11
    Membre émérite
    Avatar de L.nico
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2003
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 143
    Points : 2 679
    Points
    2 679
    Par défaut
    Vous n'êtes pas très loin
    Si vous jetiez un coup d'oeil dans l'aide sur l'instruction RENVOYER

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 67
    Points : 47
    Points
    47
    Par défaut
    Merci à tous pour votre aide précieuse. Ca fonctionne à merveille !

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

Discussions similaires

  1. Problème d'arrondi sur les nombres décimaux
    Par marcandre dans le forum Développement
    Réponses: 2
    Dernier message: 17/01/2011, 16h29
  2. [PR-2003] Perte lien excel project sur les durées
    Par juliens.1977 dans le forum Project
    Réponses: 0
    Dernier message: 31/08/2009, 22h28
  3. calcul de moyenne sur les bins d'un histogramme
    Par berlilou dans le forum MATLAB
    Réponses: 3
    Dernier message: 10/03/2008, 16h03
  4. [8.5] calcul de moyenne sur une durée
    Par rihiveli dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 27/04/2007, 11h06
  5. Calcul de Statistics sur les requêtes
    Par Rahustro dans le forum Oracle
    Réponses: 3
    Dernier message: 17/01/2006, 06h19

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