La documentation explique l'utilisation de l'instruction `MODIFY` pour gérer les mises à jour d'un inventaire. Elle détaille comment le `DATA Step` interagit avec les jeux de données `Inventory` (principal) et `InventoryAdd` (transactions). En utilisant la variable automatique `_IORC_` avec la macro `%SYSRC`, le code distingue les observations existantes (`_SOK`) des nouvelles (`_DSENMR`). Pour les observations existantes, l'instruction `REPLACE` met à jour les quantités en stock et les prix. Pour les nouvelles observations, l'instruction `OUTPUT` les ajoute au jeu de données principal. La flexibilité de `MODIFY` est mise en avant pour sa capacité à modifier un jeu de données sans en créer un nouveau, tout en nécessitant une gestion explicite des actions (REPLACE ou OUTPUT) en cas d'utilisation de ces instructions.
Analyse des données
Type : CREATION_INTERNE
Les exemples utilisent des données générées (datalines) pour créer les jeux de données 'Inventory' et 'InventoryAdd'.
1 Bloc de code
DATA Step Data
Explication : Ce bloc de code crée les deux jeux de données nécessaires à l'exemple :
- `Inventory` : Le jeu de données principal représentant l'inventaire actuel d'un entrepôt. Il contient des informations sur le numéro de pièce, le nom, le stock, le prix et la date de réception.
- `InventoryAdd` : Le jeu de données de transaction contenant les mises à jour. Il inclut de nouvelles pièces à ajouter, des ajustements de stock (`newStock`) et des modifications de prix (`newPrice`) pour les articles existants ou nouveaux. Les dates sont lues avec un informat spécifique.
Explication : Ces étapes trient les deux jeux de données par `partNumber` pour faciliter l'appariement et la visualisation des changements. `PROC PRINT` est ensuite utilisée pour afficher le contenu initial des jeux de données `Inventory` et `InventoryAdd` avant toute modification, permettant une comparaison claire des résultats après l'opération de `MODIFY`.
Copié !
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 Bloc de code
DATA Step (MODIFY)
Explication : Ce bloc de code utilise l'instruction `MODIFY` pour mettre à jour le jeu de données `Inventory` en fonction des informations du jeu de données `InventoryAdd`. L'instruction `BY partNumber` assure l'appariement des observations. La clause `SELECT (_IORC_)` gère deux scénarios :
1. Si une observation correspondante est trouvée (`%SYSRC(_SOK)`), les valeurs de `stock`, `price` et `receivedDate` sont mises à jour, puis `REPLACE` écrit l'observation modifiée. Les `receivedDate` est mise à jour car même si c'est un article existant, un nouveau stock a été reçu.
2. Si aucune observation correspondante n'est trouvée (`%SYSRC(_DSENMR)`), une nouvelle observation est créée avec les valeurs de `InventoryAdd`, et `OUTPUT` l'ajoute au jeu de données `Inventory`. `_ERROR_=0` est utilisé pour supprimer les messages d'erreur du log pour les nouvelles observations.
Un bloc `OTHERWISE` est inclus pour gérer les erreurs d'E/S inattendues. Enfin, le jeu de données `Inventory` est trié et affiché pour montrer les modifications.
Copié !
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;
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.
« Utilisez toujours MODIFY avec un index sur votre jeu de données principal (clé ID ou Code_Produit). Cela permet à SAS d'accéder instantanément à la ligne concernée sans parcourir toute la table, rendant vos mises à jour d'inventaire quasi instantanées. »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.