Publicado el :
ETL CREATION_INTERNE

Ejemplo: Modificar datos en un conjunto de datos SAS

Este código también está disponible en: Deutsch English Français
En espera de validación
La documentación explica el uso de la instrucción `MODIFY` para gestionar las actualizaciones de un inventario. Detalla cómo el `DATA Step` interactúa con los conjuntos de datos `Inventory` (principal) e `InventoryAdd` (transacciones). Usando la variable automática `_IORC_` con la macro `%SYSRC`, el código distingue las observaciones existentes (`_SOK`) de las nuevas (`_DSENMR`). Para las observaciones existentes, la instrucción `REPLACE` actualiza las cantidades en stock y los precios. Para las nuevas observaciones, la instrucción `OUTPUT` las añade al conjunto de datos principal. La flexibilidad de `MODIFY` se destaca por su capacidad de modificar un conjunto de datos sin crear uno nuevo, requiriendo una gestión explícita de las acciones (REPLACE u OUTPUT) en caso de usar estas instrucciones.
Análisis de datos

Type : CREATION_INTERNE


Los ejemplos utilizan datos generados (datalines) para crear los conjuntos de datos 'Inventory' e 'InventoryAdd'.

1 Bloque de código
DATA Step Data
Explicación :
Este bloque de código crea los dos conjuntos de datos necesarios para el ejemplo:
- `Inventory`: El conjunto de datos principal que representa el inventario actual de un almacén. Contiene información sobre el número de pieza, nombre, stock, precio y fecha de recepción.
- `InventoryAdd`: El conjunto de datos de transacciones que contiene las actualizaciones. Incluye nuevas piezas para añadir, ajustes de stock (`newStock`) y modificaciones de precio (`newPrice`) para artículos existentes o nuevos. Las fechas se leen con un formato específico.
¡Copiado!
1DATA Inventory;
2 informat receivedDate date9.;
3 INPUT partNumber $ partName $ stock price receivedDate;
4 DATALINES;
5K89R seal 34 245.00 07jul2015
6M4J7 sander 98 45.88 20jun2015
7LK43 filter 121 10.99 19may2016
8MN21 brace 43 27.87 10aug2016
9BC85 clamp 80 9.55 16aug2016
10NCF3 valve 198 24.50 20mar2016
11KJ66 cutter 6 19.77 18jun2016
12UYN7 rod 211 11.55 09sep2016
13JD03 switch 383 13.99 09jan2017
14BV1E timer 26 34.50 03aug2017
15;
16RUN;
17 
18DATA InventoryAdd;
19 INPUT partNumber $ partName $ newStock newPrice;
20 DATALINES;
21AA11 hammer 55 32.26
22BB22 wrench 21 17.35
23BV1E timer 30 36.50
24CC33 socket 7 22.19
25K89R seal 6 247.50
26KJ66 cutter 10 24.50
27;
28RUN;
2 Bloque de código
PROC SORT / PROC PRINT
Explicación :
Estos pasos ordenan ambos conjuntos de datos por `partNumber` para facilitar el emparejamiento y la visualización de los cambios. Luego se usa `PROC PRINT` para mostrar el contenido inicial de los conjuntos de datos `Inventory` e `InventoryAdd` antes de cualquier modificación, permitiendo una clara comparación de los resultados después de la operación `MODIFY`.
¡Copiado!
1PROC SORT DATA=Inventory; BY partNumber; RUN;
2PROC SORT DATA=InventoryAdd; BY partNumber; RUN;
3PROC PRINT DATA=Inventory; title "Inventory"; RUN;
4PROC PRINT DATA=InventoryAdd; title "InventoryAdd"; RUN;
3 Bloque de código
DATA Step (MODIFY)
Explicación :
Este bloque de código utiliza la instrucción `MODIFY` para actualizar el conjunto de datos `Inventory` basándose en la información del conjunto de datos `InventoryAdd`. La instrucción `BY partNumber` asegura el emparejamiento de las observaciones. La cláusula `SELECT (_IORC_)` maneja dos escenarios:
1. Si se encuentra una observación coincidente (`%SYSRC(_SOK)`), los valores de `stock`, `price` y `receivedDate` se actualizan, y luego `REPLACE` escribe la observación modificada. `receivedDate` se actualiza porque, incluso si es un artículo existente, se ha recibido nuevo stock.
2. Si no se encuentra una observación coincidente (`%SYSRC(_DSENMR)`), se crea una nueva observación con los valores de `InventoryAdd`, y `OUTPUT` la añade al conjunto de datos `Inventory`. Se utiliza `_ERROR_=0` para suprimir los mensajes de error del registro para las nuevas observaciones.
Se incluye un bloque `OTHERWISE` para manejar errores de E/S inesperados. Finalmente, el conjunto de datos `Inventory` se ordena y se muestra para evidenciar las modificaciones.
¡Copiado!
1DATA Inventory;
2 modify Inventory InventoryAdd;
3 BY partNumber;
4 select (_iorc_);
5 /*** The observation exists in the master data set */
6 when (%sysrc(_sok))DO;
7 stock = stock + newStock;
8 price=newPrice;
9 receivedDate = today();
10 replace;
11 END;
12 /*** The observation does not exist in the master data set*/
13 when (%sysrc(_dsenmr)) DO;
14 stock=newStock;
15 price=newPrice;
16 receivedDate=today();
17 OUTPUT;
18 _error_=0;
19 END;
20 otherwise DO;
21 put "An unexpected I/O error has occurred."
22 _error_ = 0;
23 stop;
24 END;
25 END;
26RUN;
27PROC SORT DATA=Inventory;
28 BY partNumber;
29RUN;
30PROC PRINT DATA=Inventory;
31 title "Modified Inventory Data Set Sorted by partNumber";
32RUN;
33QUIT;
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.