- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I have wrote a code to illustrate the use of %sysfunc in a open code. The first code is not using %sysfunc, instead I use macro functions :
%let test=a/b/c.sas;
%let nsys=%substr ( &test,1,%length (%scan ( &test,-1,/) ) );
%put &nsys;
Now I would like to use the same logic but this time I will use %sysfunc with sas function ( not macro function)
%let test=a/b/c.sas;
%let ysys=%sysfunc ( substr ( &test,1,length (scan ( &test,-1,/) ) ) );
%put &ysys;
But I get an error :
ERROR: Argument 3 to function SUBSTR referenced by the %SYSFUNC or %QSYSFUNC macro function is
not a number.
ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC argument list.
Execution of %SYSCALL statement or %SYSFUNC or %QSYSFUNC function reference is
terminated.
It looks like the type of value returned by length() is not numeric. What is the difference between the codes that make my %sysfunc version not working properly ?
Another question/advice, is it possible to use %sysfunc with a macro function ? example %sysfunc(%scan(&alpha,1)) or should we only use %sysfunc with non macro sas function like %sysfunc(scan(&alpha,1))
Thanks in advance
saskap
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi RW9,
Yes I try find the path part of the name. I can deduce from your answer that I would then need for each function a %sysfunc...
%let test=a/b/c.sas;
%let ysys=%sysfunc(substr(&test.,1,%sysfunc(length(%sysfunc(scan(&test.,-1,/))))));
%put &ysys;
It is then providing me with a correct result.
Agreed, that there are easier and more elegant solution, but wanted to understand the use of %sysfunc.
Thanks,
saskap
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Well, first off you need to put another %sysfunc in to call the next function:
%let test=a/b/c.sas; %let ysys=%sysfunc(substr(&test.,1,%sysfunc(length(scan(&test.,-1,/))))); %put &ysys;
However that won't work as you think it will, logic isn't right. What is it your actually trying to do. A hint for you, if you find you are using lots of &'s, or %sysfunc or macro, then its likely a simple rethink of your problem will result in simpler easier code. I assume you are trying to find the path part of the name? If so there might be automatic variables available for this, or you can include better code in your actual program to identify this.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi RW9,
Yes I try find the path part of the name. I can deduce from your answer that I would then need for each function a %sysfunc...
%let test=a/b/c.sas;
%let ysys=%sysfunc(substr(&test.,1,%sysfunc(length(%sysfunc(scan(&test.,-1,/))))));
%put &ysys;
It is then providing me with a correct result.
Agreed, that there are easier and more elegant solution, but wanted to understand the use of %sysfunc.
Thanks,
saskap
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Whilst I appreciate you marking your own post as the answer to the question, it is not very helpful to other users who are looking for the answer to the question.
In terms of %sysfunc(), that runs one SAS function, hence if you have multiple functions then you need several %sysfunc's. The simple answer to:
"but wanted to understand the use of %sysfunc."
Is that there is rarely, if ever a need to use it. Proper well thought out code does not need the use of any macro code.