I am new to SAS. The requirement is to trigger a shell script based on the data load. If the data is present for the previous date, then trigger the shell script. Else wait for one hour, check the date again and then on a loop for four times. The first part of the code is a macro. This macro connects to the database, pulls in two values - Maximum date present and Current date -1. In a ideal scenario, both dates should be same. Like for today(27th Feb), both should be 26th Feb. Then I am storing it in two macro variables. The second part checks the condition in IF part, if the dates are not equal, it sleeps for an hour, calls the macro again (to check for data load) and then goes to the beginning part of DO loop. In the IF part if it matches, then triggers the shell script, increments the 'i' and gets out of the loop. This is my intention of writing the program. Following are the issues I am facing: 1. How to return the Max_Dt and Cur_Dt macro variables back to the Data _null_ step every time the macro is triggered? I am facing an error when I try to use the macro variables back in Data -null_ step. WARNING: Apparent symbolic reference MAX_DT not resolved. WARNING: Apparent symbolic reference CUR_DT not resolved. ERROR 386-185: Expecting an arithmetic expression. ERROR 200-322: The symbol is not recognized and will be ignored. 2. I am not able to trigger the shell the shell script using the Call system command. The log file gets locked, but the shell script never gets invoked. The shell script basically defines triggers a set of sas reports with a defined location for Output and Log files. 3. What are the other loopholes that I might be missing here? I really appreciate any suggestions to make this code more robust. I have used SAS EG 7.1 and also through Unix to trigger this program.
%macro Date_test();
PROC SQL;
CONNECT TO TERADATA(details) ;
CREATE TABLE MAX01 AS
SELECT * FROM CONNECTION TO TERADATA
(
SELECT max(date_col) as d, current_date-1 as curr_date from table;
);
QUIT;
PROC SQL;
SELECT d format=YYMMDD10. ,curr_date format=YYMMDD10. into: max_dt, : cur_dt FROM MAX01;
quit;
%put &max_dt &cur_dt;
%mend Date_test;
data _null_;
do i=1 to 5 while (i lt 5);
if &max_dt. = &cur_dt. then do;
call system('Sample.ksh');
i+10;
end;
else do;
x = sleep(3600,1);
call execute ('%Date_test();');
end;
end;
run;
... View more