Comment puis-je transformer ce code en macro?
Je voudrais donc faire un code macro mélangé avec proc sql et data step. J'ai le code suivant en SAS:
data work.calendar;
set work.calendar;
if business_day_count^=-1 then do;
num_seq + 1;
drop num_seq;
business_day_count = num_seq;
end;
else
business_day_count = -1;
run;
J'aimerais le mettre dans du code macro, mais cela ne fonctionne pas.
Mon code macro:
%macro1();
data work.job_calendar;
set work.job_calendar;
%if business_day_count^=-1 %then %do;
num_seq + 1;
drop num_seq;
business_day_count = num_seq;
%end;
else
business_day_count = -1;
run;
%mend;
Le code entier est:
%macro update_day(date);
proc sql;
update work.job_calendar
set business_day_count =
case when datepart(calendar_date) = "&date"d then -1
else business_day_count
end;
quit;
proc sql;
update work.job_calendar
set status_ind =
case when business_day_count = -1 then 'N'
else status_ind
end;
quit;
proc sql;
update work.job_calendar
set rundate_ind =
case when business_day_count = -1 then 'N'
else status_ind
end;
quit;
proc sql;
update work.job_calendar
set daily_rundate_ind =
case when business_day_count = -1 then 'N'
else status_ind
end;
quit;
proc sql;
update work.job_calendar
set weekly_rundate_ind =
case when business_day_count = -1 then 'N'
else status_ind
end;
quit;
proc sql;
update work.job_calendar
set monthly_rundate_ind =
case when business_day_count = -1 then 'N'
else status_ind
end;
quit;
data work.job_calendar;
set work.job_calendar;
if business_day_count^=-1 then do;
num_seq + 1;
drop num_seq;
business_day_count = num_seq;
end;
else
business_day_count = -1;
%mend;
Le code d'erreur est: ERROR 180 - 322 L'instruction n'est pas valide ou elle est utilisée dans le mauvais ordre. Je ne sais pas ce que je fais de mal.
Réponses
Vous mélangez une étape de données et un code macro. Je ne sais pas ce que vous essayez de réaliser, donc aucune idée de ce qu'il faut proposer mais la suppression du% IF /% THEN permettra à votre code de fonctionner.
%macro1();
data work.job_calendar;
set work.job_calendar;
if business_day_count^=-1 then do;
num_seq + 1;
drop num_seq;
business_day_count = num_seq;
end;
else
business_day_count = -1;
run;
%mend;
%macro1;
Voici un tutoriel sur la conversion du code de travail en macro et un sur la programmation globale des macros .
Pour définir une macro, vous devez utiliser l'instruction% MACRO. Aussi pourquoi avez-vous changé les lignes 3 et 7 des instructions de données en instructions de macro?
Ce code ne peut pas fonctionner. Tout d'abord,% IF est toujours vrai puisque la chaîne business_day_countne correspondra jamais à la chaîne -1. Deuxièmement, vous avez une elsedéclaration sans aucune ifdéclaration précédente .
Essayez plutôt quelque chose comme ça.
%macro macro1();
data work.job_calendar;
set work.job_calendar;
if business_day_count^=-1 then do;
num_seq + 1;
drop num_seq;
business_day_count = num_seq;
end;
else business_day_count = -1;
run;
%mend macro1;