Запустите один шаг данных, установив для новых переменных значения, установленные в макропеременных.Если настройки значений носят символьный характер, переменные шага данных должны разрешать эти макропеременные в двойных кавычках.
data &new_data_set;
set &new_data_set;
retain
Nom_controle "&Nom_Controle"
Partenaire "&Partenaire"
;
* also works;
* Nom_controle = "&Nom_Controle";
* Partenaire = "&Partenaire";
run;
Примечание. Длина переменных нового набора данных будет равна длине значений, хранящихся вмакропеременные.
Набор данных представляет собой прямоугольник значений.Он будет иметь определенное количество строк и столбцов числовых и / или символьных типов.Оператор SET
на шаге DATA считывает одну строку значений столбца таблицы в вектор данных работающей программы, которые по сути являются переменными на шаге DATA.Шаг DATA зацикливается автоматически и останавливается автоматически при различных условиях, например, при чтении последней строки таблицы SET.
Я не знаю, почему у вас есть макрос цикла %DO I=1 %TO 10
.Я могу предположить, что вы думаете, что вам нужно сделать это, чтобы «обновить» 10 строк в & new_data_set.
Что это на самом деле делает?Запуск одного и того же кода 10 раз!Без макроса фактический запуск кода сродни следующему
data x; do r = 1 to 10; output; end; run; %* an original new_data_set;
data x; set x; z=1; run;
data x; set x; z=1; run;
data x; set x; z=1; run;
...
Еще одной проблемой является код, такой как
%if %sysfunc(length(&data_set_detail_mouvement))=29 %then %do; *Creation of a second variable (value conditionnal to the size of a previous variable);
%let Partenaire=%sysfunc(substr(&data_set_detail_mouvement, 9, 3)); %end;
Похоже, вы захватываете первые 3, 4 или 6-йбуквы имени набора данных из полностью определенного libname.dataset где libname предполагается равным sasuser
.Более безопасная и надежная версия может быть
%let syslast = &data_set_detail_mouvement;
%let libpart = %scan(&syslast,1,.);
%let datapart = %scan(&syslast,2,.);
… extract 3, 4, or 6 preface of datapart …
%* this might be helpful;
%let Partenaire = %scan(&datapart,1,_);