DATA Step, Macro, Functions and more

Regarding Macro Error

Reply
Frequent Contributor
Posts: 90

Regarding Macro Error

Good Afternoon All,

I am running the below Macro code and getting some errors.

 

data _null_;

set hospcnt;

call symput('maxcnt',maxnum);

run;

%put &maxcnt;

/* loop to go through all hospitals */

%macro hosrep();

%do j= 1 %to &maxcnt;

data _null_;

set hospcnt;

if cnt=&j;

call symput('i',trim(left(prvorg)));

run;

data report1;

set &save..procrpt;

if prvorg="&i";

run;

%end;

%mend hosrep;

 

Error:

MPRINT(HOSP_LOOP):   data _null_;
MPRINT(HOSP_LOOP):   set hospcnt;
MPRINT(HOSP_LOOP):   call symput('maxcnt',maxnum);
MPRINT(HOSP_LOOP):   run;

NOTE: Numeric values have been converted to character values at the places given by: (Line)Smiley SadColumn).
      3:179  
NOTE: There were 91 observations read from the data set WORK.HOSPCNT.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      user cpu time       0.00 seconds
      system cpu time     0.00 seconds
      memory              189.17k
      OS Memory           26480.00k
      Timestamp           09/24/2015 12:37:28 PM
     
SYMBOLGEN:  Macro variable MAXCNT resolves to           91
91
SYMBOLGEN:  Macro variable MAXCNT resolves to           91
SYMBOLGEN:  Macro variable MAXCNT resolves to           91
NOTE: Line generated by the invoked macro "HOSREP".
1       data _null_;     set hospcnt;     if cnt=&j;     call symput('i',trim(left(prvorg)));    run;      data report1;
                                                 -
                                                 22
1    !      set &save..procrpt;     if prvorg="&i";        run;     data report2;     set &save..percents;     if
1    ! prvorg="&i";
MPRINT(HOSREP):   data _null_;
MPRINT(HOSREP):   set hospcnt;
WARNING: Apparent symbolic reference J not resolved.
MPRINT(HOSREP):   if cnt=&j;
MPRINT(HOSREP):   call symput('i',trim(left(prvorg)));
MPRINT(HOSREP):   run;

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, a numeric constant,
              a datetime constant, a missing value, bitstring, INPUT, PUT. 

NOTE: The SAS System stopped processing this step because of errors.
NOTE: DATA statement used (Total process time):
      real time           0.13 seconds
      user cpu time       0.00 seconds
      system cpu time     0.00 seconds
      memory              125.64k
      OS Memory           26480.00k
      Timestamp           09/24/2015 12:37:28 PM
     

MPRINT(HOSREP):   data report1;
SYMBOLGEN:  Macro variable SAVE resolves to work
MPRINT(HOSREP):   set work.procrpt;
WARNING: Apparent symbolic reference I not resolved.
MPRINT(HOSREP):   if prvorg="&i";
MPRINT(HOSREP):   run;

Valued Guide
Posts: 858

Re: Regarding Macro Error

Looks like it would be relatively easy to run the code without the macro, replace &j with 1 and see what you get.  That troubleshooting step will make everything a lot easier.

Contributor
Posts: 74

Re: Regarding Macro Error

Hi,

I replaced all the macro calls with put statements and the macro variables are resolving.  I had to hard code a couple of values and I changed the beginning part since it seemed unnecessarily complicated.  Hope this helps a bit. 

 

data grouch;
prvorg = 'org1'; output;
prvorg = 'org2'; output;
prvorg = 'org2'; output;
run;


%macro hosp_loop();
/* Hospital counts */
/*
proc sort data=grouch out=porgs(keep=prvorg) nodupkey;
by prvorg;
run;

data porgcnt;
set porgs;
IF PRVORG = " " THEN DELETE;
cnt+1;
run;

proc sql;
create table hospcnt as
select a.*, b.cnt, max(cnt) as maxnum
from porgs a left join porgcnt b
on a.prvorg=b.prvorg;
quit;

data _null_;
set hospcnt;
call symput('maxcnt',maxnum);
run;
*/

 

proc freq data = grouch noprint;
table prvorg / out = hospcnt (rename = (count = cnt) drop = percent);
run;

 

proc sql;
select max(cnt) into :maxcnt
from hospcnt;
quit;

 

%put &maxcnt;


/* Pull data from GROUCHBYEFFPER table */
%put ANA055_datapull;
/* Report data for all hospitals for both Report 3 and Report 4 (creates detail_hosp_rptX & detail_hf_rptX) */
%put ANA055_datapull3;
%put ANA055_datapull4;


%global prvorg effdt;
%let effdt = effdt; /* made up value */
%let drv7 = drv7; /* made up value */

 

/* loop to go through all hospitals */
%macro hosrep();

