/****************************************************************************/

/*   TITLE:  USING FUNCTIONS WITH %SYSFUNC                                  */

/*   AUTHOR: FOSTER KERRISON                                                */

/*   PHONE:  603-520-7520                                                   */

/*   EMAIL:  KERRISON@METROCAST.NET                                         */

/*   WEB:    WWW.FOSTERKERRISON.COM                                         */

/*   PROGRAM: THIS PROGRAM ILUSTRATES HOW %SYSFUNC CAN BE USED WITH         */

/*            DIFFERENT FUNCTIONS, HOW %SYSFUNC CAN BE NESTED IN            */

/*            ONE LINE OF CODE, AND HOW A DATE VALUE CAN BE CHANGED.        */ 

/*   WARRANTY: NO WARRANTY IS IMPLIED OR EXPRESSED                          */

/****************************************************************************/

 

                             /* USING A DATASTEP */

  /* A DATASTEP ASSIGNS THE NAME, TRANSLATES THE SPACES, AND SYMPUTS THE RESULT */

DATA NOM ;

  NAMED = '   PADDIE   ' ;

  NEWNAME = TRANSLATE(NAMED,"X"," ") ;

  CALL SYMPUT('NOMAMA',NEWNAME) ;

RUN ;

 

  /* THE RESULTING MACRO VAR NAME IS NOMAMA */

%PUT &NOMAMA ;

 

  /* TAKE ALL THE "Xs" OUT USING THE COMPRESS FUNCTION */     

%let MAMA = %sysfunc(COMPRESS(&NOMAMA,X));

%PUT *&MAMA* ;

 

  /* TRANSLATE THE SPACES BACK INTO Xs */

%let MAMA = %sysfunc(TRANSLATE(&NOMAMA,X, ));

%PUT &MAMA ;

 

  /* THAT IS THE END OF A MIXED DATASTEP AND OPEN CODE EXAMPLE */

 

***************************************************************************;

 

  /* NOW LETS LOOK AT AN OPEN CODE EXAMPLE TO ACHIEVE THE SAME RESULT*/

  /* STEP 1: ASSIGN THE VALUE */

%let BENIGN =  '   PADDIE   ' ;

%put BENIGN = &BENIGN ;

 

  /* NOW USE TRANSLATE TO CHANGE THE SPACE TO X */

%let NASTY = %sysfunc(translate(&BENIGN,"X"," " )) ;

%put NASTY = &NASTY;

 

  /* NOW TRANSLATE THE X TO SPACES */

%let BENIGN2 = %sysfunc(translate(&NASTY," " ,"X")) ;

%put BENIGN2 = &BENIGN2;

 

  /* AND FINALLY GET RID OF THE QUOTES */

%let BENIGN2 = %sysfunc(compress(&benign2,"'")) ;

%put BENIGN2 = &BENIGN2;

 

  /* COMBINE ALL OF THE ABOVE INTO ONE LINE OF CODE*/

  /* THE KEY IS THAT EACH FUNCTION, MUST HAVE A %SYSFUNC NESTED INSIDE THE OTHER */

  /* YOU CANNOT HAVE ONE %SYSFUNC STATEMENT TO COVER ALL THE FUNCTIONS */

  /* THE SYNTAX IS CRITICAL */

%let ONELINE= %sysfunc(compress(%sysfunc(translate((%sysfunc(translate(&BENIGN,"X"," ")))," ","X")),"'() "))  ;

%put ONELINE = &ONELINE ;

 

*****************************************************************************************;

 

  /* USE %SYSFUNC TO CONVERT DATES INTO SAS DATES */

           /* ASSIGN THE DATES */

  

%let txtdate = 120403    ; * MMDDYY6 ;

%let trydate = 12/04/03  ; * MMDDYY8 ;

 

/* A MACRO APPROACH ... */

 

%macro change_date (redate,sasfmt) ;

   %let txtdate = %sysfunc(inputn(&&redate,&sasfmt)) ;

%mend change_date  ;

 

%change_date (&txtdate,mmddyy6) ;

 

   /* USING SYSFUNC IN OPEN CODE ... */

 

  %let trydate = %sysfunc(inputn(&trydate,mmddyy8)) ;

 

%put THE MACRO CONVERTED THE TXTDATE TO: &txtdate ;

%put THE OPEN CODE CONVERTED THE DATE TO: &trydate ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/****************************************************************************/

/*   TITLE:  TESTING DATASETS WITH %SYSFUNC                                 */

/*   AUTHOR: FOSTER KERRISON                                                */ 

/*   PHONE:  603-520-7520                                                   */

/*   EMAIL:  KERRISON@METROCAST.NET                                         */

/*   WEB:    WWW.FOSTERKERRISON.COM                                         */

/*   PROGRAM: THIS PROGRAM ILUSTRATES HOW %SYSFUNC CAN BE USED TO EXPLORE   */

