BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
FK1
Lapis Lazuli | Level 10 FK1
Lapis Lazuli | Level 10

Hello Everyone,

 

I wrote this macro

%MACRO _util_exist_sas_data(  p_sMembertype         	   =
							, p_sLibref        			   =	
							, p_sMembername    		       =		
							, p_sCatprueffall 			   =			
							, p_sCatname       			   =			
							, p_sCatentryname  			   =			
							, p_sCatentrytype 			   =	
							, p_sMacVarName_for_ReturnCode = 
						    ) /MINOPERATOR MINDELIMITER='§';

/*Abfragen, ob notwendiger Parameter befuellt ist bzw. zulaessigen Wert besitzt*/
%IF (%SYSEVALF(%SUPERQ(p_sMembertype)= ,boolean) eq 1 or NOT(%EVAL(%upcase(&p_sMembertype.) IN 
					%_util_seplist (D$V$C$A$F$M
							    , indlm = %str($)
							    , dlm   = %str(§)
                                ))))
%THEN %DO;
    %PUT ERROR: Invalid value for "p_sMembertype". Please enter one of the following values: "D", "V", "C", "A", "F", or "M" ;
	%RETURN;
%END;


/*##############################################################*/
/*# Abfragen, ob Membertype-abhängige Parameter befuellt sind  #*/
/*##############################################################*/
/*
Liste Membertyps:
1.) SAS DATASET
2.) SAS VIEW
3.) SAS CATALOG (Formatkataloge, Makrokataloge, Graphikkataloge, Templatekataloge)
4.) STORED, COMPILED SAS DATA STEP PROGRAM
5.) FINANCIAL DATABASE
6.) MULTIDIMENSIONAL DATABASE
7.) ACCESS DESCRIPTOR FILES (created by SAS/ACCESS software)  
*/

/* SAS DATASET / SAS VIEW  */
%IF (%SYSEVALF(%UPCASE(&p_sMembertype.) eq D)  or %SYSEVALF(%UPCASE(&p_sMembertype.) eq V)) %THEN %DO;
	%IF /*"p_sLibref" und "p_sMembername" befüllt?*/
		%SYSEVALF(%SUPERQ(p_sLibref)= ,boolean) eq 1 or 
		%SYSEVALF(%SUPERQ(p_sMembername)= ,boolean) eq 1 
	%THEN %DO;
		%PUT ERROR: Please enter values for parameters "p_sLibref" and "p_sMembername".;
		%RETURN;
	%END;

	%ELSE %DO;
		%IF /*"p_sLibref" assigned?*/
			%SYSFUNC(libref(&p_sLibref.)) ne 0
		%THEN %DO;
			%PUT %SYSFUNC(sysmsg());
			%PUT Error code: %SYSFUNC(libref(&lbref.));
			%RETURN;
		%END;
	%END;
%END;

/*Prüfung Membertype = "CATALOG": zweierlei Prüfungen möglich: */
/*Fall  I: Ob ein gegebener Katalog in einer gegebenen Library existiert, oder */
/*Fall II: Ob ein gegebener Katalogeintrag mit gegebenem Katalogeintragstyp in einem gegebenem Katalog mit gegebener Library existiert*/

