Discussione:
Calcolare ultimo giorno del mese
(troppo vecchio per rispondere)
Pegaso
2007-03-28 19:49:47 UTC
Permalink
Salve a tutti,
dovrei inserire una subroutine, o cmq una funzione che inserita una
data, ne calcoli il mese precendere... (e fin qui, nessun
problema)...

Ma c'è un modo affichè il sistema inserisca in una variabile SOLO
l'ultimo giorno del mese? (Considerando i mesi con 30, i mesi con 31,
gli anni bisestili...)

O bisogna fare una rountine che fa tutti i calcoli?
Jax
2007-03-28 21:01:49 UTC
Permalink
Post by Pegaso
Ma c'è un modo affichè il sistema inserisca in una variabile SOLO
l'ultimo giorno del mese? (Considerando i mesi con 30, i mesi con 31,
gli anni bisestili...)
Per ottenere l'ultimo giorno di un determinato mese/anno puoi fare così
(sembra difficile ma sono 4 istruzioni):
- in una variabile numerica 8.0 ci metti (con una movel), il mese e
l'anno richiesti, es. 20061200
- con una movel ci metti 01 (20061201)
- converti (sempre con una move) la variabile in una data ISO (2006/12/01)
- aggiungi (adddur) un mese alla data iso (2007/01/01)
- sottrai 1 giorno (subdur) alla data iso (2006/12/31)
et voilà
all'occorrenza ovviamente con una move puoi riconveritre l'iso in 8.0 o
come ti serve.
--
Jax
Massimiliano Toninelli
2007-03-29 06:07:36 UTC
Permalink
"Pegaso" <***@tiscali.it> ha scritto nel messaggio news:***@p15g2000hsd.googlegroups.com...
Salve a tutti,
dovrei inserire una subroutine, o cmq una funzione che inserita una
data, ne calcoli il mese precendere... (e fin qui, nessun
problema)...

Ma c'è un modo affichè il sistema inserisca in una variabile SOLO
l'ultimo giorno del mese? (Considerando i mesi con 30, i mesi con 31,
gli anni bisestili...)

O bisogna fare una rountine che fa tutti i calcoli?
==
Alla fine sono tre righe, che possono anche essere condensate in una (
questione di leggibilità).
Questo riceve una data ISO e ritorno di quel mese l'ultimo giorno lavorativo

d pr_LastdayOfMonth...
d pi like( msgerrore )
d data_ISO d value
d NrGiorni 2 0

d Proced c 'pr_LastdayOfMonth'

/free

data_ISO = %date( %subst( %char(data_ISO:*ISO):1:8)+'01');
data_ISO += %months(1) ;
data_ISO -= %days(1) ;

Puo' essere così ( l'ho fatta al volo )
data_ISO = (( %date( %subst( %char(data_ISO:*ISO):1:8)+'01'))+
%months(1) - %days(1)) ;


NrGiorni = %subdt(data_ISO:*days);
return ' ';
--
HTH

Massimiliano

----------------------------------------
In determinate situazioni ...un grammo di pratica vale più di un chilo di
teoria!!!

http://www.toninelli.it
Dr.UgoGagliardelli
2007-03-29 06:29:50 UTC
Permalink
Post by Pegaso
Salve a tutti,
dovrei inserire una subroutine, o cmq una funzione che inserita una
data, ne calcoli il mese precendere... (e fin qui, nessun
problema)...
Ma c'è un modo affichè il sistema inserisca in una variabile SOLO
l'ultimo giorno del mese? (Considerando i mesi con 30, i mesi con 31,
gli anni bisestili...)
O bisogna fare una rountine che fa tutti i calcoli?
se 'data' è un campo di tipo date:
if (%subdt(data:*months)) < (%subdt((data+%days(1)):*months))
l'espressione e' vera se la data si riferisce all'ultimo giorno di un mese
se la data e' in un altro formato puoi usare l'operatore %date, p.e.
%date(data:*ymd) nel caso di data alfabetica con separatori o numerica
YYMMDD etc.
--
Dr.Ugo Gagliardelli,Modena,ItalyCertifiedUindoscrasherAñejoAlcoolInside
Spaccamaroni andate a cagare/Spammers not welcome/Spammers vão à merda
Spamers iros a la mierda/Spamers allez vous faire foutre/Spammers loop
schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'
Dr.UgoGagliardelli
2007-03-29 06:35:32 UTC
Permalink
Post by Dr.UgoGagliardelli
if (%subdt(data:*months)) < (%subdt((data+%days(1)):*months))
leggasi:
if (%subdt(data:*months)) <> (%subdt((data+%days(1)):*months))
--
Dr.Ugo Gagliardelli,Modena,ItalyCertifiedUindoscrasherAñejoAlcoolInside
Spaccamaroni andate a cagare/Spammers not welcome/Spammers vão à merda
Spamers iros a la mierda/Spamers allez vous faire foutre/Spammers loop
schijten/Spammers macht Euch vom Acker/Spamerzy wypierdalac'
Danilo Cussini
2007-03-29 06:43:45 UTC
Permalink
Post by Pegaso
dovrei inserire una subroutine, o cmq una funzione che inserita una
data, ne calcoli il mese precendere... (e fin qui, nessun
problema)...
Estrai il giorno dalla data e lo sottrai dalla data (p.e. 2007-01-29 -
29 = 2006-12-31).
Post by Pegaso
Ma c'è un modo affichè il sistema inserisca in una variabile SOLO
l'ultimo giorno del mese? (Considerando i mesi con 30, i mesi con 31,
gli anni bisestili...)
O bisogna fare una rountine che fa tutti i calcoli?
Estrai il giorno dalla data fine mese.
Obelix
2007-03-29 08:14:11 UTC
Permalink
Post by Pegaso
Salve a tutti,
dovrei inserire una subroutine, o cmq una funzione che inserita una
data, ne calcoli il mese precendere... (e fin qui, nessun
problema)...
Ma c'è un modo affichè il sistema inserisca in una variabile SOLO
l'ultimo giorno del mese? (Considerando i mesi con 30, i mesi con 31,
gli anni bisestili...)
O bisogna fare una rountine che fa tutti i calcoli?
Non ho capito bene se vuoi la l'ultimo giorno del mese *precedente* o
l'ultimo giorno del mese *attuale*, anyway:

// ultimo giorno del mese precedente

Giorno = %subdt(Data - %days(%subdt(Data:*D)):*D) ;

// Ultimo giorno del mese attuale

Giorno = %subdt(((Data - %days(%subdt(Data:*D) -1) + %months(1)) -
%days(1)):*D) ;

Ovviamente, data una pseudo-data 8,0, la devi convertire in data con la
'solita' %date, avendo cura di fare un %testd prima...

Ps. In free, perche' in IV mi ci vogliono troppe righe :-)

Continua a leggere su narkive:
Loading...