Publié le :
Débogage CREATION_INTERNE

Exemples de débogage d'erreurs dans le DATA step SAS

Ce code est également disponible en : Deutsch English Español Français
Snippet validé
Analyse fonctionnelle détaillée expliquant les concepts clés : Comment le SAS© DATA step peut être interrompu par des conditions inattendues lors de l'utilisation d'instructions MODIFY avec l'option KEY=. Les exemples démontrent l'importance de la vérification des erreurs en utilisant la variable automatique _IORC_ et la macro SYSRC() au sein des groupes SELECT pour acheminer l'exécution du programme en fonction du code de retour. Cela permet de gérer des situations telles que l'absence de correspondance de clé (pour ajouter de nouvelles observations) ou d'autres erreurs inattendues, garantissant ainsi l'achèvement normal de l'étape DATA et la production de résultats corrects. Il est également illustré comment SAS© peut signaler plusieurs erreurs pour une seule instruction dans le journal.
Analyse des données

Type : CREATION_INTERNE


Les exemples utilisent des données générées (datalines) pour les tables 'Master', 'Transaction', 'Order' et 'Description'.

1 Bloc de code
DATA STEP Data
Explication :
Ce premier exemple illustre comment éviter qu'une condition inattendue ne termine prématurément une étape DATA. L'objectif est de mettre à jour un ensemble de données principal (Master) avec des informations provenant d'un ensemble de données de transactions (Transaction). La première tentative de code échoue si une valeur de 'PartNumber' de 'Transaction' n'est pas trouvée dans 'Master'. La version révisée introduit une gestion d'erreurs robuste à l'aide de SELECT(_IORC_). Si une correspondance est trouvée (%sysrc(_sok)), la quantité est mise à jour et l'enregistrement est remplacé. Si aucune correspondance n'est trouvée (%sysrc(_dsenom)), une nouvelle observation est créée avec la 'AddQuantity' et '_error_' est réinitialisé. Toute autre condition inattendue entraîne l'arrêt du programme avec des messages d'erreur détaillés.
Copié !
1DATA Master;
2 INPUT PartNumber Quantity;
3 DATALINES;
41 10
52 20
63 30
74 40
85 50
9;
10RUN;
11 
12DATA Transaction;
13 INPUT PartNumber AddQuantity;
14 DATALINES;
154 14
166 16
172 12
18;
19RUN;
20 
21PROC SORT DATA=Master;
22 BY PartNumber;
23RUN;
24PROC DATASETS library=work;
25 modify Master;
26 index create PartNumber;
27QUIT;
28 
29/* Programme initial avec erreur */
30DATA master;
31 SET transaction;
32 modify master key=PartNumber;
33 Quantity = Quantity + AddQuantity;
34RUN;
35 
36/* Programme révisé avec gestion d'erreurs */
37DATA master;
38 SET transaction;
39 modify master key=PartNumber;
40 
41select(_iorc_);
42 when(%sysrc(_sok)) DO;
43 Quantity = Quantity + AddQuantity;
44 replace;
45 END;
46 when(%sysrc(_dsenom)) DO;
47 Quantity = AddQuantity;
48 _error_ = 0;
49 OUTPUT;
50 END;
51 otherwise DO;
52 put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
53 put 'Program terminating. DATA step iteration # ' _n_;
54 put _all_;
55 stop;
56 END;
57 END;
58RUN;
2 Bloc de code
DATA STEP Data
Explication :
Cet exemple souligne l'importance d'une vérification d'erreurs complète pour toutes les instructions SET utilisant l'option KEY=. Le programme original, bien qu'il utilise KEY= pour deux jeux de données (Description et Master), n'applique la logique de gestion d'erreurs (via SELECT(_IORC_)) qu'à la dernière instruction SET. Cela entraîne des erreurs logiques où des données incorrectes sont produites ou des observations manquent. Le programme révisé corrige cela en introduisant une variable 'Foundes' pour suivre les correspondances avec 'Description' et en utilisant des blocs SELECT séparés et appropriés après chaque instruction SET KEY=. Cela garantit que chaque cas (correspondance trouvée, correspondance non trouvée nécessitant une action spécifique) est géré correctement, produisant ainsi un jeu de données de sortie précis.
Copié !
1DATA Master;
2 INPUT PartNumber Quantity;
3 DATALINES;
41 10
52 20
63 30
74 40
85 50
9;
10RUN;
11 
12DATA Order;
13 INPUT PartNumber;
14 DATALINES;
152
164
171
183
198
205
216
22;
23RUN;
24 
25DATA Description;
26 INPUT PartNumber $ PartDescription;
27 DATALINES;
284 Nuts
293 Bolts
302 Screws
316 Washers
32;
33RUN;
34 
35PROC SORT DATA=Master;
36 BY PartNumber;
37RUN;
38PROC DATASETS library=work;
39 modify Master;
40 index create PartNumber;
41QUIT;
42 
43PROC SORT DATA=Order;
44 BY PartNumber;
45RUN;
46 
47PROC SORT DATA=Description;
48 BY PartNumber;
49RUN;
50PROC DATASETS library=work;
51 modify Description;
52 index create PartNumber;
53QUIT;
54 
55/* Programme original avec erreur logique */
56DATA combine;
57 LENGTH PartDescription $ 15;
58 SET order;
59 SET description key=PartNumber;
60 SET master key=PartNumber;
61 select(_iorc_);
62 when(%sysrc(_sok)) DO;
63 OUTPUT;
64 END;
65 when(%sysrc(_dsenom)) DO;
66 PartDescription = 'No description';
67 _error_ = 0;
68 OUTPUT;
69 END;
70 otherwise DO;
71 put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
72 put 'Program terminating.';
73 put _all_;
74 stop;
75 END;
76 END;
77RUN;
78 
79/* Programme révisé */
80DATA combine(drop=Foundes);
81 LENGTH PartDescription $ 15;
82 SET order;
83 Foundes = 0;
84 SET description key=PartNumber;
85 select(_iorc_);
86 when(%sysrc(_sok)) DO;
87 Foundes = 1;
88 END;
89 when(%sysrc(_dsenom)) DO;
90 PartDescription = 'No description';
91 _error_ = 0;
92 END;
93 otherwise DO;
94 put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
95 put 'Program terminating. Data set accessed is Description';
96 put _all_;
97 _error_ = 0;
98 stop;
99 END;
100 END;
101SET master key=PartNumber;
102select(_iorc_);
103 when(%sysrc(_sok)) DO;
104 OUTPUT;
105 END;
106 when(%sysrc(_dsenom)) DO;
107 IF not Foundes THEN DO;
108 _error_ = 0;
109 put 'WARNING: PartNumber ' PartNumber 'is not in'
110 ' Description or Master.';
111 END;
112 ELSE DO;
113 Quantity = 0;
114 _error_ = 0;
115 OUTPUT;
116 END;
117 END;
118 otherwise DO;
119 put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
120 put 'Program terminating. Data set accessed is Master';
121 put _all_;
122 _error_ = 0;
123 stop;
124 END;
125 END;
126RUN;
3 Bloc de code
DATA STEP / PROC PRINT Data
Explication :
Ce court exemple démontre comment SAS gère la détection de multiples erreurs au sein d'une même étape de programme. L'étape DATA crée un jeu de données 'temporary' avec une seule variable 'Item1'. L'étape PROC PRINT tente ensuite d'afficher les variables 'Item1', 'Item2' et 'Item3'. Comme 'Item2' et 'Item3' n'existent pas dans le jeu de données 'temporary', SAS génère deux messages d'erreur distincts dans le journal pour chaque variable non trouvée, mais continue le traitement jusqu'à la fin de la PROC PRINT, illustrant la capacité de SAS à signaler plusieurs problèmes avant d'arrêter l'exécution de l'étape.
Copié !
1DATA temporary;
2 Item1=4;
3RUN;
4 
5PROC PRINT DATA=temporary;
6 var Item1 Item2 Item3;
7RUN;
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.
Informations de Copyright : Copyright © SAS Institute Inc. All Rights Reserved


Documentation liée : Débogage

Sujet / Mot-cléLien vers la ressource
DOC Erreurs liées aux macros fr/sampleCode/ERREUR6CA6
DOC Définitions des types d'erreurs dans SAS fr/sampleCode/DEFINI9A72
Banner
Le Conseil de l'Expert
Expert
Michael
Responsable de l'infrastructure Viya.
« Un bon développeur écrit du code qui fonctionne ; un expert écrit du code qui sait quoi faire quand rien ne se passe comme prévu »