Macro Functions:

%Sysfunc
Execute SAS functions or user-written functions.
If we are using any Base SAS function in Macros that should call with %Sysfunc.
Syntax: – %SYSFUNC(Function(argument-1 <…argument-n>)<, format>)
Examples:-
%LET TODAY=%SYSFUNC(TODAY(),DATE9.);
%LET MON=%SYSFUNC(SUBSTR(&TODAY1.D,3,3));
TITLE “%SYSFUNC(DATE(),WORDDATE.) Absence Report”;
The macro CHECKDS uses %SYSFUNC to execute the EXIST function, which checks the existence of a data set:
Execute below program and see the result
%macro checkds1(dsn);
%if %sysfunc(exist(&dsn)) %then
%do;
proc print data=&dsn;
Run;
%end;
%else
%put The data set &dsn does not exist.;
%mend;
%checkds1(work.ds) ;
Result: The data set work.ds does not exist.

Execute below program and see the result
Data ds;
Set sashelp.cars;
Run;
%macro checkds(dsn);
%if %sysfunc(exist(&dsn)) %then
%do;
Proc print data=&dsn;
Run;
%end;
%else
%put The data set &dsn does not exist.;
%mend;
%checkds(work.ds)
Above program check the dataset is exist or not, here dataset is there so it produces the statements like
PROC PRINT DATA=WORK.DS;
RUN;

%EVAL
Evaluates arithmetic and logical expressions using integer arithmetic.
Syntax:- %EVAL (arithmetic or logical expression)
Example:-
%Macro mac4;
%Let a=2;
%Let b=3;
%let c=%Eval(&a+&b);
%Mend;
%Mac4
%Put &a.;
%Put &b.;
%Put &c.;

%SYSEVALF
Evaluates arithmetic and logical expressions using floating-point arithmetic.
Note: When we need to do some arithmetic operations without decimal values we can use %Eval, but when we have decimal values we need to use %Sysevalf function.
Syntax:- %SYSEVALF (arithmetic or logical expression)
Example:-
%Macro mac5;
%Let a=2.3;
%Let b=3.2;
%let c=%Sysevalf(&a+&b);
%Mend;
%Mac5
%Put &a.;
%Put &b.;
%Put &c.;
%Macro mac6;
%Let a=2.3;
%Let b=3.2;
%let c=%Sysevalf(&a+&b);
%let d=%Sysevalf(&a+&b,boolean);
%let e=%Sysevalf(&a+&b,ceil);
%let f=%Sysevalf(&a+&b,floor);
%let g=%Sysevalf(&a+&b,int);
%Mend;
%Mac6
%Put &a.;
%Put &b.;
%Put &c.;
%Put The boolean value is: &d.;
%Put The ceil value is: &e.;
%Put The floor value is: &f.;
%Put The int value is: &g.;

SYMGET
Returns the value of a macro variable during DATA step execution.
Get the information from Macro variable to Datastep.
Syntax:- Symget(Argument)
Example:-
%Let a=yes;
Data ds;
b=Symget(“a”);
Run;

%LENGTH
Returns the length of a string.
Syntax:- %LENGTH (character string)
Example:-
%Let A=Krishna;
%Let B=Reddy;
%Put A Variable value Krishna length is : %Length(&A);
%Put B Variable value Reddy length is : %Length(&B);
%Put A and B Variable value length is : %Length(&A&B);

%SCAN & %QSCAN
Search for a word that is specified by its position in a string.
Syntax:- %SCAN(argument, n<, delimiters>)
%QSCAN masks the same characters as the %NRBQUOTE function.
Syntax:- %QSCAN(argument, n<, delimiters>)
Example:-
%macro a;
aaaaaa
%mend a;
%macro b;
bbbbbb
%mend b;
%macro c;
cccccc
%mend c;

%let x=%nrstr(%a*%b*%c);
%put X: &x;
%put The third word in X, with SCAN: %scan(&x,3,*);
%put The third word in X, with QSCAN: %qscan(&x,3,*);

