Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Ecart en jours entre 2 dates Mar 2 Mar 2010 - 9:18 | |
| Motivé par la demande d'un membre du forum, j'ai réalisé un petit module Panoramic permettant de calculer l'écart entre deus dates, en nombre de jours, quelque soit la date, et en tenant compte des années bisextiles. Le module publié ci-après contient toute la documentation dans le source, et est exécutable tel quel dans l'éditeut puisqu'l contient un petit programme de démonstration. Attention: il faut rentrer des dates valides ! - Code:
-
rem ********************************************************** rem * * rem * déclaration nécessaires en début de programme * rem * * rem **********************************************************
label ecart_en_jours, eej_eclater, eej_eclater_fin dim eej_debut$, eej_fin$, eej_date$, eej_ecart% dim eej_d%(1,2) :rem "dates début et éclatées" dim eej_i%, eej_j%, eej_jours%(12) dim eej_nad%, eej_naf%, eej_nd%, eej_nf%
rem ********************************************************** rem * programme de test * rem * * rem **********************************************************
label calculer
width 0,250 height 0,200
alpha 1 caption 1,"Jour début:" top 1,10 left 1,10
edit 2 top 2,10 left 2,100
alpha 3 caption 3,"Jour début:" top 3,30 left 3,10
edit 4 top 4,30 left 4,100
button 5 caption 5,"Calculer l'écart" top 5,70 left 5,100 on_click 5,calculer
alpha 6 top 6,110 left 6,100 font_size 6,16 font_color 6,0,0,255 caption 6,"0"
end
rem ----------------- ceci montre comment appeler la routine !!!!!!!!!!!! calculer: eej_debut$ = text$(2) eej_fin$ = text$(4) gosub ecart_en_jours caption 6,str$(eej_ecart%) return
rem ************************************************************ rem * * rem * ecart en jours - routine à inclure dans le source * rem * * rem * en entrée, charger les variiables eej_debut$ et eej_fin$ * rem * en sortie, utiliser la variable eej_ecart% * rem * * rem * Si la date de fin est plus petite que la date de début, * rem * le programme retourne 0. * rem * * rem * ATTENTION: il faut spécifier des dates valides !!! * rem * * rem ************************************************************
ecart_en_jours: eej_ecart% = 0 :rem "suppoer aucun écart" eej_jours%(1) = 31 eej_jours%(2) = 28 eej_jours%(3) = 31 eej_jours%(4) = 30 eej_jours%(5) = 31 eej_jours%(6) = 30 eej_jours%(7) = 31 eej_jours%(8) = 31 eej_jours%(9) = 30 eej_jours%(10) = 31 eej_jours%(11) = 30 eej_jours%(12) = 31 eej_date$ = eej_debut$ eej_i% = 0 :rem "date de début" gosub eej_eclater :rem "indice (0,x) pour début" eej_date$ = eej_fin$ eej_i% = 1 :rem "date de fint" gosub eej_eclater :rem "indice (1,x) pour fin" if eej_d%(0,2)>eej_d%(1,2) then return :rem "année début>fin ? if eej_d%(0,2)=eej_d%(1,2) if eej_d%(0,1)>eej_d%(1,1) then return :rem "mois début>fin ? if eej_d%(0,1)=eej_d%(1,1) if eej_d%(0,0)=eej_d%(1,0) then return :rem "jour début>=fin ? end_if end_if rem ici, on a des dates différentes avec certitude ! eej_nad% = 365 if frac(eej_d%(0,2)/4)=0 then eej_nad% = 366 :rem "longueur année début" eej_naf% = 365 if frac(eej_d%(1,2)/4)=0 then eej_naf% = 366 :rem "longueur année fin" eej_nd% = eej_d%(0,0) :rem "numero de jour début" if eej_d%(0,1)>1 for eej_i%=1 to eej_d%(0,1)-1 :rem "ajouter les autres mois" eej_nd% = eej_nd% + eej_jours%(eej_i%) if eej_i%=2 :rem "février ?" if eej_nad%=366 then eej_nd% = eej_nd% + 1 :"rem année bisextile" end_if next eej_i% end_if eej_nf% = eej_d%(1,0) :rem "numero de jour fin" if eej_d%(1,1)>1 for eej_i%=1 to eej_d%(1,1)-1 :rem "ajouter les autres mois" eej_nf% = eej_nf% + eej_jours%(eej_i%) if eej_i%=2 :rem "février ?" if eej_naf%=366 then eej_nf% = eej_nf% + 1 :rem "rem année bisextile" end_if next eej_i% end_if eej_ecart% = eej_nf% - eej_nd% while eej_d%(0,2)<eej_d%(1,2) eej_nad% = 365 :rem "écart des années" if eej_d%(0,1)<3 :rem "janvier ou février ?" if frac(eej_d%(0,2)/4)=0 eej_nad% = 366 :rem "année bisextite" end_if end_if eej_d%(0,1) = 2 :rem "gérer bisextile pour les autres années eej_ecart% = eej_ecart% + eej_nad% :rem "ajouter année" eej_d%(0,2)= eej_d%(0,2) + 1 :rem "passer à l'année suivante" end_while return
rem ---------------------- routine de service à inclure aussi dans le source ! eej_eclater: eej_d%(eej_i%,0) = 0 eej_d%(eej_i%,1) = 0 eej_d%(eej_i%,2) = 0 rem on_error_goto eej_eclater_fin eej_j% = instr(eej_date$,"/") if eej_j%>0 eej_d%(eej_i%,0) = val(left$(eej_date$,eej_j%-1)) eej_date$ = right$(eej_date$,len(eej_date$)-eej_j%) eej_j% = instr(eej_date$,"/") if eej_j%>0 eej_d%(eej_i%,1) = val(left$(eej_date$,eej_j%-1)) eej_date$ = right$(eej_date$,len(eej_date$)-eej_j%) eej_d%(eej_i%,2) = val(eej_date$) end_if end_if eej_eclater_fin: return
| |
|