?>Array ( [lang] => es [id] => 90 ) Manejo de Conflictos y Orden de Búsqueda de Formatos - WeAreCAS
sessionProp addFmtLib

Manejo de Conflictos y Orden de Búsqueda de Formatos

Scénario de test & Cas d'usage

Contexto empresarial

En un entorno de desarrollo colaborativo, varios equipos pueden crear versiones diferentes de bibliotecas de formatos. Este escenario prueba la robustez de `addFmtLib` al manejar conflictos de nombres y la correcta aplicación del orden de búsqueda (`fmtSearch`). El objetivo es simular una situación donde una biblioteca de formatos existente debe ser actualizada y donde dos bibliotecas con definiciones conflictivas deben coexistir, resolviendo la ambigüedad mediante el orden de búsqueda.
Preparación de datos

Se crean dos tablas de control, `formatos_v1` y `formatos_v2`, que definen un formato `StatusFmt` con etiquetas diferentes para el mismo valor ('A'). También se crea una tabla de datos `proyectos` para probar los formatos.

¡Copiado!
1DATA formatos_v1;
2 LENGTH FmtName $12 Start $1 Label $20;
3 FmtName='StatusFmt'; Start='A'; Label='Activo (Versión 1)'; OUTPUT;
4 FmtName='StatusFmt'; Start='I'; Label='Inactivo'; OUTPUT;
5RUN;
6 
7DATA formatos_v2;
8 LENGTH FmtName $12 Start $1 Label $20;
9 FmtName='StatusFmt'; Start='A'; Label='Aprobado (Versión 2)'; OUTPUT;
10 FmtName='StatusFmt'; Start='P'; Label='Pendiente'; OUTPUT;
11RUN;
12 
13DATA proyectos;
14 INPUT proyecto_id $ STATUS $;
15 DATALINES;
16PROJ1 A
17PROJ2 I
18PROJ3 P
19;
20RUN;

Étapes de réalisation

1
Cargar todas las tablas de datos y control en CAS.
¡Copiado!
1PROC CAS;
2 TABLE.loadTable / caslib='CASUSER' path='%sysfunc(pathname(work))/proyectos.sashdat' casout={name='PROYECTOS', replace=true};
3 TABLE.loadTable / caslib='CASUSER' path='%sysfunc(pathname(work))/formatos_v1.sashdat' casout={name='FORMATOS_V1', replace=true};
4 TABLE.loadTable / caslib='CASUSER' path='%sysfunc(pathname(work))/formatos_v2.sashdat' casout={name='FORMATOS_V2', replace=true};
5QUIT;
2
Cargar la V1. Luego, intentar cargar la V2 con el mismo nombre de biblioteca ('MiFmtLib') sin `replace=true`. Se espera un error.
¡Copiado!
1PROC CAS;
2 sessionprop.addFmtLib / fmtLibName='MiFmtLib' name='FORMATOS_V1' caslib='CASUSER';
3 /* La siguiente línea debe fallar con un error indicando que la biblioteca ya existe */
4 sessionprop.addFmtLib / fmtLibName='MiFmtLib' name='FORMATOS_V2' caslib='CASUSER' STATUS=rc;
5QUIT;
3
Cargar la V2 con el mismo nombre usando `replace=true` y verificar que el formato ha sido actualizado.
¡Copiado!
1PROC CAS;
2 sessionprop.addFmtLib / fmtLibName='MiFmtLib' name='FORMATOS_V2' caslib='CASUSER' replace=true;
3 TABLE.setTableFmtLib / TABLE={caslib='CASUSER', name='PROYECTOS'} fmtLibName='MiFmtLib';
4 SIMPLE.freq / TABLE={name='PROYECTOS', caslib='CASUSER'} inputs={{name='status', FORMAT='StatusFmt'}};
5QUIT;
4
Cargar V1 como 'FmtLib_V1' y V2 como 'FmtLib_V2'. Luego, usar `fmtSearch='INSERT'` para añadir 'FmtLib_V1' al principio del orden de búsqueda y verificar que su definición de formato tiene prioridad.
¡Copiado!
1PROC CAS;
2 sessionprop.addFmtLib / fmtLibName='FmtLib_V2' name='FORMATOS_V2' caslib='CASUSER' replace=true; /* V2 es la primera en el orden de búsqueda */
3 sessionprop.addFmtLib / fmtLibName='FmtLib_V1' name='FORMATOS_V1' caslib='CASUSER' replace=true fmtSearch='INSERT'; /* V1 se inserta al principio */
4 SIMPLE.freq / TABLE={name='PROYECTOS', caslib='CASUSER'} inputs={{name='status', FORMAT='StatusFmt'}};
5QUIT;

Resultado esperado


En el paso 2, la segunda acción `addFmtLib` debe fallar. En el paso 3, la salida de `freq` debe mostrar la etiqueta 'Aprobado (Versión 2)' para el estado 'A', confirmando que `replace=true` funcionó. En el paso 4, la salida de `freq` debe mostrar la etiqueta 'Activo (Versión 1)' para el estado 'A', demostrando que `fmtSearch='INSERT'` colocó 'FmtLib_V1' al principio del orden de búsqueda y su definición de formato tuvo precedencia sobre la de 'FmtLib_V2'.