%IF %SYSEVALF(%UPCASE(&p_sMembertype.) eq C) %THEN %DO;

	/*Fall I:*/
	%IF %EVAL(&p_sCatprueffall. eq 1) %THEN %DO;
		%IF /*"p_sLibref", "p_sCatname" befuellt?*/
			%SYSEVALF(%SUPERQ(p_sLibref)=       ,boolean) eq 1 or 
			%SYSEVALF(%SUPERQ(p_sCatname)=      ,boolean) eq 1 

		%THEN %DO;
				%PUT ERROR: Please enter values for parameters "p_sLibref" and "p_sCatname".;
				%RETURN;
		%END;

		%ELSE %DO;
			%IF /*"p_sLibref" assigned?*/
				%SYSFUNC(libref(&p_sLibref.)) ne 0
			%THEN %DO;
				%PUT %SYSFUNC(sysmsg());
				%PUT Error code: %SYSFUNC(libref(&p_sLibref.));
				%RETURN;
			%END;
		%END;
	%END; 

	/*Fall II:*/
	%IF %EVAL(&p_sCatprueffall. eq 2) %THEN %DO;
		   %IF /*"p_sLibref", "p_sCatname", "p_sCatentryname" und "p_sCatentrytype" befüllt?*/
				%SYSEVALF(%SUPERQ(p_sLibref)=       ,boolean) eq 1 or 
				%SYSEVALF(%SUPERQ(p_sCatname)=      ,boolean) eq 1 or 
				%SYSEVALF(%SUPERQ(p_sCatentryname)= ,boolean) eq 1 or 
				%SYSEVALF(%SUPERQ(p_sCatentrytype)= ,boolean) eq 1 
			%THEN %DO;
				%PUT ERROR: Please enter values for parameters "p_sLibref", "p_sCatname", "p_sCatentryname" and "p_sCatentrytype".;
				%RETURN;
			%END;

			%IF /*"p_sLibref" assigned?*/
				%SYSFUNC(libref(&p_sLibref.)) ne 0
			%THEN %DO;
				%PUT %SYSFUNC(sysmsg());
				%PUT Error code: %SYSFUNC(libref(&p_sLibref.));
				%RETURN;
			%END;

			%IF NOT(%EVAL(%upcase(&p_sCatentrytype.) IN 
					%_util_seplist (AMETHOD$CATAMS$CLASS$CLASSPKG$CSV$DATAFORM$DEV$DEVMAP$DICTNARY$EDPARMS$EIS$ENGINE$FOLDER$FONT$FONTLIST$FORM$FORMAT$FORMATC$FRAME$GIF$HELP$HTML$IMAGE$INFMT$INFMTC$INTRFACE$JPEG$KEYMAP$KEYS$LAYOUT$LIST$LOG$MACRO$MENU$OUTPUT$PCL$PDF$PMENU$PROGRAM$PSL$RANGE$RESOURCE$RTF$SCL$SCREEN$SLIST$SOURCE$SYSTEM$TEMPLATE$TOOLBOX$TOOLSET$TRANTAB$XML
								    , indlm = %str($)
								    , dlm   = %str(§)
	                                )))
			%THEN %DO;
	                %PUT ERROR: Invalid catalog entry type value for parameter "p_sCatentrytype".;
					%RETURN;
			%END;

	%END;

	%IF NOT (%SYSEVALF(&p_sCatprueffall. eq 1) or %SYSEVALF(&p_sCatprueffall. eq 2)) %THEN %DO;  
		%PUT ERROR: Please enter "1" or "2" as valid test case condition with parameter "p_sMembertype" eq "C".;
		%PUT NOTE: "p_sCatprueffall" eq "1": Catalog named "p_sCatname" exists / does not exist in library with libref "p_sLibref".;
		%PUT NOTE: "p_sCatprueffall" eq "2": Catalog entry "p_sCatentryname" with catalog entry type "p_sCatentrytype" exists / does not exist in catalog "p_sCatname" in library with libref "p_sLibref".;
		%RETURN;
	%END;
%END;


%******************************************************************************************************************************************;
%LOCAL _d _a _c _v _f _m _rc_obj_existence  ;

/*Prüfung Membertype SAS DATA SET*/
%IF %SYSEVALF(%UPCASE(&p_sMembertype.) eq D)  %THEN %DO;
	%LET _d = %SYSFUNC(exist(&p_sLibref..&p_sMembername.,   DATA    ));
	%IF %SYSEVALF(&_d. eq 1) %THEN %DO;
		%PUT NOTE: DATA SET "&p_sLibref..&p_sMembername." EXISTS. ;
		%LET _rc_obj_existence =  1; 
	%END;
	%ELSE %DO;
		%PUT NOTE: DATA SET "&p_sLibref..&p_sMembername." DOES NOT EXIST.;
		%LET _rc_obj_existence =  0;
	%END;
%END;

/*Prüfung Membertype SAS DATA VIEW*/
%IF %SYSEVALF(%UPCASE(&p_sMembertype.) eq V) %THEN %DO;
	%LET _v = %SYSFUNC(exist(&p_sLibref..&p_sMembername.,   VIEW    ));
	%IF %SYSEVALF(&_v. eq 1) %THEN %DO;
		%PUT NOTE: VIEW "&p_sLibref..&p_sMembername." EXISTS.;
		%LET _rc_obj_existence =  1; 
	%END;
	%ELSE %DO;
		%PUT NOTE: VIEW "&p_sLibref..&p_sMembername." DOES NOT EXIST.;
		%LET _rc_obj_existence =  0;
	%END;
%END;


/*Prüfung Membertype CATALOG*/
%IF %SYSEVALF(%UPCASE(&p_sMembertype.) eq C)  %THEN %DO;

/*
Definition of a SAS Catalog:
SAS catalogs are special SAS files that store many different types of information in smaller units called catalog entries. 
Each entry has an entry type that identifies its purpose to SAS. A single SAS catalog can contain several types of catalog entries. 
Some catalog entries contain system information such as key definitions. 
Other catalog entries contain application information such as window definitions, help windows, formats, informats, macros, or graphics output. 
You can list the contents of a catalog using various SAS features, such as SAS Explorer and PROC CATALOG.
*/

