Desktop productivity for business analysts and programmers

Help to understand code

Accepted Solution Solved
Reply
Super Contributor
Super Contributor
Posts: 318
Accepted Solution

Help to understand code

Hello friends, please help me to understand this code, this is not my code, its existing code 

 

I am testing code where one dataset "test" resolving with 3 observation 

 

date            file_name 

20Jan16     test_file_20160120.txt

19Jan16     test_file_20160119.txt

18Jan16     test_file_20160118.txt

 

Now after this dataset (test) created, below code is running and its giving only 1 observation, i really don't know why it is resolving to one but i am expecting it should has 3 observation 

 

 

%macro test (x_date);

%let store_x_date="null";

data test_2;

retain stop_ind;
if _N_ = 1 then stop_ind = 0;
set test;
by DESCENDING DATE;
if last.DATE = 1 then do;
if stop_ind = 0 then do;
output;
Author_DATE = put(DATE, date.);
call symput("&x_date.",Author_DATE);
end;
stop_ind = 1;
end;
if stop_ind = 0 then output;
run;

%mend;

%test (store_x_date);

 

 

Thank you

 

 

 

 

 


Accepted Solutions
Solution
‎01-20-2016 03:59 PM
Respected Advisor
Posts: 4,973

Re: Help to understand code

Some contributing factors:

 

  • Since the DATA step contains an OUTPUT statement, you will only output an observation when an OUTPUT statement executes.
  • All OUTPUT statements depend on having STOP_IND=0
  • For this particular set of 3 observations, the 1st observation will output and then set STOP_IND=1
  • For the 2nd and 2rd observations, STOP_IND=1, so nothing gets output

I hope this is enough ... there's really no substitute for understanding what the statements do.

View solution in original post


All Replies
Grand Advisor
Posts: 17,332

Re: Help to understand code

This is where formatting your code helps.  Note that there's an output statement nested in an IF condition and a second one in the last statement. The goal seems to be to create a macro variable.

 

%macro test (x_date);

%let store_x_date="null";

  data test_2;
  retain stop_ind;
  
  if _N_ = 1 then stop_ind = 0;

  set test;
  by DESCENDING DATE;

  if last.DATE = 1 then do;
        if stop_ind = 0 then do;
              output;
              Author_DATE = put(DATE, date.);
              call symput("&x_date.",Author_DATE);
        end;
   stop_ind = 1;
   end;

   if stop_ind = 0 then output;
   run;
%mend;

%test (store_x_date);
Solution
‎01-20-2016 03:59 PM
Respected Advisor
Posts: 4,973

Re: Help to understand code

Some contributing factors:

 

  • Since the DATA step contains an OUTPUT statement, you will only output an observation when an OUTPUT statement executes.
  • All OUTPUT statements depend on having STOP_IND=0
  • For this particular set of 3 observations, the 1st observation will output and then set STOP_IND=1
  • For the 2nd and 2rd observations, STOP_IND=1, so nothing gets output

I hope this is enough ... there's really no substitute for understanding what the statements do.

Super Contributor
Super Contributor
Posts: 318

Re: Help to understand code

Thanks a lot Astouning and Reeza, appreciate your input, 

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 3 replies
  • 296 views
  • 1 like
  • 3 in conversation