Publicado el :
Macro CREATION_INTERNE

Generación de Nombre de Archivo Temporal

Este código también está disponible en: Deutsch English Français
Esta macro genera una ruta de archivo única combinando un prefijo, una cadena aleatoria basada en el hash (CRC32 del ID de trabajo, ID de proceso, tiempo, aleatorio) y una extensión opcional. Si no se proporciona ninguna ruta, utiliza la ruta física de la biblioteca WORK. El resultado se devuelve en una macro-variable de llamada. Incluye una gestión del estado de errores (SYSCC) para no contaminar el registro en caso de ejecución interna exitosa.
Análisis de datos

Type : CREATION_INTERNE


El procesamiento se realiza mediante un paso DATA _NULL_ que manipula cadenas de caracteres y funciones del sistema para generar el nombre del archivo.

1 Bloque de código
Macro Definition
Explicación :
Inicialización de la macro: declaración de variables locales, llamada a una macro de depuración interna y guardado del estado actual de los errores del sistema (SYSCC, SYSMSG) para aislar la ejecución de la macro.
¡Copiado!
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 Bloque de código
DATA STEP
Explicación :
Núcleo de la lógica: determina el directorio raíz (parámetro o WORK), genera una cadena aleatoria única (basada en el hash de información del sistema), añade la extensión y construye la ruta completa. El resultado se almacena en la macro-variable de retorno a través de CALL SYMPUT.
¡Copiado!
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 Bloque de código
Macro Cleanup
Explicación :
Restaura el estado de los códigos de error del sistema (SYSCC) tal como estaba antes de la ejecución de la macro, asegurando que la macro no borre los errores anteriores.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.