/*Allgemein gilt:*/
/*Ein Katalogeintrag ist vollständig qualifiziert (engl.: "fully qualified"), wenn er VIER Bestandteile aufweist:
	1.) <libref>      = Libref der Library, in der der Katalog liegt.
	2.) <catalog-name>= Name des Katalogs.
    3.) <entry-name>  = Name des Katalogeintrags.
	4.) <entry-type>  = Name des Typs des Katalogeintrages.
 
Zusammensetzung: <libref>.<catalog-name>.<entry-name>.<entry-type>.

	Liste <entry-type>:
	-----------------
	AMETHOD, CATAMS, CLASS, CLASSPKG, CSV, DATAFORM, DEV, DEVMAP, DICTNARY, EDPARMS, EIS, ENGINE, FOLDER, FONT, FONTLIST, FORM, FORMAT, FORMATC, FRAME, GIF, HELP
	HTML, IMAGE, INFMT, INFMTC, INTRFACE, JPEG, KEYMAP, KEYS, LAYOUT, LIST, LOG, MACRO, MENU, OUTPUT, PCL, PDF, PMENU, PROGRAM, PSL, RANGE, RESOURCE, RTF, SCL, SCREEN      
	SLIST, SOURCE, SYSTEM, TEMPLATE, TOOLBOX, TOOLSET, TRANTAB, XML      
	*/

	/*Prüfung Fall I:*/
	%IF %SYSEVALF(&p_sCatprueffall. eq 1) %THEN %DO;
			%IF /*Katalog "p_sCatname" mit Libref "p_sLibref" existiert?*/
				%SYSFUNC(cexist(&p_sLibref..&p_sCatname.)) eq 1
			%THEN %DO;
				%PUT NOTE: CATALOG "%UPCASE(&p_sCatname.)" EXISTS IN LIBRARY WITH LIBREF "%UPCASE(&p_sLibref.)".;
				%LET _rc_obj_existence =  1;
			%END;

			%ELSE %DO;
				%PUT NOTE: CATALOG "%UPCASE(&p_sCatname.)" DOES NOT EXIST IN LIBRARY WITH LIBREF "%UPCASE(&p_sLibref.)".;
				%LET _rc_obj_existence =  0;
			%END;
	%END;

	/*Prüfung Fall II:*/
	%IF %SYSEVALF(&p_sCatprueffall. eq 2) %THEN %DO;
			%IF /*Katalogeintrag "p_sCatentryname" vom Eintragstyp "p_sCatentrytype" im Katalog "p_sCatentryname" mit Libref "p_sLibref" existiert?*/
				%SYSFUNC(cexist(&p_sLibref..&p_sCatname..&p_sCatentryname..&p_sCatentrytype.)) eq 1
			%THEN %DO;     
				%PUT NOTE: CATALOG ENTRY "%UPCASE(&p_sCatentryname.)" WITH CATALOG ENTRY TYPE "%UPCASE(&p_sCatentrytype.)" EXISTS IN CATALOG "%UPCASE(&p_sCatentryname.)" IN LIBRARY WITH LIBREF "%UPCASE(&p_sLibref.)".;
				%LET _rc_obj_existence =  1;
			%END;

			%ELSE %DO;
				%PUT NOTE: CATALOG ENTRY "%UPCASE(&p_sCatentryname.)" WITH CATALOG ENTRY TYPE "%UPCASE(&p_sCatentrytype.)" EXISTS IN CATALOG "%UPCASE(&p_sCatentryname.)" IN LIBRARY WITH LIBREF "%UPCASE(&p_sLibref.)".;
				%LET _rc_obj_existence =  0;
				%RETURN;
			%END;
	%END;


%END;

/*Prüfen, ob MacVarname der im Parameter mitgegeben wurde bereits in einem local symbol table oder dem global symbol talbe vergeben ist.*/
%IF %SYSEVALF(%SUPERQ(p_sMacVarName_for_ReturnCode)= ,boolean) eq 0 %THEN %DO;

	data _NULL_;
	call symputx("&p_sMacVarName_for_ReturnCode",&_rc_obj_existence.,"G");
	stop;
	run;
/*
	%IF %SYMEXIST(&p_sMacVarName_for_ReturnCode.) eq 0 %THEN %DO;

	  data _NULL_;
	  call symputx("&p_sMacVarName_for_ReturnCode",&_rc_obj_existence.,"G");
	  stop;
	  run;

	%END;

	%ELSE %DO;
	%PUT WARNING: NO MACRO VARIABLE "&p_sMacVarName_for_ReturnCode." HAS BEEN CREATED SINCE IT ALREADY EXISTS. PLEASE ENTER A DIFFERENT VALUE FOR "p_sMacVarName_for_ReturnCode".;
	%RETURN;
	%END;
*/
%END;

/*#####################################################################*/
/*AB HIER NUR BETA VERSION - NOCH NICHT FERTIG ENTWICKELT!!!!!         */
/*#####################################################################*/

