Publié le :
Macro CREATION_INTERNE

Génération de Nom de Fichier Temporaire

Ce code est également disponible en : Deutsch English Español
Cette macro génère un chemin de fichier unique en combinant un préfixe, une chaîne aléatoire basée sur le hachage (CRC32 de l'ID de job, ID de processus, temps, aléatoire), et une extension optionnelle. Si aucun chemin n'est fourni, elle utilise le chemin physique de la bibliothèque WORK. Le résultat est renvoyé dans une macro-variable appelante. Elle inclut une gestion de l'état des erreurs (SYSCC) pour ne pas polluer le journal en cas d'exécution réussie interne.
Analyse des données

Type : CREATION_INTERNE


Le traitement est effectué via une étape DATA _NULL_ qui manipule des chaînes de caractères et des fonctions système pour générer le nom de fichier.

1 Bloc de code
Macro Definition
Explication :
Initialisation de la macro : déclaration des variables locales, appel à une macro de débogage interne, et sauvegarde de l'état actuel des erreurs système (SYSCC, SYSMSG) pour isoler l'exécution de la macro.
Copié !
1%macro cxtf_tempfile( prefix = __cxtf, path = , fileext = , return = );
2 
3 %local _cxtf_rc _cxtf_syscc _cxtf_sysmsg _cxtf_debug
4 _str
5 ;
6 
7 %* PRINT debug details ;
8 %_cxtf_debug();
9 
10 
11 %* -- capture entry state ;
12 %let _cxtf_syscc = 0;
13 %let _cxtf_sysmsg = ;
14 
15 %IF ( &syscc ^= 0 ) %THEN %DO;
16 %let _cxtf_syscc = &syscc;
17 %let _cxtf_sysmsg = &sysmsg;
18 
19 %let syscc = 0;
20 %let sysmsg = ;
21 
22 %END;
2 Bloc de code
DATA STEP
Explication :
Cœur de la logique : détermine le répertoire racine (paramètre ou WORK), génère une chaîne aléatoire unique (basée sur le hachage d'infos système), ajoute l'extension et construit le chemin complet. Le résultat est stocké dans la macro-variable de retour via CALL SYMPUT.
Copié !
1 DATA _null_ ;
2 
3 LENGTH root $ 4096
4 str $ 1024 ;
5 
6 %* -- identify parent path ;
7 %* note: IF not specified, using path of WORK library ;
8 root = symget('path');
9 
10 IF ( missing(root) ) THEN
11 root = pathname('WORK');
12 
13 
14 %* initililze with prefix ;
15 str = strip(symget('prefix'));
16 
17 
18 %* force first character to be A-Z-ish (thanks SAS) ;
19 IF missing(str) THEN
20 str = byte( mod( floor(100*rand("uniform")), 26) + rank("A") - 1 ) ;
21 
22 %* add random string ;
23 call cats( str, hashing( "crc32", catx( "-", symget('sysjobid'), symget('sysprocessid'), put( rand("uniform"), best32.), put( datetime(), datetime23.3) ) ) );
24 
25 
26 %* add file extension;
27 IF ( not missing( symget('fileext') ) ) THEN
28 call catx( '.', str, symget('fileext') );
29 
30 
31 %* assign OUTPUT value ;
32 call symput( symget('return'), translate( catx( "/", root, lowcase(str) ), "/", "\") );
33 
34 RUN;
3 Bloc de code
Macro Cleanup
Explication :
Restaure l'état des codes erreurs système (SYSCC) tel qu'il était avant l'exécution de la macro, assurant que la macro n'efface pas les erreurs précédentes.
Copié !
1 %* -- macro exit point ;
2 %macro_exit:
3 
4 
5 
6 %* -- restore entry state ;
7 %IF ( &_cxtf_syscc ^= 0 ) %THEN %DO;
8 %let syscc = &_cxtf_syscc;
9 %let sysmsg = &_cxtf_sysmsg;
10 %END;
11 
12 
13%mend;
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.