%SUBSTR & %QSUBSTR
Search for a word that is specified by its position in a string.
Syntax:- %SUBSTR (argument, position<, length>)
%QSUBSTR (argument, position<, length>)
Example:-
%let a=one;
%let b=two;
%let c=%nrstr(&a &b);
%put C: &c;
%put With SUBSTR: %substr(&c,1,2);
%put With QSUBSTR: %qsubstr(&c,1,2);
Observe below real time code
%MACRO DATES;
%GLOBAL TODAY1 YEARA MONA MON1 YR1 DAY MON2 YR2 QBYR EDATE BEGPRD CQMON CQMON1 CQYR FBDATE FEDATE LFBDATE LEDATE LFEDATE Q1MON Q1MON1 Q2MON Q2MON1 Q3MON Q3MON1 EYR EMON BMON1A BMON1 BYR1 BDATE BYR BMON M2A M2B M2 Y2 M3A M3B M3 Y3 M4A M4B M4 Y4 M5A M5B M5 Y5 M6A M6B M6 Y6 M7A M7B M7 Y7 M8A M8B M8 Y8 M9A M9B M9 Y9 M10A M10B M10 Y10 M11 M11B M11 Y11 M12A M12B M12 Y13 Y14 Y15 Y16 Y17 Y18 Y19 Y20 Y21 Y22 Y23 Y24 MON1 MON2 MON3 MON4 MON5 MON6 MON7 MON8 MON9 MON10 MON11 MON12 MON13 MON14 MON15 MON16 MON17 MON18 MON19 MON20 MON21 MON22 MON23 MON24 FMT_BDATE FMT_EDATE ;
%LET TODAY1=%SYSFUNC(TODAY(),YYMMDDN8.);
%LET YEARA = %EVAL(&TODAY1./10000);
%LET MONA = %EVAL(%EVAL(&TODAY1./100) – %EVAL(&YEARA. * 100));
%IF &MONA. EQ 1 %THEN %LET MON1 =12;
%ELSE %LET MON1 =%EVAL(&MONA. – 1);
%IF &MONA. EQ 1 %THEN %LET YR1 =%EVAL(&YEARA – 1);
%ELSE %LET YR1 =&YEARA.;
%IF &MON1. EQ 2 %THEN %LET DAY =28;
%ELSE %IF &MON1. EQ 4 OR &MON1. EQ 6 OR &MON1. EQ 9 OR &MON1. EQ 11 %THEN %LET DAY =30;
%ELSE %LET DAY =31;
%LET A=0;
%LET B=1;
%IF &MON1. GT 9 %THEN %LET MON2 =&MON1.;
%ELSE %LET MON2 =&A.&MON1.;
%LET YR2 = &YR1.;
%LET QBYR = %EVAL(&YR1. – 2);
%LET EDATE =&YR2.&MON2.&DAY.;
%LET BEGPRD = &QBYR.&MON2.&A.&B.;
%IF &MON1. EQ 1 %THEN %LET CQMON =11;
%ELSE %IF &MON1. EQ 2 %THEN %LET CQMON = 12;
%ELSE %LET CQMON = %EVAL(&MON1. – 2);
%IF &CQMON. GT 9 %THEN %LET CQMON1 =&CQMON.;
%ELSE %LET CQMON1 =%SYSFUNC(CAT(0,&CQMON.));
%IF &MON1. EQ 1 %THEN %LET CQYR =%EVAL(&YR2. – 1);
%ELSE %IF &MON1. EQ 2 %THEN %LET CQYR =%EVAL(&YR2. – 1);
%ELSE %LET CQYR =&YR2.;
%LET FBDATE = &CQYR.&CQMON1.&A.&B.;
%LET FEDATE = &EDATE.;
%LET LFBDATE = %EVAL(&FBDATE. – 10000);
%LET LEDATE = %EVAL(&EDATE. – 10000);
%LET LFEDATE = &LEDATE.;
%IF &CQMON. GT 3 %THEN %LET Q1MON = %EVAL(&CQMON. – 3);
%ELSE %LET Q1MON = %EVAL(&CQMON.+ 9);
%IF &Q1MON. GT 9 %THEN %LET Q1MON1 =&Q1MON.;
%ELSE %LET Q1MON1 =&A.&Q1MON.;
%IF &Q1MON. GT 3 %THEN %LET Q2MON =%EVAL(&Q1MON. – 3);
%ELSE %LET Q2MON =%EVAL(&Q1MON. + 9);
%IF &Q2MON. GT 9 %THEN %LET Q2MON1 =&Q2MON.;
%ELSE %LET Q2MON1 =&A.&Q2MON.;
%IF &Q2MON. GT 3 %THEN %LET Q3MON =%EVAL(&Q2MON – 3);
%ELSE %LET Q3MON =%EVAL(&Q2MON. + 9);
%IF &Q3MON. GT 9 %THEN %LET Q3MON1 = &Q3MON.;
%ELSE %LET Q3MON1 = &A.&Q3MON.;
%LET EYR = %EVAL(&EDATE./10000);
%LET EMON = %SUBSTR(&EDATE.,5,2);

