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.
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!
proc sort data=Inventory; by partNumber; run;
proc sort data=InventoryAdd; by partNumber; run;
proc print data=Inventory; title "Inventory"; run;
proc print data=InventoryAdd; title "InventoryAdd"; run;
1
PROC SORTDATA=Inventory; BY partNumber; RUN;
2
PROC SORTDATA=InventoryAdd; BY partNumber; RUN;
3
PROC PRINTDATA=Inventory; title "Inventory"; RUN;
4
PROC PRINTDATA=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!
data Inventory;
modify Inventory InventoryAdd;
by partNumber;
select (_iorc_);
/*** The observation exists in the master data set */
when (%sysrc(_sok))do;
stock = stock + newStock;
price=newPrice;
receivedDate = today();
replace;
end;
/*** The observation does not exist in the master data set*/
when (%sysrc(_dsenmr)) do;
stock=newStock;
price=newPrice;
receivedDate=today();
output;
_error_=0;
end;
otherwise do;
put "An unexpected I/O error has occurred."
_error_ = 0;
stop;
end;
end;
run;
proc sort data=Inventory;
by partNumber;
run;
proc print data=Inventory;
title "Modified Inventory Data Set Sorted by partNumber";
run;
quit;
1
DATA 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;
26
RUN;
27
PROC SORTDATA=Inventory;
28
BY partNumber;
29
RUN;
30
PROC PRINTDATA=Inventory;
31
title "Modified Inventory Data Set Sorted by partNumber";
32
RUN;
33
QUIT;
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.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.