Come: |
Lingue disponibili: reporting, Maintain
La funzione DATEMOV sposta una data ad un punto significativo sul calendario.
Poiché Dialogue Manger interpreta una data come valore alfanumerico o numerico e DATEMOV richiede una data standard memorizzata come un offset dalla data di base, non usare DAFEMOV con Dialogue Manager, a meno che non si converte prima la variabile usata come data di immissione ad un offset dalla data di base. Per esempio, il seguente converte la data legacy 20050131 in una smart date, aggiunge un mese e converte il risultato in una data legacy alfanumerica:
-SET &STRT=DATECVT(20050131,'I8YYMD', 'YYMD'); -SET &NMT=DATEADD(&STRT,'M',1); -SET &NMTA=DATECVT(&NMT,'YYMD','A8MTDYY'); -TYPE A MONTH FROM 20050131 IS &NMTA
L'emissione mostra che la funzione DATEADD aggiunta al numero effettivo di giorni nel mese di Febbraio, per arrivare alla fine del mese dalla fine di Gennaio.
A MONTH FROM 20050131 IS 02282005
DATEMOV funziona solo con componenti completi di date.
DATEMOV(date, 'move-point')
dove:
Data
Data da spostare. Deve essere una data con componente formato data completa (ad esempio, MDYY o YYJUL).
Alfanumerico
Il punto significativo in cui si sposta la data per racchiuderla tra virgolette singole. Un punto non valido restituisce un codice pari a zero. I valori validi sono:
Il calcolo del giorno lavorativo è influenzato dalle impostazioni di parametro BUSDAYS e HDAY.
Inoltre, notare che quando la funzione DATEMOV calcola il prossimo o il precedente giorno aziendale o giorno lavorativo, inizia sempre da un giorno aziendale o da un giorno lavorativo. Quindi, se il giorno effettivo è Sabato o Domenica e la richiesta desidera calcolare il prossimo giorno aziendale, DATEMOV userà Lunedì come giorno iniziale, non Sabato e Domenica, e restituirà Martedì come il prossimo giorno aziendale. In modo simile, quando si calcola il giorno aziendale precedente, la funzione userà il giorno iniziale di Venerdì e restituirà Giovedì come il giorno aziendale precedente.
Per evitare il salto di un giorno aziendale o giorno lavorativo, usare due volte DATEMOV. Per restituire il prossimo giorno aziendale o lavorativo, usare BD- o WD- per spostarsi prima al giorno lavorativo o aziendale precedente (se si tratta già di un giorno lavorativo o aziendale, non ci si sposterà). Quindi, usare di nuovo DATEMOV per spostarsi al prossimo giorno lavorativo o aziendale. Se si desidera ritornare al giorno lavorativo o aziendale precedente, usare prima BD+ o WD+ per spostarsi al prossimo giorno lavorativo o aziendale (se si tratta già del tipo corretto di giorno, non ci si sposterà). Quindi, usare, DATEMOV per ritornare al giorno lavorativo o aziendale precedente.
Nota: DATEMOV non usa un argomento di emissione. Usa il formato dell'argomento data per il risultato. Purché il risultato sia una data componente completo, è possibile assegnarla solo ad un campo data componente completo, o ad un campo intero.
Questo esempio mostra per quale motivo si potrebbe dover usare DATEMOV due volte per ottenere il risultato corretto.
La seguente richiesta rispetto all'origine data GGSALES usa il punto di spostamento BD (Business Day) rispetto al campo DATE. La prima DATE viene convertita in una smart date, quindi DATEMOV viene chiamata con il punto di spostamento BD:
DEFINE FILE GGSALES DT1/WMDYY=DATE; DT2/WMDYY = DATEADD(DT1 ,'BD',1); DAY/Dt = DT1; END TABLE FILE GGSALES SUM DT1 DT2 BY DT1 NOPRINT WHERE RECORDLIMIT EQ 10 END
Quando la data è un Sabato o una Domenica nell'emissione, il prossimo giorno aziendale viene restiuito come un Martedì. Questo accade perché prima di eseguire il calcolo, DATEMOV ha spostato la data originale ad un giorno aziendale:
DT1 DT2 --- --- SUN, 09/01/1996 TUE, 09/03/1996 FRI, 11/01/1996 MON, 11/04/1996 SUN, 12/01/1996 TUE, 12/03/1996 SAT, 03/01/1997 TUE, 03/04/1997 TUE, 04/01/1997 WED, 04/02/1997 THU, 05/01/1997 FRI, 05/02/1997 SUN, 06/01/1997 TUE, 06/03/1997 MON, 09/01/1997 TUE, 09/02/1997 WED, 10/01/1997 THU, 10/02/1997
Nella seguente versione della richiesta, DATEMOV viene chiamato due volte, una volta per assicurarsi che la data iniziale sia un giorno aziendale. Il punto di spostamento specificato nella prima chiamata è BD-, che sposta solo la data al giorno aziendale precedente, se non si tratta già di un giorno aziendale. La seconda chiamata a DATEMOV usa, quindi, il punto di spostamento BD per restituire il prossimo giorno aziendale:
DEFINE FILE GGSALES DT1/WMDYY=DATE; DT1A/WMDYY=DATEMOV(DT1, 'BD-'); DT2/WMDYY = DATEADD(DT1A,'BD',1); DAY/Dt = DT1; END TABLE FILE GGSALES SUM DT1 DT1A DT2 BY DT1 NOPRINT WHERE RECORDLIMIT EQ 10 END
Sull'emissione, il prossimo giorno aziendale dopo un Sabato o Domenica è ora restituito come Lunedì:
DT1 DT1A DT2 --- ---- --- SUN, 09/01/1996 FRI, 08/30/1996 MON, 09/02/1996 FRI, 11/01/1996 FRI, 11/01/1996 MON, 11/04/1996 SUN, 12/01/1996 FRI, 11/29/1996 MON, 12/02/1996 SAT, 03/01/1997 FRI, 02/28/1997 MON, 03/03/1997 TUE, 04/01/1997 TUE, 04/01/1997 WED, 04/02/1997 THU, 05/01/1997 THU, 05/01/1997 FRI, 05/02/1997 SUN, 06/01/1997 FRI, 05/30/1997 MON, 06/02/1997 MON, 09/01/1997 MON, 09/01/1997 TUE, 09/02/1997 WED, 10/01/1997 WED, 10/01/1997 THU, 10/02/1997
Il parametro BUSDAYS imposta i giorni aziendali a Lunedì, Martedì, Mercoledì e Giovedì. DATECVT converte la data legacy HIRE_DATE al formato data YYMD e fornisce le opzioni di visualizzazione data. DATEMOV determina quindi i punti importanti per HIRE_DATE.
SET BUSDAY = _MTWT__ TABLE FILE EMPLOYEE PRINT COMPUTE NEW_DATE/YYMD = DATECVT(HIRE_DATE, 'I6YMD', 'YYMD'); AND COMPUTE NEW_DATE/WT = DATECVT(HIRE_DATE, 'I6YMD', 'WT'); AS 'DOW' AND COMPUTE NWD/WT = DATEMOV(NEW_DATE, 'NWD'); AND COMPUTE PWD/WT = DATEMOV(NEW_DATE, 'PWD'); AND COMPUTE WDP/WT = DATEMOV(NEW_DATE, 'WD+'); AS 'WD+' AND COMPUTE WDM/WT = DATEMOV(NEW_DATE, 'WD-'); AS 'WD-' AND COMPUTE NBD/WT = DATEMOV(NEW_DATE, 'NBD'); AND COMPUTE PBD/WT = DATEMOV(NEW_DATE, 'PBD'); AND COMPUTE WBP/WT = DATEMOV(NEW_DATE, 'BD+'); AS 'BD+' AND COMPUTE WBM/WT = DATEMOV(NEW_DATE, 'BD-'); AS 'BD-' BY LAST_NAME NOPRINT HEADING "Examples of DATEMOV" "Business days are Monday, Tuesday, Wednesday, + Thursday " " " "START DATE.. | MOVE POINTS..........................." WHERE DEPARTMENT EQ 'MIS'; END
L'emissione è:
Examples of DATEMOV Business days are Monday, Tuesday, Wednesday, + Thursday START DATE.. | MOVE POINTS........................... NEW_DATE DOW NWD PWD WD+ WD- NBD PBD BD+ BD- -------- --- --- --- --- --- --- --- --- --- 1982/04/01 THU FRI WED THU THU MON WED THU THU 1981/11/02 MON TUE FRI MON MON TUE THU MON MON 1982/04/01 THU FRI WED THU THU MON WED THU THU 1982/05/01 SAT TUE THU MON FRI TUE WED MON THU 1981/07/01 WED THU TUE WED WED THU TUE WED WED 1981/07/01 WED THU TUE WED WED THU TUE WED WED
DATEMOV determina la fine della settimana per ciascuna data in NEW_DATE e memorizza il risultato in EOW:
TABLE FILE EMPLOYEE
PRINT FIRST_NAME AND
COMPUTE NEW_DATE/YYMDWT = DATECVT(HIRE_DATE, 'I6YMD', 'YYMDWT'); AND
COMPUTE EOW/YYMDWT = DATEMOV(NEW_DATE, 'EOW');
BY LAST_NAME
WHERE DEPARTMENT EQ 'PRODUCTION';
END
L'emissione è:
LAST_NAME FIRST_NAME NEW_DATE EOW --------- ---------- -------- --- BANNING JOHN 1982 AUG 1, SUN 1982 AUG 6, FRI IRVING JOAN 1982 JAN 4, MON 1982 JAN 8, FRI MCKNIGHT ROGER 1982 FEB 2, TUE 1982 FEB 5, FRI ROMANS ANTHONY 1982 JUL 1, THU 1982 JUL 2, FRI SMITH RICHARD 1982 JAN 4, MON 1982 JAN 8, FRI STEVENS ALFRED 1980 JUN 2, MON 1980 JUN 6, FRI
DATEMOV determina la fine della settimana per ciascuna data:
MAINTAIN
COMPUTE X/YYMDWT='20020717';
COMPUTE Y/YYMDWT=DATEMOV(X, 'EOW', Y);
TYPE "<<X <<Y END OF WEEK "
END
Il risultato è:
2002/07/17, WED 2002/07/19, FRI END OF WEEK
WebFOCUS |