%do j= 1 %to &maxcnt;
data _null_;
set hospcnt;
if cnt=&j;
*call symput('prvorg',trim(left(prvorg)));
call symputx('prvorg',prvorg);
run;

 

%put j=&j., prvorg=&prvorg;

 

/* Report data for selected hosital (creates tables report_output_rptX) */
%put ANA055_reportdata_3(&prvorg);
%put ANA055_reportdata_4(&prvorg);
/* Create Report 3 */
%put pdf_head(l,y,8,&drv7.\ANA05501\current,ANA05501_30_&prvorg._A);
%put ANA055_report_3;
%put pdf_tail(&effdt);


/* Create Report 4 */
%put pdf_head(l,y,8,&drv7.\ANA05501\current,ANA05501_30_&prvorg._B);
%put ANA055_report_4;
%put pdf_tail(&effdt);
%end;
%mend hosrep;

%if &maxcnt=0 %then %do;
%goto skip1;
%end;
%else %hosrep;
%skip1:;

%mend hosp_loop;
%hosp_loop;

Contributor
Posts: 74

Re: Regarding Macro Error

Hi,

I couldn't run all your code because I don't know what's in &save..procrpt but this code works.  It may be just the difference of using call syputx rather than symput.  Now that symputx exists there doesn't seem to be any reason to use symput.

https://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002295697.htm

 

data hospcnt;
maxnum = 2;
cnt = 1; prvorg = 'org1'; output;
cnt = 2; prvorg = 'org2'; output;
run;

data _null_;
set hospcnt;
call symputx('maxcnt',maxnum);
run;

%put &maxcnt;

%macro hosrep();
%do j = 1 %to &maxcnt;

data _null_;
set hospcnt;
if cnt=&j;
call symput('i',prvorg);
run;
%put i = >&i<;

%end;
%mend hosrep;
%hosrep;

 

Super User
Posts: 5,093

Re: Regarding Macro Error

Here's a guess, but an educated guess. There are several signs in your results that indicate you had to simplify the code when presenting the question for the message board. I believe that a key piece was simplified, and is actually different than what you posted: %do j=1 %to &maxcnt; I suspect that the actual macro variable used to loop was not named J but something else. Is that something you can check? If that's not it, are you able to post the first few lines of the actual (not simplified) code beginning with %macro hosrep?
Frequent Contributor
Posts: 90

Re: Regarding Macro Error

Hi ,

 

Here attached the entire macro loop for your reference.

 

%macro hosp_loop();

/* Hospital counts */

proc sort data=grouch out=porgs(keep=prvorg) nodupkey;

by prvorg;

run;

data porgcnt;

set porgs;

IF PRVORG = " " THEN DELETE;

cnt+1;

run;

proc sql;

create table hospcnt as

select a.*, b.cnt, max(cnt) as maxnum

from porgs a left join porgcnt b

on a.prvorg=b.prvorg;

quit;

data _null_;

set hospcnt;

call symput('maxcnt',maxnum);

run;

%put &maxcnt;

/* Pull data from GROUCHBYEFFPER table */

%ANA055_datapull;

/* Report data for all hospitals for both Report 3 and Report 4 (creates detail_hosp_rptX & detail_hf_rptX) */

%ANA055_datapull3;

%ANA055_datapull4;

/* loop to go through all hospitals */

%global prvorg;

%macro hosrep();

 

%do j= 1 %to &maxcnt;

data _null_;

set hospcnt;

if cnt=&j;

call symput('prvorg',trim(left(prvorg)));

run;

/* Report data for selected hosital (creates tables report_output_rptX) */

%ANA055_reportdata_3(&prvorg);

%ANA055_reportdata_4(&prvorg);

/* Create Report 3 */

%pdf_head(l,y,8,&drv7.\ANA05501\current,ANA05501_30_&prvorg._A);

%ANA055_report_3;

%pdf_tail(&effdt);

/* Create Report 4 */

%pdf_head(l,y,8,&drv7.\ANA05501\current,ANA05501_30_&prvorg._B);

%ANA055_report_4;

%pdf_tail(&effdt);

%end;

%mend hosrep;

%if &maxcnt=0 %then %do;

%goto skip1;

%end;

%else %hosrep;

%skip1:

%mend hosp_loop;

Super User
Posts: 17,912

Re: Regarding Macro Error

You shouldn't nest macros like that...I would suggest extracting them into separate macros and seein if that helps for starters.
SAS Employee
Posts: 24

Re: Regarding Macro Error

I agree with Reeza, you should not imbed macro definitions within each other. Another tool that may help is create a file that contains the code generated by your macro code. Then you can run the code as it would run after generated by the macro facility. All you have to do is run the following two lines before you run the macro:

options mprint mfile;

filename mprint 'path';

where path is a fully qualified path to a file which will contain the code the macro will generate.

Ask a Question
Discussion stats
  • 7 replies
  • 252 views
  • 0 likes
  • 6 in conversation