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é !
data Master;
input PartNumber Quantity;
datalines;
1 10
2 20
3 30
4 40
5 50
;
run;
data Transaction;
input PartNumber AddQuantity;
datalines;
4 14
6 16
2 12
;
run;
proc sort data=Master;
by PartNumber;
run;
proc datasets library=work;
modify Master;
index create PartNumber;
quit;
/* Programme initial avec erreur */
data master;
set transaction;
modify master key=PartNumber;
Quantity = Quantity + AddQuantity;
run;
/* Programme révisé avec gestion d'erreurs */
data master;
set transaction;
modify master key=PartNumber;
select(_iorc_);
when(%sysrc(_sok)) do;
Quantity = Quantity + AddQuantity;
replace;
end;
when(%sysrc(_dsenom)) do;
Quantity = AddQuantity;
_error_ = 0;
output;
end;
otherwise do;
put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
put 'Program terminating. DATA step iteration # ' _n_;
put _all_;
stop;
end;
end;
run;
1
DATA Master;
2
INPUT PartNumber Quantity;
3
DATALINES;
4
110
5
220
6
330
7
440
8
550
9
;
10
RUN;
11
12
DATA Transaction;
13
INPUT PartNumber AddQuantity;
14
DATALINES;
15
414
16
616
17
212
18
;
19
RUN;
20
21
PROC SORTDATA=Master;
22
BY PartNumber;
23
RUN;
24
PROC DATASETS library=work;
25
modify Master;
26
index create PartNumber;
27
QUIT;
28
29
/* Programme initial avec erreur */
30
DATA master;
31
SET transaction;
32
modify master key=PartNumber;
33
Quantity = Quantity + AddQuantity;
34
RUN;
35
36
/* Programme révisé avec gestion d'erreurs */
37
DATA master;
38
SET transaction;
39
modify master key=PartNumber;
40
41
select(_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;
58
RUN;
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é !
data Master;
input PartNumber Quantity;
datalines;
1 10
2 20
3 30
4 40
5 50
;
run;
data Order;
input PartNumber;
datalines;
2
4
1
3
8
5
6
;
run;
data Description;
input PartNumber $ PartDescription;
datalines;
4 Nuts
3 Bolts
2 Screws
6 Washers
;
run;
proc sort data=Master;
by PartNumber;
run;
proc datasets library=work;
modify Master;
index create PartNumber;
quit;
proc sort data=Order;
by PartNumber;
run;
proc sort data=Description;
by PartNumber;
run;
proc datasets library=work;
modify Description;
index create PartNumber;
quit;
/* Programme original avec erreur logique */
data combine;
length PartDescription $ 15;
set order;
set description key=PartNumber;
set master key=PartNumber;
select(_iorc_);
when(%sysrc(_sok)) do;
output;
end;
when(%sysrc(_dsenom)) do;
PartDescription = 'No description';
_error_ = 0;
output;
end;
otherwise do;
put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
put 'Program terminating.';
put _all_;
stop;
end;
end;
run;
/* Programme révisé */
data combine(drop=Foundes);
length PartDescription $ 15;
set order;
Foundes = 0;
set description key=PartNumber;
select(_iorc_);
when(%sysrc(_sok)) do;
Foundes = 1;
end;
when(%sysrc(_dsenom)) do;
PartDescription = 'No description';
_error_ = 0;
end;
otherwise do;
put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
put 'Program terminating. Data set accessed is Description';
put _all_;
_error_ = 0;
stop;
end;
end;
set master key=PartNumber;
select(_iorc_);
when(%sysrc(_sok)) do;
output;
end;
when(%sysrc(_dsenom)) do;
if not Foundes then do;
_error_ = 0;
put 'WARNING: PartNumber ' PartNumber 'is not in'
' Description or Master.';
end;
else do;
Quantity = 0;
_error_ = 0;
output;
end;
end;
otherwise do;
put 'ERROR: Unexpected value for _IORC_= ' _iorc_;
put 'Program terminating. Data set accessed is Master';
put _all_;
_error_ = 0;
stop;
end;
end;
run;
1
DATA Master;
2
INPUT PartNumber Quantity;
3
DATALINES;
4
110
5
220
6
330
7
440
8
550
9
;
10
RUN;
11
12
DATA Order;
13
INPUT PartNumber;
14
DATALINES;
15
2
16
4
17
1
18
3
19
8
20
5
21
6
22
;
23
RUN;
24
25
DATA Description;
26
INPUT PartNumber $ PartDescription;
27
DATALINES;
28
4 Nuts
29
3 Bolts
30
2 Screws
31
6 Washers
32
;
33
RUN;
34
35
PROC SORTDATA=Master;
36
BY PartNumber;
37
RUN;
38
PROC DATASETS library=work;
39
modify Master;
40
index create PartNumber;
41
QUIT;
42
43
PROC SORTDATA=Order;
44
BY PartNumber;
45
RUN;
46
47
PROC SORTDATA=Description;
48
BY PartNumber;
49
RUN;
50
PROC DATASETS library=work;
51
modify Description;
52
index create PartNumber;
53
QUIT;
54
55
/* Programme original avec erreur logique */
56
DATA 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;
77
RUN;
78
79
/* Programme révisé */
80
DATA 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;
101
SET master key=PartNumber;
102
select(_iorc_);
103
when(%sysrc(_sok)) DO;
104
OUTPUT;
105
END;
106
when(%sysrc(_dsenom)) DO;
107
IF not Foundes THENDO;
108
_error_ = 0;
109
put 'WARNING: PartNumber ' PartNumber 'is not in'
110
' Description or Master.';
111
END;
112
ELSEDO;
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;
126
RUN;
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é !
data temporary;
Item1=4;
run;
proc print data=temporary;
var Item1 Item2 Item3;
run;
1
DATA temporary;
2
Item1=4;
3
RUN;
4
5
PROC PRINTDATA=temporary;
6
var Item1 Item2 Item3;
7
RUN;
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.
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.