Comment : |
Langages disponibles : reporting, Maintain
La fonction DATEMOV déplace une date jusqu'à un point significatif du calendrier.
Puisque le Gestionnaire de dialogue interprète une date comme alphanumérique ou numérique, et que DATEMOV nécessite une date standard stockée comme décalage de la date de base, n'utilisez pas DATEMOV avec le Gestionnaire de dialogue à moins que vous ne convertissiez d'abord la variable comme date de saisie à un décalage à partir de la date de base. Par exemple, ce qui suit convertit la date héritée complète 20050131 à une date intelligente, ajoute un mois, et convertit le résultat en une date d'héritage alphanumérique :
-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 sortie montre que la fonction DATEADD a ajouté le nombre réel de jours au mois de Février pour se rendre à la fin du mois à partir de fin Janvier :
A MONTH FROM 20050131 IS 02282005
Pour plus d'informations, consultez Appeler une fonction à partir d'une commande Dialog Manager.
DATEMOV ne fonctionne qu'avec les composants de date remplis.
DATEMOV(date, 'move-point')
où :
Date
est la date à déplacer. Il doit s'agir d'une date au format composant complète (par exemple, MDYY ou YYJUL).
Alphanumérique
est la date de calendrier vers laquelle la date est déplacée, entre guillemets simples. Un point non valide donne zéro comme code de retour. Voici les valeurs valables :
La définition des paramètres BUSDAYS et HDAY peut affecter la calcul de jour ouvrable.
Notez également que lorsque la fonction DATEMOV calcule le jour ouvrable ou jour de travail suivant ou précédent, il commence toujours par un jour ouvrable ou un jour de travail. Donc, si le jour même est Samedi ou Dimanche, et la requête veut calculer le jour ouvrable suivant, DATEMOV utilisera Lundi comme jour de départ, pas Samedi ni Dimanche, et renverra Mardi comme jour ouvrable suivant. De même, lors du calcul du jour ouvrable précédent, il utilisera comme jour de départ Vendredi, et renverra Jeudi comme jour ouvrable précédent.
Pour éviter de sauter un jour ouvrable ou jour de travail, utiliser DATEMOV deux fois. Pour renvoyer le jour ouvrable ou jour de travail prochain, utilisez BD- ou WD- pour passer d'abord au jour ouvrable ou jour de travail précédent (s'il s'agit déjà d'un jour ouvrable ou jour de travail, il ne sera pas déplacé). Utilisez ensuite DATEMOV à nouveau pour passer au prochain jour ouvrable ou jour de travail. Si vous souhaitez renvoyer le jour ouvrable ou jour de travail précédent, utilisez d'abord BD+ ou WD+ pour passer d'abord au jour ouvrable ou jour de travail suivant (s'il s'agit déjà d'un type de jour correct, il ne sera pas déplacé). Utilisez ensuite DATEMOV à nouveau pour renvoyer le jour ouvrable ou jour de travail précédent.
Remarque : DATEMOV n'utilise pas d'argument de sortie, utilisant le format de l'argument date pour le résultat. Du moment que le résultat est une date complète de composant, il ne peut être attribué qu'à un champ de date complète de composant ou un champ entier.
Cet exemple montre pourquoi vous devrez peut-être utiliser DATEMOV deux fois pour obtenir le résultat correct.
La requête suivante contre la source de données GGSALES utilise le point de mouvement BD (jour ouvrable) contre le champ DATE. DATE est d'abord converti en date intelligente, puis DATEMOV est appelé avec le point de mouvement 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
Quand la date en sortie est un samedi ou un dimanche, le jour ouvré renvoyé est un mardi. Ceci est expliqué par le fait qu'avant de faire le calcul, DATEMOV a déplacé la date initiale à un jour ouvrable :
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
Dans la version suivante de la requête, DATEMOV est appelé deux fois, une fois pour s'assurer que le jour de départ est un jour ouvrable. Le point de mouvement spécifié dans le premier appel est BD- qui ne déplace la date que vers le jour ouvrable précédant s'il ne s'agit pas déjà d'un jour ouvrable. Le deuxième appel vers DATEMOV utilise ensuite le point de mouvement BD pour renvoyer le prochain jour ouvrable :
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
Sur la sortie, le jour ouvrable suivant après qu'un Samedi ou Dimanche est renvoyé comme étant Lundi :
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
Le paramètre BUSDAYS définit les jours ouvrables à Lundi, Mardi, Mercredi, et Jeudi. DATECVT convertit les dates patrimoniales de HIRE_DATE en format YYMD et fournit les options d'affichage de date. DATEMOV détermine ensuite les points significatifs pour 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 sortie est :
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 détermine la fin de la semaine pour chaque date dans NEW_DATE; le résultat est stocké dans 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 sortie est :
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 détermine la fin de la semaine pour chaque date :
MAINTAIN
COMPUTE X/YYMDWT='20020717';
COMPUTE Y/YYMDWT=DATEMOV(X, 'EOW', Y);
TYPE "<<X <<Y END OF WEEK "
END
Le résultat est :
2002/07/17, WED 2002/07/19, FRI END OF WEEK
WebFOCUS |