Cómo: |
Idiomas disponibles: informes, Maintain
La función DATEMOV cambia la fecha a un punto importante del calendario.
Puesto que Dialogue Manager interpreta la fecha como alfanumérica o numérica, y DATEMOV requiere la presencia de una fecha estándar almacenada como desplazamiento de la fecha base, evite utilizar DATEMOV con Dialogue Manager, a menos que primero convierta la variable utilizada como fecha de entrada para un desplazamiento de la fecha base. Por ejemplo, en el ejemplo siguiente la fecha legacy de número entero, 20050131, se ha convertido a una fecha inteligente, se ha añadido un mes y el resultado se ha transformado a una fecha legacy alfanumérica:
-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
La salida indica que la función DATEADD ha añadido el número real de días del mes de febrero, para llegar al final del mes a partir del final de enero:
A MONTH FROM 20050131 IS 02282005
Para más información, consulte Cómo llamar a una función desde un comando de Dialogue Manager.
DATEMOV sólo funciona con fechas que incluyan todos los componentes.
DATEMOV(date, 'move-point')
donde:
Fecha
Es la fecha que se va a cambiar. Debe ser una fecha de formato de componente completo (por ejemplo, MDYY o YYJUL).
Alfanumérico
Es el punto significativo al que se cambia la fecha, entre comillas simples ('). Al introducir un punto no válido, se obtiene un código de retorno de cero. Los valores válidos son:
Los cálculos de días laborables se ven afectados por las configuraciones de los parámetros BUSDAYS y HDAY.
Además, observe que, cuando la función DATEMOV calcula el próximo, o anterior, día laborable, siempre parte de un día laborable. Así que, si el día real es un sábado o un domingo y la solicitud desea calcular el próximo día laborable, DATEMOV toma el lunes (ni el sábado ni el domingo) como primer día laborable y devuelve el martes como siguiente día laborable. De forma parecida, cuando está calculando el anterior día laborable, emplea el viernes como día laborable inicial y devuelve el martes como anterior día laborable.
Para impedir que se salte un día laborable, use DATEMOV dos veces. Para volver al próximo día laborable, use BD- o WD- para pasar primero al día laborable anterior (si ya es un día laborable no se moverá). A continuación, vuelva a utilizar DATEMOV para pasar al próximo día laborable. Para volver al día laborable anterior, primero utilice BD+ o WD+ para pasar al próximo día laborable (si ya es un día laborable no se moverá). A continuación, vuelva a utilizar DATEMOV para pasar al día laborable anterior.
Nota: DATEMOV no usa un argumento output, sino que emplea el formato del argumento date para el resultado. Siempre que el resultado sea una fecha de componente completo, sólo podrá asignarse a un campo de fecha de componente completo o a un campo de número entero.
Como indica el ejemplo, es posible que tenga que utilizar DATEMOV dos veces para obtener el resultado correcto.
La siguiente solicitud, basada en el origen de datos GGSALES, emplea el punto de movimiento BD (día laborable en sus siglas inglesas) sobre el campo DATE. Primero se convierte DATE a una fecha inteligente y, a continuación, se llama a DATEMOV con el punto-movimiento DB:
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
En la salida, cuando la fecha caiga en sábado o domingo, el siguiente día laborable será el martes. Esto se debe a que antes de realizar el cálculo, DATEMOV ha pasado la fecha original al próximo día laborable:
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
En la siguiente versión de la solicitud, DATEMOV ha sido llamada dos veces; la primera para comprobar que el día inicial es laborable. El punto de movimiento especificado en la primera llamada es DB-, que sólo desplaza la fecha al anterior día laborable si no es ya de por sí una fecha laborable. Después, la segunda llamada a DATEMOV usa el punto de movimiento BD para devolver el próximo día laborable:
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
Ahora, el próximo día laborable después de un sábado o un domingo será el lunes:
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
El parámetro BUSDAYS establece como días laborables el lunes, martes, miércoles y jueves. DATECVT convierte las fecha legacy HIRE_DATE al formato de fecha YYMD y proporciona opciones de visualización de fechas. A continuación, DATEMOV determina los puntos significativos de 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
La salida es:
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 el final de la semana de cada fecha situada en NEW_DATE y guarda el resultado en 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
La salida es:
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 el final de la semana de cada fecha:
MAINTAIN
COMPUTE X/YYMDWT='20020717';
COMPUTE Y/YYMDWT=DATEMOV(X, 'EOW', Y);
TYPE "<<X <<Y END OF WEEK "
END
El resultado es:
2002/07/17, WED 2002/07/19, FRI END OF WEEK
WebFOCUS |