*
;
/* It creates FORMATS from SAS Datasets.
This macro requires proc format support of CNTLIN.
I have this macro loaded in my autocall library, it comes in very handly.
Michael R. Gibson
StorageTek, Louisville CO USA
michael_gibson@stortek.com
----------------------------------- begin --------------------------------*/
/* --------------------------------------------------------------------------
NAME: %makefmt May 26, 1994 by Michael Gibson
DESC: This macro creates a format from a SAS data set or view.
It does a SORT NODUPKEY to make sure formatting unique ranges.
USAGE: %makefmt( NAME, DSN, START=, LABEL=
<, TYPE=, PERM=, END=, OTHER=, PRINT= > );
PARMS: - Required -
NAME - Name of format. ( "$" not needed see "TYPE" below ).
( ie: MYFMT equates to $MYFMT for character formats or
MYFMT for numeric formats. )
DSN - Name of SAS data set or view used to create format.
Single level name assumes "work."
( ie: "sasuser.myfmt" pulls from libref "SASUSER"
while "myfmt" pulls from "WORK." )
START - Name of the variable used for the start of the range
values or single value. ( left-of-equal-sign value )
( ie: START=MODEL where MODEL is a variable on DSN )
LABEL - Name of the variable used for the formatted-value (label)
or a quoted value. ( right-of-equal-sign value )
( ie: LABEL=DESC where DESC is a variable on DSN or
LABEL="YES" see selection example below )
- Optional _
TYPE - Type of format. N = Numeric Format
P = Picture Format
I = Numeric Informat
C = Character Format ( Default )
J = Character Informat
When type is "C" or "J" the resulting format is prefixed
with a dollar sign ( $ ).
PERM - Flag to create a permanent or temporary format.
N = temporary format created. ( Default )
Y = permanent format created must have
libref "LIBRARY" allocated via
libname statement.
END - Name of the variable used for the end of the range
values. ( left-of-equal-sign value )
OTHER - A quoted value for the OTHER option of formats.
PRINT - Flag to print formats as they are created.
N = Do not print format. ( Default )
Y = Print the format.
EXAMPLES: %makefmt( myfmt, sasuser.myfmt, start=model, label=desc );
Generates a character format called "$myfmt" from dsn
"sasuser.myfmt" using the variable "model" for range
values and the variable "desc" for label values.
%makefmt( myfmt, sasuser.myfmt, start=model, label="YES" );
Generates a character format called "$myfmt" from dsn
"sasuser.myfmt" using the variable "model" for range
values and assigns "YES" as label values constants.
------------------------------------------------------------------------- */
%macro makefmt
( fmtname, dsn, start=, label=,
type=C, perm=N, end=, other=, print=N );
%let type = %upcase( &type );
%let perm = %upcase( &perm );
%let print = %upcase( &print );
%let other = %quote( &other );
%if %substr( &fmtname, 1,1 ) eq %str($) %then %do;
%let type = C;
%let fmtname = %substr( &fmtname, 2 );
%end;
DATA WORK._FMT_; /* create a dsn used on cntlin= of PROC FORMAT */
LENGTH START LABEL $200;
RETAIN FMTNAME "&fmtname" TYPE "&type";
KEEP FMTNAME TYPE START LABEL
%if &other ne %str( ) %then %str( HLO);
%if &end ne %str( ) %then %str( END);
%str(;);
SET &dsn END=EOF;
START = &start;
%if &end ne %str( ) %then %str( END=&end;);
LABEL = &label;
OUTPUT;
%if &other ne %str( ) %then %do;
IF EOF THEN DO;
START = 'OTHER';
LABEL = "&other";
HLO='O';
OUTPUT;
END;
%end;
RUN;
PROC SORT DATA=WORK._FMT_ NODUPKEY; /* remove dups on the start value */
by START;
RUN;
PROC FORMAT CNTLIN=WORK._FMT_
%if &perm eq %str(Y) %then %str( LIBRARY=LIBRARY );
%if &print eq %str(Y) %then %str( FMTLIB );
%str(;);
RUN;
%mend makefmt;
/* -------------------------------- end --------------------------------- */
*;