%IF &EMON. NE 12 %THEN %LET BMON1A =%EVAL(&EMON. + 1);
%ELSE %LET BMON1A =1;
%IF &BMON1A GE 10 %THEN %LET BMON1 =&BMON1A.;
%ELSE %LET BMON1 =&A.&BMON1A.;
%IF &EMON EQ 12 %THEN %LET BYR1 =%EVAL(&EYR. – 1);
%ELSE %LET BYR1 =%EVAL(&EYR. – 2);
%LET A=0;
%LET B=1;
%LET BDATE = &BYR1.&BMON1.&A.&B.;
%LET BYR = %EVAL(&BDATE./10000);
%LET BMON = %SUBSTR(&BDATE.,5,2);
%LET M2A =%EVAL(&BMON. + 1);
%IF &M2A. GE 13 %THEN %LET M2B =%EVAL(&M2A. – 12);
%ELSE %LET M2B = &M2A.;
%IF &M2B. GE 10 %THEN %LET M2 = &M2B.;
%ELSE %LET M2 = &A.&M2B.;
%IF &M2A. GE 13 %THEN %LET Y2 =%EVAL(&BYR. + 1);
%ELSE %LET Y2 =&BYR.;
%LET M3A = %EVAL(&BMON + 2);

%IF &M3A. GE 13 %THEN %LET M3B =%EVAL(&M3A. – 12);
%ELSE %LET M3B =&M3A.;
%IF &M3B. GE 10 %THEN %LET M3 =&M3B.;
%ELSE %LET M3 =&A.&M3B.;
%IF &M3A. GE 13 %THEN %LET Y3 =%EVAL(&BYR. + 1);
%ELSE %LET Y3 =&BYR.;
%LET M4A = %EVAL(&BMON. + 3);
%IF &M4A. GE 13 %THEN %LET M4B = %EVAL(&M4A. – 12);
%ELSE %LET M4B = &M4A.;
%IF &M4B. GE 10 %THEN %LET M4 =&M4B.;
%ELSE %LET M4 =&A.&M4B.;
%IF &M4A. GE 13 %THEN %LET Y4 =%EVAL(&BYR. + 1);
%ELSE %LET Y4 =&BYR.;
%LET M5A = %EVAL(&BMON. + 4);
%IF &M5A. GE 13 %THEN %LET M5B =%EVAL(&M5A. – 12);
%ELSE %LET M5B =&M5A.;
%IF &M5B. GE 10 %THEN %LET M5 =&M5B.;
%ELSE %LET M5 =&A.&M5B.;
%IF &M5A. GE 13 %THEN %LET Y5=%EVAL(&BYR. + 1);
%ELSE %LET Y5 =&BYR.;
%LET M6A = %EVAL(&BMON. + 5);
%IF &M6A. GE 13 %THEN %LET M6B =%EVAL(&M6A. – 12);
%ELSE %LET M6B =&M6A.;
%IF &M6B. GE 10 %THEN %LET M6 =&M6B.;
%ELSE %LET M6 =&A.&M6B.;
%IF &M6A. GE 13 %THEN %LET Y6 =%EVAL(&BYR. + 1);
%ELSE %LET Y6 =&BYR.;
%LET M7A = %EVAL(&BMON. + 6);
%IF &M7A. GE 13 %THEN %LET M7B =%EVAL(&M7A. – 12);
%ELSE %LET M7B =&M7A.;
%IF &M7B. GE 10 %THEN %LET M7 =&M7B.;
%ELSE %LET M7 =&A.&M7B.;
%IF &M7A. GE 13 %THEN %LET Y7 =%EVAL(&BYR. + 1);
%ELSE %LET Y7 =&BYR.;
%LET M8A = %EVAL(&BMON. + 7);
%IF &M8A. GE 13 %THEN %LET M8B =%EVAL(&M8A. – 12);
%ELSE %LET M8B =&M8A.;
%IF &M8B. GE 10 %THEN %LET M8 =&M8B.;
%ELSE %LET M8 =&A.&M8B.;

