Publié le :
Fonction CREATION_INTERNE

Création de fonctions personnalisées pour les jours de la semaine

Ce code est également disponible en : Deutsch English Español
En attente de validation
Le script commence par créer un jeu de données de test contenant quelques dates. Il utilise ensuite la procédure PROC FCMP pour compiler et stocker deux fonctions personnalisées dans le catalogue `work.cat_function`. La première fonction, `DayWeek`, retourne le nom du jour de la semaine (en français ou en anglais) pour une date donnée. La seconde fonction, `NumDayWeek`, retourne le numéro du jour de la semaine (où 1 = Lundi). Ces fonctions sont ensuite testées et appliquées au jeu de données `test`.
Analyse des données

Type : CREATION_INTERNE


Les données utilisées pour le test sont générées directement dans le script via un pas DATA utilisant l'instruction DATALINES.

1 Bloc de code
DATA STEP Data
Explication :
Création d'une table SAS temporaire nommée 'test' contenant une variable 'date' alimentée par des données brutes (datalines) pour tester les fonctions.
Copié !
1DATA test;
2 INPUT date;
3 informat date date9.;
4 FORMAT date date9.;
5 DATALINES;
6 31DEC2016
7 05JAN2017
8 05APR2017
9 09JUL2017
10 10NOV2017
11 31DEC2017
12 ;
13RUN;
2 Bloc de code
PROC FCMP
Explication :
Définition de la fonction personnalisée 'DayWeek' qui prend une date et un code langue ('EN' ou autre pour FR) et retourne le nom du jour. La fonction est compilée dans le paquetage 'work.cat_function.test'. Elle ajuste le résultat de WEEKDAY pour que Lundi soit le jour 1.
Copié !
1PROC FCMP outlib=work.cat_function.test;
2 function DayWeek(DateDay,Language $) $;
3 /* There is no test if DateDay is a real date.. */
4 Lg = Language;
5 nd=WEEKDAY(DateDay);
6 IF nd = 1
7 THEN
8 nd = 7;
9 ELSE
10 nd+-1;
11 LENGTH d $ 9;
12 IF Lg='EN' THEN DO;
13 select (nd);
14 when (1) d='monday';
15 when (2) d='tuesday';
16 when (3) d='wednesday';
17 when (4) d='thursday';
18 when (5) d='friday';
19 when (6) d='saturday';
20 when (7) d='sunday';
21 otherwise put 'Not a date !';
22 END;
23 END;
24 ELSE DO;
25 select (nd);
26 when (1) d='lundi';
27 when (2) d='mardi';
28 when (3) d='mercredi';
29 when (4) d='jeudi';
30 when (5) d='vendredi';
31 when (6) d='samedi';
32 when (7) d='dimanche';
33 otherwise put 'Not a date !';
34 END;
35 END;
36 return(d);
37 endsub;
38RUN;
3 Bloc de code
DATA STEP Data
Explication :
Application de la fonction 'DayWeek' sur la table 'test'. Crée deux nouvelles colonnes 'da' (Français) et 'da2' (Anglais). Note : Pour que cela fonctionne sans options globales, la session SAS doit connaître l'emplacement des fonctions CMPLIB, bien que l'option 'cmplib' ne soit pas explicitement définie ici, elle est souvent requise.
Copié !
1DATA test;
2 SET test;
3 LENGTH da da2 $ 9;
4 FORMAT da da2 $9.;
5 da=DayWeek(date,'FR');
6 da2=DayWeek(date,'EN');
7RUN;
4 Bloc de code
PROC FCMP
Explication :
Définition de la seconde fonction personnalisée 'NumDayWeek'. Elle retourne le numéro du jour sous forme de chaîne de caractères, avec Lundi = 1 et Dimanche = 7.
Copié !
1PROC FCMP outlib=work.cat_function.test;
2 function NumDayWeek(DateDay) $;
3 /* There is no test if DateDay is a real date.. */
4 nd=WEEKDAY(DateDay);
5 IF nd = 1
6 THEN
7 nd = 7;
8 ELSE
9 nd+-1;
10 LENGTH d $ 1;
11 d=put(nd,1.);
12 return(d);
13 endsub;
14RUN;
5 Bloc de code
DATA STEP Data
Explication :
Application de la fonction 'NumDayWeek' sur la table 'test' pour créer la colonne 'Numday'.
Copié !
1DATA test;
2 SET test;
3 LENGTH Numday $ 1;
4 FORMAT Numday $1.;
5 Numday=NumDayWeek(date);
6RUN;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Author(s) : Nicolas DUPONT - Creation date : 14/04/2017