Maîtriser les Formats SAS : Comment générer un Dataset de Contrôle (CNTLOUT) Robuste

Niveau de difficulté
Débutant
Publié le :
Simon

Le Conseil de l'Expert

Simon
Expert SAS et fondateur.

Les catalogues de formats sont souvent des 'boîtes noires' binaires difficiles à versionner.

Cette macro transforme ces métadonnées en actifs exploitables. En imposant un modèle de données rigoureux dès le départ (via %mddl_sas_cntlout) et en nettoyant les tables temporaires systématiquement, elle s'intègre parfaitement dans un pipeline de déploiement continu. C'est l'outil idéal pour extraire, auditer, puis réimporter des formats (CNTLIN) entre différents environnements tout en garantissant que la structure cible reste strictement identique à la source

Cette macro `%mp_cntlout` est conçue pour extraire des informations de formats SAS© et les organiser dans un jeu de données de contrôle (`cntlout`). Elle utilise la macro `%mddl_sas©_cntlout` (probablement pour initialiser un modèle de données de sortie) et peut sélectionner des formats spécifiques à extraire. Elle génère ensuite un dataset de sortie (`&cntlout`) en utilisant `PROC FORMAT` avec l'option `cntlout`. Un traitement spécifique est appliqué aux valeurs numériques (types 'I' et 'N') pour aligner les décimales via la macro `%mp_aligndecimal`, garantissant la comparabilité des plages. Un marqueur de ligne (`fmtrow`) est créé pour permettre le tri. Finalement, les tables temporaires utilisées sont supprimées via `PROC SQL`.
Analyse des données

Type : CREATION_INTERNE


La macro utilise `PROC FORMAT` avec l'option `cntlout` pour générer un dataset. Les sources primaires sont les définitions de formats SAS disponibles dans la librairie spécifiée par `libcat`, ainsi que les macros utilitaires internes (`%mf_getuniquename`, `%mddl_sas_cntlout`, `%mp_aligndecimal`).

1 Bloc de code
Macro Definition
Explication :
Définition de la macro `%mp_cntlout` qui prend des paramètres pour spécifier la librairie/catalogue de formats (`libcat`), le nom du jeu de données de sortie (`cntlout`), une liste de formats spécifiques (`fmtlist`), et une condition d'exécution (`iftrue`). Elle initialise également des noms de tables temporaires uniques.
Copié !
1%macro mp_cntlout(
2 iftrue=(1=1)
3 ,libcat=
4 ,cntlout=work.fmtextract
5 ,fmtlist=0
6)/*/STORE SOURCE*/;
7%local ddlds cntlds i;
8 
9%IF not(%eval(%unquote(&iftrue))) %THEN %return;
10 
11%let ddlds=%mf_getuniquename();
12%let cntlds=%mf_getuniquename();
2 Bloc de code
PROC FORMAT Data
Explication :
Utilise `PROC FORMAT` avec l'option `cntlout` pour générer un jeu de données de contrôle (`&cntlds`) à partir des formats de la librairie spécifiée (`&libcat`). Un bloc `%if` conditionnel permet de sélectionner des formats spécifiques s'ils sont fournis via `&fmtlist`. La référence `libcat` est potentiellement nettoyée si elle contient un suffixe '-FC'.
Copié !
1%mddl_sas_cntlout(libds=&ddlds)
2 
3%IF %index(&libcat,-)>0 and %scan(&libcat,2,-)=FC %THEN %DO;
4 %let libcat=%scan(&libcat,1,-);
5%END;
6 
7PROC FORMAT lib=&libcat cntlout=&cntlds;
8%IF "&fmtlist" ne "0" and "&fmtlist" ne "" %THEN %DO;
9 select
10 %DO i=1 %to %sysfunc(countw(&fmtlist,%str( ));
11 %scan(&fmtlist,&i,%str( ))
12 %END;
13 ;
14%END;
15RUN;
3 Bloc de code
DATA STEP Data
Explication :
Crée le jeu de données de sortie final (`&cntlout`) en combinant les informations des datasets temporaires (`&ddlds`, `&cntlds`). Il effectue un alignement décimal sur les colonnes numériques ('I', 'N') en utilisant la macro `%mp_aligndecimal` et crée un marqueur de ligne (`fmtrow`) pour le tri.
Copié !
1DATA &cntlout/nonote2err;
2 IF 0 THEN SET &ddlds;
3 SET &cntlds;
4 BY type fmtname notsorted;
5 
6 /* align the numeric values to avoid overlapping ranges */
7 IF type in ("I","N") THEN DO;
8 %mp_aligndecimal(start,width=16)
9 %mp_aligndecimal(END,width=16)
10 END;
11 
12 /* create row marker. Data cannot be sorted without it! */
13 IF first.fmtname THEN fmtrow=1;
14 ELSE fmtrow+1;
15 
16RUN;
4 Bloc de code
PROC SORT
Explication :
Trie le jeu de données de sortie (`&cntlout`) selon les variables `type`, `fmtname`, et `fmtrow`.
Copié !
1PROC SORT;
2 BY type fmtname fmtrow;
3RUN;
5 Bloc de code
PROC SQL
Explication :
Utilise `PROC SQL` pour supprimer les jeux de données temporaires (`&ddlds`, `&cntlds`) créés pendant l'exécution de la macro.
Copié !
1PROC SQL;
2drop TABLE &ddlds,&cntlds;
3QUIT;
6 Bloc de code
Macro End
Explication :
Termine la définition de la macro `%mp_cntlout`.
Copié !
1%mend mp_cntlout;
L'Astuce Pro
La création de la variable fmtrow associée à l'alignement décimal via mp_aligndecimal est indispensable pour garantir l'intégrité de vos formats numériques lors d'une future opération CNTLIN. Sans ce marqueur de ligne explicite, un tri standard sur les colonnes START ou END (stockées en caractères dans un dataset CNTLOUT) échouerait à cause de l'ordre lexicographique, provoquant des chevauchements de plages ou des erreurs de chargement. L'utilisation de mf_getuniquename assure par ailleurs que vos tables de travail ne s'écrasent jamais entre elles en environnement multi-utilisateurs.
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.