BookmarkSubscribeRSS Feed
raveena
Obsidian | Level 7

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):(Column).
      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;

7 REPLIES 7
Steelers_In_DC
Barite | Level 11

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.

evp000
Quartz | Level 8

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;

evp000
Quartz | Level 8

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;

 

Astounding
PROC Star
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?
raveena
Obsidian | Level 7

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;

Reeza
Super User
You shouldn't nest macros like that...I would suggest extracting them into separate macros and seein if that helps for starters.

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.

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 7 replies
  • 1329 views
  • 0 likes
  • 6 in conversation