%IF &M8A. GE 13 %THEN %LET Y8 =%EVAL(&BYR. + 1);
%ELSE %LET Y8 =&BYR.;
%LET M9A = %EVAL(&BMON. + 8);
%IF &M9A. GE 13 %THEN %LET M9B =%EVAL(&M9A. – 12);
%ELSE %LET M9B =&M9A.;
%IF &M9B. GE 10 %THEN %LET M9 =&M9B.;
%ELSE %LET M9 =&A.&M9B.;
%IF &M9A. GE 13 %THEN %LET Y9 =%EVAL(&BYR. + 1);
%ELSE %LET Y9 =&BYR.;
%LET M10A = %EVAL(&BMON. + 9);
%IF &M10A. GE 13 %THEN %LET M10B =%EVAL(&M10A. – 12);
%ELSE %LET M10B =&M10A.;
%IF &M10B. GE 10 %THEN %LET M10 =&M10B.;
%ELSE %LET M10 =&A.&M10B;
%IF &M10A. GE 13 %THEN %LET Y10 =%EVAL(&BYR. + 1);
%ELSE %LET Y10 =&BYR.;
%LET M11A = %EVAL(&BMON. + 10);
%IF &M11A. GE 13 %THEN %LET M11B =%EVAL(&M11A. – 12);
%ELSE %LET M11B =&M11A.;
%IF &M11B. GE 10 %THEN %LET M11 =&M11B.;
%ELSE %LET M11 =&A.&M11B.;
%IF &M11A. GE 13 %THEN %LET Y11 = %EVAL(&BYR. + 1);
%ELSE %LET Y11 = &BYR.;
%LET M12A = %EVAL(&BMON. + 11);
%IF &M12A. GE 13 %THEN %LET M12B =%EVAL(&M12A. – 12);
%ELSE %LET M12B =&M12A.;
%IF &M12B. GE 10 %THEN %LET M12 =&M12B.;
%ELSE %LET M12 =&A.&M12B.;
%IF &M12A. GE 13 %THEN %LET Y12 =%EVAL(&BYR. + 1);
%ELSE %LET Y12 =&BYR.;
%LET Y13 = %EVAL(&BYR. + 1);
%LET Y14 = %EVAL(&Y2. + 1);
%LET Y15 = %EVAL(&Y3. + 1);
%LET Y16 = %EVAL(&Y4. + 1);
%LET Y17 = %EVAL(&Y5. + 1);
%LET Y18 = %EVAL(&Y6. + 1);
%LET Y19 = %EVAL(&Y7. + 1);
%LET Y20 = %EVAL(&Y8. + 1);
%LET Y21 = %EVAL(&Y9. + 1);
%LET Y22 = %EVAL(&Y10. + 1);
%LET Y23 = %EVAL(&Y11. + 1);
%LET Y24 = %EVAL(&Y12. + 1);
%LET MON1 = &BYR.&BMON.;
%LET MON2 = &Y2.&M2.;
%LET MON3 = &Y3.&M3.;
%LET MON4 = &Y4.&M4.;
%LET MON5 = &Y5.&M5.;
%LET MON6 = &Y6.&M6.;
%LET MON7 = &Y7.&M7.;
%LET MON8 = &Y8.&M8.;
%LET MON9 = &Y9.&M9.;
%LET MON10 = &Y10.&M10.;
%LET MON11 = &Y11.&M11.;
%LET MON12 = &Y12.&M12.;
%LET MON13 = &Y13.&BMON.;
%LET MON14 = &Y14.&M2.;
%LET MON15 = &Y15.&M3.;
%LET MON16 = &Y16.&M4.;
%LET MON17 = &Y17.&M5.;
%LET MON18 = &Y18.&M6.;
%LET MON19 = &Y19.&M7.;
%LET MON20 = &Y20.&M8.;
%LET MON21 = &Y21.&M9.;
%LET MON22 = &Y22.&M10.;
%LET MON23 = &Y23.&M11.;
%LET MON24 = &Y24.&M12.;
%LET FMT_BDATE = &BDATE.;
%LET FMT_EDATE = &EDATE.;
%MEND;
%DATES
%PUT &TODAY1.;
%PUT &YEARA.;
%PUT &MONA.;
%PUT &MON1.;
%PUT &YR1.;
%PUT &DAY.;
%PUT &MON2.;
%PUT &YR2.;
%PUT &QBYR.;
%PUT &BEGPRD.;
%PUT &CQMON.;
%PUT &CQMON1.;
%PUT &CQYR.;
%PUT &FBDATE.;
%PUT &FEDATE.;
%PUT &LFBDATE.;
%PUT &LEDATE.;
%PUT &LFEDATE.;
%PUT &Q1MON.;
%PUT &Q1MON1.;
%PUT &Q2MON.;
%PUT &Q2MON1.;
%PUT &Q3MON.;
%PUT &Q3MON1.;
%PUT &EYR.;
%PUT &EMON.;
%PUT &BMON1A.;
%PUT &BMON1.;
%PUT &BYR1.;
%PUT &EDATE.;
%PUT &BDATE.;
%PUT &BYR.;
%PUT &BMON.;
%PUT &M2A.;
%PUT &M2B.;
%PUT &M2.;
%PUT &Y2.;
%PUT &M3A.;
%PUT &M3B.;
%PUT &M3.;
%PUT &Y3.;
%PUT &M4A.;
%PUT &M4B.;
%PUT &M4.;
%PUT &Y4.;
%PUT &M5A.;
%PUT &M5B.;
%PUT &M5.;
%PUT &Y5.;
%PUT &M6A.;
%PUT &M6B.;
%PUT &M6.;
%PUT &Y6.;
%PUT &M7A.;
%PUT &M7B.;
%PUT &M7.;
%PUT &Y7.;
%PUT &M8A.;
%PUT &M8B.;
%PUT &M8.;
%PUT &Y8.;
%PUT &M9A.;
%PUT &M9B.;
%PUT &M9.;
%PUT &Y9.;
%PUT &M10A.;
%PUT &M10B.;
%PUT &M10.;
%PUT &Y10.;
%PUT &M11A.;
%PUT &M11B.;
%PUT &M11.;
%PUT &Y11.;
%PUT &M12A.;
%PUT &M12B.;
%PUT &M12.;
%PUT &Y13.;
%PUT &Y14.;
%PUT &Y15.;
%PUT &Y16.;
%PUT &Y17.;
%PUT &Y18.;
%PUT &Y19.;
%PUT &Y20.;
%PUT &Y21.;
%PUT &Y22.;
%PUT &Y23.;
%PUT &Y24.;
%PUT &MON1.;
%PUT &MON2.;
%PUT &MON3.;
%PUT &MON4.;
%PUT &MON5.;
%PUT &MON6.;
%PUT &MON7.;
%PUT &MON8.;
%PUT &MON9.;
%PUT &MON10.;
%PUT &MON11.;
%PUT &MON12.;
%PUT &MON13.;
%PUT &MON14.;
%PUT &MON15.;
%PUT &MON16.;
%PUT &MON17.;
%PUT &MON18.;
%PUT &MON19.;
%PUT &MON20.;
%PUT &MON21.;
%PUT &MON22.;
%PUT &MON23.;
%PUT &MON24.;
%PUT &FMT_BDATE.;
%PUT &FMT_EDATE.;