/*            SAS DATASETS. IT ALSO SHOWS HOW TO USE THE WINDOW IN SAS      */ 

/*   WARRANTY: NO WARRANTY IS IMPLIED OR EXPRESSED                          */

/****************************************************************************/

 

    /* MANUALLY ASSIGN THE DATASET NAME */

%GLOBAL DS OK ;

 

  /* OUTPUT A WINDOW AND SEEK INPUT */

    %window AAGGH IROW = 0 ROWS = 150 ICOLUMN = 0 COLUMNS = 125 COLOR = GREY

 

        #4  @30 'THIS IS YOUR DATASET TEST' attr = underline COLOR = GREEN

 

        #12 @12 'ENTER THE DATASET NAME'

            #14 @15 "THE LIBRARY NAME IS? "

                 attr=UNDERLINE c = BLUE

                 LIBR 20 attr=UNDERLINE c = BLACK REQUIRED = YES

        #19 @15 "THE DATASET NAME IS? "

                 attr=UNDERLINE c = BLUE

                 DSNM 20 attr=UNDERLINE c = BLACK REQUIRED = YES

            #25 @25  "PRESS ENTER TO CONTINUE" 

        ;     

    %display AAGGH ;

 

      /* CREATE THE MACROVAR AND POPULATE THE VALUE */

      %LET NOM1 = &LIBR ;

      %LET NOM2 = &DSNM ;

      %LET ds = &NOM1..&NOM2 ;

      %LET OK = %SYSFUNC(EXIST(&DS)) ;

 

%MACRO TESTER ;

 

%DO R = 1 %TO 3 ;

 

%IF %SYSFUNC(EXIST(&DS)) NE 1 %THEN %DO ;

 

/* OUTPUT A WINDOW WITH THE BAD NEWS AND SEEK NEW INPUT */

    %window AAGGH IROW = 0 ROWS = 150 ICOLUMN = 0 COLUMNS = 125 COLOR = GREY

 

        #4  @30 'THIS IS YOUR DATASET REPORT' attr = underline COLOR = GREEN

 

        #10  @12 "OOPS! "

        #12 @12 "THE DATASET: &DS DOES NOT EXIST ON YOUR SYSTEM" 

        #14 @12 'PLEASE CHECK THAT YOU TYPED THE CORRECT DATASET NAME'

        #16 @12 'RE-ENTER THE DATASET NAME TO TRY AGAIN '

            #18 @12 'YOU GET THREE TRIES BEFORE THE PROGRAM SHUTS DOWN '

            #20 @15 "THE LIBRARY NAME IS? "

                 attr=UNDERLINE c = BLUE

                 LIBR 20 attr=UNDERLINE c = white REQUIRED = YES

        #25 @15 "THE DATASET NAME IS? "

                 attr=UNDERLINE c = BLUE

                 DSNM 20 attr=UNDERLINE c = white REQUIRED = YES

        ;     

    %display AAGGH ;

 

      /* RE-POPULATE THE VALUE */

      %LET NOM1 = &LIBR ;

      %LET NOM2 = &DSNM ;

      %LET ds = &NOM1..&NOM2 ;

                 

%END ;

 

%END ;

 

%IF %SYSFUNC(EXIST(&DS)) NE 1 %THEN %DO ;

 

/* OUTPUT A WINDOW WITH THE BAD NEWS THAT IT IS CLOSING DOWN */

    %window AAGGH IROW = 0 ROWS = 150 ICOLUMN = 0 COLUMNS = 125 COLOR = GREY

 

        #4  @30 'THIS IS YOUR DATASET REPORT' attr = underline COLOR = GREEN

 

        #14 @12 "              UNFORTUNATELY YOUR DATASET DOES NOT EXIST            "

            #16 @12 "THIS PROGRAM IS NOW GOING TO CLOSE TO ALLOW YOU TO CHECK THE SYSTEM"

        ;     

    %display AAGGH ;

 

%END ;

 

  /* IF THE DATASET EXISTS THIS WILL LOOK AT IT AND PRODUCE A REPORT */

