BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
me55
Quartz | Level 8

okay, so i built this macro a while ago.  it was in a different thread in this forum.  i used it in the past and it worked however i am getting weird, kind of unidentified errors...

 

%macro VarExist(ds,var);
%local rc dsid result resx;
%let dsid = %sysfunc(open(&ds));
%let resx = %sysfunc(varnum(&dsid,&var));
%let rc = %sysfunc(close(&dsid));

%if &resx > 0 %then %do;
%let result = 1;
%put NOTE: Var &var exists in &ds;

%end;

%else %do;
%let result = 0;
%put NOTE: Var &var not exists in &ds;

data &dsid;
&var='UNK';
set &dsid;
run;

%end;
%mend VarExist;

%VarExist(TABLE_01,FIELD_01);

however, like i said, when i run this i get this error...

 

93         
94         
98         
99         %macro VarExist(ds,var);
101        %local rc dsid result resx;
102        %let dsid = %sysfunc(open(&ds));
103        %let resx = %sysfunc(varnum(&dsid,&var));
104        %let rc = %sysfunc(close(&dsid));
105        
106        %if &resx > 0 %then %do;
107        %let result = 1;
108        %put NOTE: Var &var exists in &ds;
109        
110        %end;
111        
112        %else %do;
113        %let result = 0;
114        %put NOTE: Var &var not exists in &ds;
115        
116        data &dsid;
117        set &dsid;
118        &var='UNK';
119        run;
120        
121        %end;
122        %mend VarExist;
123        
124        %VarExist(TABLE_01,FIELD_01);
MLOGIC(VAREXIST):  Beginning execution.
MLOGIC(VAREXIST):  Parameter DS has value TABLE_01
MLOGIC(VAREXIST):  Parameter VAR has value FIELD_01
MLOGIC(VAREXIST):  %LOCAL  RC DSID RESULT RESX
MLOGIC(VAREXIST):  %LET (variable name is DSID)
SYMBOLGEN:  Macro variable DS resolves to TABLE_01
MLOGIC(VAREXIST):  %LET (variable name is RESX)
SYMBOLGEN:  Macro variable DSID resolves to 1
SYMBOLGEN:  Macro variable VAR resolves to FIELD_01
MLOGIC(VAREXIST):  %LET (variable name is RC)
SYMBOLGEN:  Macro variable DSID resolves to 1
SYMBOLGEN:  Macro variable RESX resolves to 0
MLOGIC(VAREXIST):  %IF condition &resx > 0 is FALSE
MLOGIC(VAREXIST):  %LET (variable name is RESULT)
MLOGIC(VAREXIST):  %PUT NOTE: Var &var not exists in &ds
SYMBOLGEN:  Macro variable VAR resolves to FIELD_01
SYMBOLGEN:  Macro variable DS resolves to TABLE_01
NOTE: Var FIELD_01 not exists in TABLE_01
SYMBOLGEN:  Macro variable DSID resolves to 1
NOTE: Line generated by the macro variable "DSID".
5                                                          The SAS System                       Friday, January 29, 2021 03:01:00 PM

124         1
            _
            22
            200
MPRINT(VAREXIST):   data 1;
SYMBOLGEN:  Macro variable DSID resolves to 1
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, /, ;, _DATA_, _LAST_, _NULL_.  

ERROR 200-322: The symbol is not recognized and will be ignored.

NOTE: Line generated by the macro variable "DSID".
124         1
            _
            22
            200
MPRINT(VAREXIST):   set 1;
SYMBOLGEN:  Macro variable VAR resolves to TBL_SRC
MPRINT(VAREXIST):   FIELD_01='UNK';
MPRINT(VAREXIST):   run;

ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, ;, CUROBS, END, INDSNAME, KEY, KEYRESET, KEYS, 
              NOBS, OPEN, POINT, _DATA_, _LAST_, _NULL_.  

ERROR 200-322: The symbol is not recognized and will be ignored.

NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.DATA1 may be incomplete.  When this step was stopped there were 0 observations and 19 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.00 seconds
      

MLOGIC(VAREXIST):  Ending execution.

also, should i insert a line to close the table or does it just do that because i have the rc line in there?

1 ACCEPTED SOLUTION

Accepted Solutions
3 REPLIES 3
Kurt_Bremser
Super User

Here you should use the dataset name, not the handle returned by the OPEN function:

data &dsid;
set &dsid;

should be

data &ds;
set &ds;
LeonidBatkhan
Lapis Lazuli | Level 10

Hi me55,

 

&dsid is a number, you cannot have data set name as a number.

Instead of

data &dsid;
   set &dsid;
   &var='UNK';
run;

you probably should have

 

data &ds;
   set &ds;
   &var='UNK';
run;

Hope this helps.

ballardw
Super User

Remember that the OPEN function

The OPEN function opens a SAS data set, DATA step, or a SAS SQL view and returns a unique numeric data set identifier, which is used in most other data set access functions. OPEN returns 0 if the data set could not be opened.

 

Data set names and variable names cannot be all digits.

So

data &dsid;

is not legal when creating the value for &dsid with the Open function.

 

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
  • 3 replies
  • 824 views
  • 0 likes
  • 4 in conversation