Publié le :
ETL CREATION_INTERNE

Exemple : Modifier des données dans un jeu de données SAS

Ce code est également disponible en : Deutsch English Español
En attente de validation
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.
Copié !
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 Bloc de code
PROC SORT / PROC PRINT
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é !
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 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é !
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;
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.
Banner
Le Conseil de l'Expert
Expert
Stéphanie
Spécialiste Machine Learning et IA.
« 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. »