%IF %SYSFUNC(EXIST(&DS)) = 1 %THEN %DO ;

 

    /* ASSIGN THE DATASET NAME */

      %LET DSNAME = &DS ;     

  /* OPEN THE DATASET */

      %LET DSID = %SYSFUNC(OPEN(&DSNAME)) ;          

  /* IF THE DATASET OPENED ...*/

      %IF &DSID %THEN %DO ;        

  /* DOES IT HAVE OBS? */

    %LET ANY = %SYSFUNC(ATTRN(&DSID,ANY)) ;     

  /* HOW MANY OBS DOES IT HAVE? */

      %LET OBS = %SYSFUNC(ATTRN(&DSID,NOBS)) ;     

  /* HOW MANY VARS DOES IT HAVE? */

      %LET VAR = %SYSFUNC(ATTRN(&DSID,NVARS)) ;    

  /* WHAT IS THE LRECL? */

      %LET LREC= %SYSFUNC(ATTRN(&DSID,LRECL)) ;    

  /* WHEN WAS IT CREATED? */

      %LET DTEC = %SYSFUNC(ATTRN(&DSID,CRDTE)) ;    

  /* WHAT WAS THE DATE AND TIME THAT IT WAS MODIFIED? */

      %LET DTE = %SYSFUNC(ATTRN(&DSID,MODTE)) ;    

  /* IS IT PASSWORD PROTECTED? */

      %LET PWD = %SYSFUNC(ATTRN(&DSID,ALTERPW)) ;    

  /* WHAT ENGINE WAS USED TO CREATE IT? NOTE: ATTRC, NOT ATTRN*/

      %LET ENG = %SYSFUNC(ATTRC(&DSID,ENGINE)) ;    

  /* HAS IT BEEN SORTED? NOTE: ATTRC, NOT ATTRN*/

      %LET SRT = %SYSFUNC(ATTRC(&DSID,SORTEDBY)) ;    

  /* WHAT TYPE OF DATASET IS IT? NOTE: ATTRC, NOT ATTRN*/

      %LET MDE = %SYSFUNC(ATTRC(&DSID,MODE)) ;    

 

      /* CLOSE THE DATASET - A CRITICAL STEP!*/

    %LET RC  = %SYSFUNC(CLOSE(&DSID)) ;            

      %END ;

 

  /* CONVERT THE SASDATE TO SOMETHING WE CAN READ */

  /* THIS IS FOR THE CREATION DATE */

%LET DTXC = %SYSFUNC(PUTN(&DTEC,DATETIME25.));        

  /* THIS IS FOR THE MODIFIED DATE */

%LET DTX = %SYSFUNC(PUTN(&DTE,DATETIME25.));        

 

  /* LOOK AT THE RC FOR ANY */

%IF &ANY = 1 %THEN %DO ;

  %LET ANX = THE DATASET HAS OBSERVATIONS ;

%END ;

 

%ELSE %DO ;

  %LET ANX = THE DATASET HAS NO OBSERVATIONS ;

%END ;

 

  /* TEST THE PASSWORD PROTECTION */

%IF &PWD = 1 %THEN %DO ;

  %LET PWX = A PASSWORD IS NEEDED TO ALTER THIS DATASET ;

%END ;

 

%ELSE %DO ;

  %LET PWX = NO PASSWORD IS REQUIRED TO ALTER THIS DATASET ;

%END ;

 

  /* TEST TO SEE IF THE DATASET HAS BEEN MODIFIED */

  /* IF IT WAS NOT MODIFIED */

%IF &DTEC = &DTE %THEN %DO ;

  %LET MOD = THE DATASET HAS NOT BEEN MODIFIED SINCE IT WAS CREATED ;

%END ;

 

  /* IF IT WAS MODIFIED */

%ELSE %IF &DTEC NE &DTE %THEN %DO ;

  %LET MOD = THE DATASET WAS LAST MODIFIED ON: &DTX ;          

%END ;

 

  /* TEST TO SEE IF IT WAS SORTED */

%IF %LENGTH(&SRT) %THEN %DO;

  %LET SXT = THE DATASET IS SORTED BY &SRT ;

%END ;

 

%ELSE %DO ;

  %LET SXT = THE DATASET HAS NOT BEEN SORTED ;

%END ;

 

 

  /*THIS IS THE REPORT ON THE GOOD DATASET */

%window BLOW IROW = 0 ROWS = 150 ICOLUMN = 0 COLUMNS = 125 COLOR = GREY

 

        #4  @20 'THIS IS YOUR DATASET REPORT' attr = underline COLOR = GREEN

        #6  @12 "GOOD NEWS! "

        #8  @12 "THE DATASET: &DSNAME EXISTS ON YOUR SYSTEM" 

        #10 @12 'FOR YOUR INFORMATION:'

        #12 @12 "THE SAS ENGINE USED TO ACCESS THE DATASET WAS: &ENG "

            #14 @12 "&ANX"

            #16 @16 "THERE ARE: &OBS OBSERVATIONS "

            #18 @12 "THERE ARE: &VAR VARIABLES    "

        #20 @12 "THE LRECL IS: &LREC          "  

            #22 @12 "THE DATASET WAS CREATED ON: &DTXC "

            #24 @12 "&PWX "

            #26 @12 "&MOD "

            #28 @12 "&SXT "

            #30 @12 "THE DATASET MODE WHEN OPENED WAS &MDE"

        ;

%display BLOW ;

 

  /* THIS IS A SECOND REPORT ON THE GOOD DATASET */

%window BLOW IROW = 0 ROWS = 150 ICOLUMN = 0 COLUMNS = 125 COLOR = GREY