DATEMOV : Déplacer une date à un point significatif

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.


Haut de page

x
Syntaxe : Déplacer la date jusqu'à un point significatif
DATEMOV(date, 'move-point')

où :

date

Date

est la date à déplacer. Il doit s'agir d'une date au format composant complète (par exemple, MDYY ou YYJUL).

move_point

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 :

  • EOM, qui représente la fin du mois.
  • BOM, qui représente le début du mois.
  • EOQ, qui représente la fin du trimestre.
  • BOQ, qui représente le début du trimestre.
  • EOY, qui représente la fin de l'année.
  • BOY, qui représente le début de l'année.
  • EOW, qui représente la fin de la semaine.
  • BOW, qui représnete le début de la semaine.
  • NWD, qui représente le jour de la semaine suivant.
  • NBD, qui représente le jour ouvrable suivant.
  • PWD, qui représente le jour de la semaine précédent.
  • PBD, qui représente le jour ouvrable précédent.
  • WD-, qui représente un jour de la semaine ou plus tôt.
  • BD-, qui représente un jour ouvrable ou plus tôt.
  • WD+, qui représente un jour de la semaine ou plus tard.
  • BD+, qui représente un jour ouvrable ou plus tard.

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.



Exemple : Retourner le jour ouvrable suivant

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


Exemple : Déterminer les points significatifs pour une date (Reporting)

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


Exemple : Déterminer la fin de la semaine (Reporting)

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


Exemple : Déterminer la fin de la semaine (Maintain)

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