/*/*Prüfung Membertype SAS ACCESS DESCRIPTOR FILES (werden von SAS/ACCESS Produkten erzeugt)*/
%IF %SYSEVALF(%UPCASE(&p_sMembertype.) eq A) %THEN %DO;

	%LET _a = %SYSFUNC(exist(&p_sLibref..&p_sMembername.,   ACCESS    ));
	%IF %SYSEVALF(&_a. eq 1) %THEN %DO;
		%PUT NOTE: SAS ACCESS DESCRIPTOR FILE "&p_sLibref..&p_sMembername." EXISTS.;
		%LET _rc_obj_existence =  1; 
	%END;
	%ELSE %DO;
		%PUT NOTE: SAS ACCESS DESCRIPTOR FILE "&p_sLibref..&p_sMembername." DOES NOT EXIST.;
		%LET _rc_obj_existence =  0;
	%END;
%END;

/*Prüfung Membertype SAS FINANCIAL DATABASE FILES*/
%IF %SYSEVALF(%UPCASE(&p_sMembertype.) eq F) %THEN %DO;

	%LET _f = %SYSFUNC(exist(&p_sLibref..&p_sMembername.,   FDB    ));
	%IF %SYSEVALF(&_f. eq 1) %THEN %DO;
		%PUT NOTE: SAS FINANCIAL DATABASE FILE  "&p_sLibref..&p_sMembername." EXISTS.;
		%LET _rc_obj_existence =  1; 
	%END;
	%ELSE %DO;
		%PUT NOTE: SAS FINANCIAL DATABASE FILE "&p_sLibref..&p_sMembername." DOES NOT EXIST.;
		%LET _rc_obj_existence =  0;
	%END;
%END;

/*Prüfung Membertype SAS MULTIDIMENSIONAL DATABASE FILE*/
%IF %SYSEVALF(%UPCASE(&p_sMembertype.) eq M) %THEN %DO;

	%LET _m = %SYSFUNC(exist(&p_sLibref..&p_sMembername.,   MDDB    ));
	%IF %SYSEVALF(&_m. eq 1) %THEN %DO;
		%PUT NOTE: SAS MULTIDIMENSIONAL DATABASE FILE  "&p_sLibref..&p_sMembername." EXISTS.;
		%LET _rc_obj_existence =  1; 
	%END;
	%ELSE %DO;
		%PUT NOTE: SAS MULTIDIMENSIONAL DATABASE FILE "&p_sLibref..&p_sMembername." DOES NOT EXIST.;
		%LET _rc_obj_existence =  0;
	%END;
%END;

%mend;

It works fine, as long as it is compiled and run in an interactive EG session.

However, I want to add this macro to my collection of autocall macros. Therefore, I created a file called "_util_exist_sas_data.sas" and put it into the corresponding collection folder.

 

Now, if I instantiate a SAS EG session and directly call the above mentioned autocall macro

%_util_exist_sas_data(p_sMembertype=D, p_sLibref=METADATA, p_sMembername=_LSF_CTL_HISTORYFILE , p_sMacVarName_for_ReturnCode=rc_exist)

, I get this ERROR message:

 

ERROR: The /MINDELIMITER= option must be a single character enclosed in single quotation marks.
ERROR: A dummy macro will be compiled.
19         %_util_exist_sas_data(p_sMembertype=D, p_sLibref=METADATA, p_sMembername=_LSF_CTL_HISTORYFILE ,
                                _
                                180
19       ! p_sMacVarName_for_ReturnCode=rc_exist)
ERROR 180-322: Statement is not valid or it is used out of proper order.

 

As you can clearly see in the macro definition: the MINDELIMITER= option is enclosed in single quotation marks and has one single character

 

Why does SAS behave differently between interaction and autocall compilation?

1 ACCEPTED SOLUTION

Accepted Solutions
Tom
Super User Tom
Super User

It is probably best to use a single byte character as your delimiter.  Something in the range from a space to a tilde.  Or in SAS terms in the string generated by COLLATE(32,126).

 

Using a special character is just going to invite trouble with transcoding of characters from one encoding to another.

View solution in original post

2 REPLIES 2
Tom
Super User Tom
Super User

It is probably best to use a single byte character as your delimiter.  Something in the range from a space to a tilde.  Or in SAS terms in the string generated by COLLATE(32,126).

 

Using a special character is just going to invite trouble with transcoding of characters from one encoding to another.

FK1
Lapis Lazuli | Level 10 FK1
Lapis Lazuli | Level 10

Thank you, Tom. Ich switched from "§" to "~". Now it works fine.

SAS Innovate 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

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
  • 2 replies
  • 645 views
  • 2 likes
  • 2 in conversation