Publié le :

uListMac: Lister les macros autocall pour vérifier les doublons

En attente de validation
Attention : Ce code nécessite des droits administrateur.
Ce programme parcourt les chemins définis dans la configuration SASAUTOS. Pour chaque chemin, il liste les fichiers `.sas©` (correspondant aux macros autocall), puis combine toutes les listes. Finalement, il identifie et signale les macros ayant le même nom mais se trouvant dans des chemins différents, ce qui pourrait causer des conflits d'exécution. L'outil utilise des fonctions de bas niveau (`dopen`, `dread`) pour lire le contenu des répertoires et la génération de code dynamique (`CALL EXECUTE`) pour construire le jeu de données final.
Analyse des données

Type : MIXTE


Le script utilise la vue système `SASHELP.VEXTFL` pour obtenir la liste des chemins associés au fileref `SASAUTOS`. Ensuite, il lit le contenu de ces répertoires sur le système de fichiers pour lister les programmes de macros.

1 Bloc de code
Macro Data
Explication :
Cette macro, `MEMLIST`, prend en entrée des parties de nom de répertoire et un chemin complet (`XPATH`). Elle utilise les fonctions `filename`, `dopen`, `dread` et `dclose` pour lire la liste des fichiers d'un répertoire. Pour chaque fichier avec une extension `.sas`, elle extrait le nom du fichier et le stocke dans une table SAS. Enfin, `PROC SORT` avec l'option `nodups` supprime les doublons de noms de fichiers au sein de ce même répertoire.
Copié !
1%MACRO MEMLIST(DIR1,DIR2,XPATH);
2%*get list of members in directory;
3DATA &DIR1._&DIR2.(keep = Dir1 Dir2 FileName);
4LENGTH Dir1 Dir2 FileName $ 8;
5retain Dir1 "&DIR1."
6 Dir2 "&DIR2.";
7Rc = filename('dir', "&XPATH.");
8DsId = dopen('dir');
9IF DsId THEN DO; dim_DS=dnum(DsId);
10 DO MemNum = 1 to dim_DS; MemName = lowcase(dread(DsId, MemNum));
11 
12 *put memname=;
13 IF scan(MemName,-1,'.') eq 'sas' THEN DO;
14 FileName=scan(MemName,-2,'.\');
15 OUTPUT;
16 %*IF scan; END;
17 %*DO memnum; END;
18 %*IF DsId; END;
19Rc=dclose(DsId);
20RUN;
21 
22%*user names may be in upper & lower case
23 SI macros are all lower case
24 note FileName has been lowcased;
25PROC SORT DATA = &DIR1._&DIR2.
26 nodups;
27 BY FileName;
28RUN;%*.........................................; %MEND;
2 Bloc de code
DATA STEP Data
Explication :
Ce bloc DATA STEP lit la vue système `SASHELP.VEXTFL` pour trouver toutes les assignations de librairies externes. Il filtre ces résultats pour ne garder que le fileref `SASAUTOS`, qui définit les chemins des librairies de macros autocall. Pour chaque chemin trouvé, il utilise `CALL EXECUTE` pour générer et exécuter un appel à la macro `%MEMLIST`, qui va lister le contenu du répertoire correspondant.
Copié !
1DATA DSN(keep = Dir1 Dir2);
2LENGTH Dir1 Dir2 $ 8;
3SET SASHELP.VEXTFL
4 (where=(FileRef eq 'SASAUTOS'));
5DIR2= scan(trim(xPath),-1,'\');%*trim is a kludge;
6DIR1= scan(trim(xPath),-2,'\');
7call execute('%MEMLIST(' !! Dir1
8 !! ','!! Dir2
9 !! ','!! xPath
10 !! ');');
3 Bloc de code
DATA STEP
Explication :
Ce DATA STEP `_NULL_` est utilisé pour générer dynamiquement un autre programme SAS. Il construit une étape DATA qui concatène toutes les tables créées précédemment par les appels à `%MEMLIST`. Il ajoute une clause `BY` pour trier par nom de fichier, et une logique pour créer une variable `Note` contenant le texte 'duplicate' si un même nom de fichier (`FileName`) apparaît dans plus d'un répertoire.
Copié !
1DATA _NULL_;
2call execute('data ALL;set');
3DO until(EndoFile);
4 SET DSN END = EndoFile;
5 call execute( trim(Dir1) !! '_' !! Dir2 ); END;
6call execute('; by FileName Dir1 Dir2;');
7call execute(
8"if not(first.FileName and last.FileName) then Note='duplicate';");
9stop;
4 Bloc de code
PROC PRINT
Explication :
Cette procédure affiche le contenu de la table `ALL` qui a été créée dynamiquement à l'étape précédente. Le rapport final liste tous les fichiers de macros et met en évidence les doublons potentiels.
Copié !
1PROC PRINT DATA = ALL;
2RUN;
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 : Auteur: RJF2, Date: 00Sep11