### # ### # # # # # # # # # # # ##### # # # # # # # # # # # ### # # ### ##### #### ##### # # # # # # # # # # # #### # # # # # # # # ##### #### ##### ### # # #### # # ### # # ##### ##### ### #### # # ## # # # ## ## # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # ## # # # # # # # ## # # # # #### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # # #### # # ### # # ##### # ### # # #### ### ##### # # ##### ### # # ### ### ##### # # # # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # #### # # # # ## # # ##### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ### ##### # # # ### # # ### ### # ##### # ##### #### ### ### #### ##### ##### # # ### # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # #### # # #### # # #### #### #### # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### ##### # ### ### # # ##### ##### # # ### ### ### #### ##### #### ##### ##### # # ### # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # #### # #### # # # ## # ### # # # # # # # # # # # # # # # # # # # # # # # # # # ### ### # # ##### # # ##### # # ### #### #### ##### ##### ##### # # ### # # #### ### # # # # # # # # # # # ## ## # # # # # # # # # # # # # # # # # # # # #### #### #### #### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # ##### # # ### # # #### ### #### ##### # # ##### # # ### # # # # # # # # # # # # # # # # # # # #### #### ## #### # # # # # # # # # # # # # # # # # # # # # ##### # ### Tip1 -- If you can get a second monitor then do it: ===================================================== ### # # #### # # ### # # ##### ##### ### #### # # ## # # # ## ## # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # ## # ## # # # # # # # ## # # # # #### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # # #### # # ### # # ##### # ### # # The single greatest productivity increase occurs when a second monitor is used with display manager. I run SAS under WinXP at home with two 21 inch displays. The two monitors should be the same size, otherwise when you stretch the SAS display manager rectangle across screens you lose text on the smaller screen. It is very convienient to have a persistent log and output screen. Even this presentation would benifit from asecon screen. Tip #2 -- Highlighting Lines to submit or edit ============================================== #### ### ##### # # ##### ### # # ### ### ##### # # # # # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # #### # # # # ## # # ##### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ### ##### # # # ### # # ### ### # On UNIX or Windows you can highlight lines or rectangles within lines. You can then submit or apply most editor commands to just the highlighted area. RMB - SUBMIT;rec; * will submit entire editor program or just highlighted txt; SHF RMB - notesubmit; ctl rmb - subtop; mmb: inc &pgm; shf mmb : file &pgm..sas r;sod; * sod does versioning; ctl mmb : dir sasuser; * check profile for latest version of program; ctl t : note t.t; * open another editor panel t.t; ctl u : note u.u; * open another editor panel u.u; ?? CTL U - :MCU CTL L - :MLC ALT F1 - :LC ALT F2 - :LU ALT F3 - :TF Tip #3 -- SAS program versioning ========================================================================== The following set of command line macros will version your SAS programs in sasuser.profile catalog. Program test.sas will be saved as test1 in the first save test2 on second save ... etc as source entries. Macro string &pgm.&odd is the key to versioning. You need to save your programs using shf mmb. * autoexec.sas has to global these macro variables; %global pgm odd; %lpg; * this includes the last program you were workin on in the pgm editor; * Macro var is Pgm populated in several ways * usually by %global pgm;%let pgm=%sysmacroname; since I almost always embed my code in a macro; * or if you do not use a macros %let pgm=test.sas; * you need these programs in your autocall library; %macro sod/cmd; %let odd=%eval(&odd+1); save &pgm.&odd r; %mend sod; * global macro variables pgm and odd are saved from SAS session to SAS session; Tip #3 -- Very fast navigation among log, pgm, output, note, viewtable etc ========================================================================== ##### # ##### #### ### ### #### ##### ##### # # ### # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # #### # # #### # # #### #### #### # ## # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### ##### # ### ### # # ##### ##### # # ### If you have pmenus off and command lines on, then simple two or three letter acronyms will switch you from command line to command line. In windows the command 'log' does three functions; bring log window on top, sets keyboard focus and puts you on the log command line. This is much faster then using the mouse. SAS short commands My short commands ================== ================================== lg - log log - log window pg - pg pgm - pgm window np - notepad note - note window fl - file &pgm.sas r;sod; out - output sit - save it r man prnt sbk - save bkp r var - tst prntv gupg - inc &upg fse - tst frq supg - file &upg fsv - tst cnt fsl - fslist libn rptv vu - viewt filen tpl - template pr - print fslist sv - save pgm nts - notesubmit viewt cp - copy pgm ud - undo print utlcona rd - redo Tip #4 -- You can write editor scripts/macros for command line execution. ================================================================= ### ### #### ##### #### ##### ##### # # ### # # # # # # # # # # # ## # # # # # # # # # # # # # # # # # # #### # #### # # # ## # ### # # # # # # # # # # # # # # # # # # # # # # # # # # ### ### # # ##### # # ##### # # ### Most open code macro statements and macros can be executed on the command line, including sysfunc and sysevalf: try %put %sysfunc(probnorm(1.96)) on the command line. The result will be displayed in the log and on lower window bar. You can define and execute macros on the command line. You can also execute your scripts from within your program using the DM command. Example 1 -- Just a dumb script -------------------------------- 1;F ' ';MARK;HOME;2;HOME;MARK;HOME;STORE;HOME;UNMARK;TOP;HOME;PASTE;:ts; If the first line in active editor contains 000001 %Macro MyLongMacroName This script will put MyLongMacroName into the paste buffer and on the command line. You can type 'inc' in front of the progtam to get the code; You can then paste MyLongMacroName anywhere you want. (This only works on windows). Try it, just copy the one line script to the command line. Example 2 - Macro Script on Command Line Type the following on the command line and hit enter then look at the log. This is a very possible contruct( see utliota) %macro lpy;%do i=1 %to 10; %put &i; %end; %mend lpy; %lpy; Example 3 -- Clear everthing, run code and recall pgm ----------------------------------------------------- LOG;CLEAR;OUT;CLEAR;PGM;SUB;REC; /# run code in pgm window #/ LOG;CLEAR;OUT;CLEAR;PGM;NOTESUBMIT; /# run code in notepad window #/ Example 4 -- Proc Contents output into NotePad window ------------------------------------------------------ Command ==> utlcon work.tst %macro utlcon(AFSTR1) / cmd des ="command macro to submit proc contents"; note;zoom;notesubmit '%utlcona'; %mend utlcon; %macro utlcona / des="called by command macro utlcon"; proc printto print="delete.sas" new;run; proc contents data= %str(&afstr1) position;run; proc printto;run; dm "note;inc 'delete.sas';"; run; %mend utlcona; Example 4 -- Opens windows explorer, click on filename and ------------------------------------------------------------ the filename with full path will be stored in the SAS paste buffer (code to long to enclose ). Paste it where you want it. Example 5 -- Make your own commands ------------------------------------ %macro lg / cmd des="Command shortcut to log screen"; log;top;home; %mend lg; Tip #5 -- Use the prefix area and command line instead of command bar ==================================================================== #### #### ##### ##### ##### # # ### # # #### ### # # # # # # # # # # # ## ## # # # # # # # # # # # # # # # # # # # # #### #### #### #### # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ##### # ##### # # ### # # #### ### The prefix area Many of these commands can be put on function keys using a ':', ie :ts. D99---- Delete next 99 lines (also could cut with mouse) I999--- Insert 999 blank lines useful when autoadd is set IB55--- Insert 55 lines before C3----- Copy next three lines to some target A000102 Target for line copy or include file (copy after) A000102 Target for line copy or include file (copy before) M------ Move this line somewhere M3----- Move next 3 lines somewhere O3----- Move source lines over these lines R3----- Replicate the next 3 lines DD00103 Block delete CC00103 Block Copy MM00103 Block Move 0000104 0000104 0000104 DD----- CC----- MM----- OO00103 Target Over RR3---- Block Replicate 0000104 0000104 OO----- RR----- (3----- Shift left first 3 columns into bit bucket (distructive shift) )3----- Shift right first 3 columns (distructive shift) >5----- Nondistructive shift right <5----- Nondistructive shift left >>5---- Non distructive shift right of a block of commands 0000101 0000102 >>----- <<,)),(( Similar to single character versions UC----- Upper case line - more useful on function key as :UC UC26--- Upper case next 26 lines LC----- Lower case line LC26 LLC---- Block of lines -lower caSE UUC TF----- Text flow lines until blank line TS----- Text split at cursor better on function key as :tf mask - build template for entering data 4. Misc command line actions (in order of usefullness) ? - previous command history subtop - submit top line of editor rchange - change on function key hit rfind - find on function key hit save prg /# save program in your profile #/ copy prg /# recalls program from your profile #/ change - c today yesterday ic all ( ignore case all) cols reset keys top bot n - scroll down to line n left n right n spell all - check spelling of all words in editor autoadd - add aline at a time to editor ( usewith mask and bounds ) vscroll 25 - set scroll amounts for forward and backward hscroll 10 backward max n forward max n bounds mask copy paste find - f 'data' first last next prev prefix suffix word find 'Mac' prefix change - c todat yesterday ic all rchange - change on function key hit rfind - find on function key hit mark - highlight string, lines for submit or edit mark block - highlight rectangle within editor does not have to be full lines store zoom z pmenu off /# functon key #/ up 2 pmenu on down 4 end CAPS on/off print home submit cursor unmark unmark all nums on/off tabs %let redo viewt #### ##### # # ##### # # ### # # # # # # # # # # # # # # # # # # # #### #### ## #### # # # # # # # # # # # # # # # # # # # # # ##### # ### I turn off all vertical and horizontal scrool bars, insted I use F1 and F2, Page up and page down. F1 LEFT 2 F2 RIGHT 2 F3 END F4 ~/*'*/ *);*/;/* " */;%MEND;QUIT;END;RUN;*'';W1ACTIVE; DM; F5 RFIND F6 RCHANGE F7 1;F ' ';MARK;HOME;2;HOME;MARK;HOME;STORE;HOME;UNMARK;TOP;HOME;PASTE;:ts; F8 HOME;LOG;TOP;home;FIND "ERROR' F9 DOWN F11 NOTESUBMIT F12 LOG;CLEAR;OUT;CLEAR;PGM;SUB;REC;log; SHF F1 inc &upg SHF F2 pmenu off SHF F3 pmenu on SHF F6 top;home;copy &upg; SHF F7 inc tips SHF F8 subtop ALT F1 :lc ALT F2 :uc ALT F3 :tf CTL D DOWN 1 CTL I ~/*-----------------------------------------*\ CTL J ~| | CTL K ~\*-----------------------------------------*/ CTL L :mlc CTL U :mcu UTLIOTA %macro utl_dmkeys ; /*------------------------------------------------------------*\ | | | | | My Desktop ( MVS/VM/WIN/UNIX/TELNET COMMON INTERFACE ) | | | | The objective is four 8.5 by 11 screens with 80 cols | | and 60 lines. ( 2 22 inch Monitors) . Four sheets of | | paper. | | | | | | PGM EDITOR NOTEPAD EDITOR LOG OUTPUT | | |--------------|---------- ---|---------------|----------- | | | | | | BLUE BANNER SAS LINE (Wish I could combine with next line) | | File View Tools Run Solutions Window Help | | COMMAND ====> | | 00001 00001 | | 00002 00002 | | ... ... | | ... ... | | ... ... | | ... ... | | 00060 00060 | | RESULTS OUTPUT PGM NOTE LOG | | AutoSave Complete D:\UTL (autohide win) | | | | | |==============================================================| | | | Why this interface: | | | | I wanted one interface for MVS/VM/UNIX/WIN/TELNET | | | | | | Key Points: | | | | It is slower to take your fingers from the keyboard | | to the mouse and and click on icons/pull down menus. | | | | Consider that I do not have a horizontal scroll bar. | | If you want to go right just hold down the F2 key. | | This moves right in increments of one column. | | This gives better control then the horizonal scroll bar | | and gives you one more edit line. You need a fast PC | | to handle the one col repeats created by holding | | down the function key. | | | | It is quicker to keep the cursor on the command | | line and type sub(cr) or hit F12. | | | | If you want to view and change strings it is quicker | | to use RFIND and RCHANGE then pull down menus | | or sequences of control keys. | | | |--------------------------------------------------------------| | | | F7 Key | | | | If you use macros or label your code like: | | | | 00001 %macro utl_repairprofiles | | 00002 ( | | | | 00001 * utl_repairprofiles | | 00002 ANYTHING HERE | | | | F7 will put 'utl_repairfiles' into the paste buffer. | | You can then 'paste'(right mouse button) the string | | utl_repairfiles into the commmand line. | | | | I paste the program name and type fyl in front of it. | | This saves the program in the default directory, | | in the profile catalog and in a:\utl_repairfiles.sas | | | | F8 executes the code in the notepad. | | | |--------------------------------------------------------------| | | | Command macros repair/save/restore you profiles. | | | | Sometimes your profile catalogs are damaged | | | | utl_saveprofiles | | utl_repairprofiles | | utl_restoreprofiles | | | | Help you recover from profile crashes. | | | |--------------------------------------------------------------| | | | I use many keys to help me with infrequent but powerful | | program syntax. | | | |--------------------------------------------------------------| | | | Get an optial mouse with a programmable MMB | | This you six functions with mouse | | | | RMB | | SHF RMB | | CTL RMB | | MMB | | SHF MMB | | CTL MMB | | | |--------------------------------------------------------------| | | | The following code will define most of the available | | function keys. | | | |1 Seting Function Keys is much more difficult in V8 | | | |2 The new GUI interface in V8 does not allow | | cut and paste of 'metadata' the way older interfaces did. | | | | For instance you cannot cut and paste the names of | | tables in a SAS database using the DIR window | | | |3 Details 'on'does not give you obsevation number in the | | DIR window etc | | | |4 Thefore command macros like UTLCON which will dump | | metadata into the notepad window are even more valuable. | | Notepad text can be cut and pasted | | | |5 Also the old full screen products are still useful, | | especially when you need to see one observation across | | several screens. | | | |6. Some abreviated commands like 'SAV' no longer work | | you have to type SAVE | | | | | |==============================================================| | | | My Desktop | | | | I turn off most of the added functionality of SAS | | ( or minimize ) | | | | Enhanced Editor -- ( No prefix area -- not avail on MVS/VM? | | TELNET?) | | I wish they had added new features to the | | old program editor. | | May be useful as a code formatter. I am | | experimenting with it. Send code to it | | for formating ( even mprint files). | | | | | | Command Bar ( Use command line instead ) | | Tool Icons-Application Toolbar (removed) | | SAS Window Bar (remove) | | I autohide Win98 Window Bar | | Docking View (minimize) | | Explorer (minimize) | | Horizontal Scroll bar ( remove) | | | | Useful Keyboard keys for command line SAS | | ========================================= | | | | HOME ( back to command line ) | | INS | | DEL | | ALT DEL -- Wish I knew how to get onto function key | | PgDn -- make sure you set scrool to half page | | PgUp | | CTL X -- Cut | | CTL C -- Copy | | CTL V -- Paste | | CTL Z -- Undo | | CTL Y -- Redo | | CTL D -- DOWN ONE LINE ( HOLD TO REPEAT) | | CTL B -- UP 1 LINE (HOLD TO REPEAT) | | | | Useful SAS command abreviations | | ================================ | | ? -- most useful single key in all of SAS | | -- a nice improvement would be context sensitive | | -- and history | | DIR | | LIBN | | FILEN | | SUB | | REC | | SAVE | | VAR | | INC | | F 'hello' ic ( ic ignore case ) | | C c 'x' 'y' ic all ( inconjuction with F6 F7 ) | | F "'" all-count the single quotes (odd num->problem) | | Z | | LOG | | PGM | | OUT | | MAN | | 106 -- go to line 106 | | up 11 -- up 11 lines | | | | | | Useful User commands macros | | ============================ | | | | UTLCON OBJ.TABLE1 * CONTENTS IN NOTEPAD | | * DO NOT NEED TO CLEAR PGM WINDOW | | | | UTLIOTA 20 * INTEGERS 01 -- 20 in NOTEPAD | | | | UTLSAVEPROFILE * CREATE A BACKUP OF SASUSER.PROFILES | | UTL_REPAIRPROFILE IN CASE THEY ARE DAMAGED | | UTL_RESTOREPROFILE | | | | FYL UTL_PROGRAM * SAVE PROGRAM TO FLOPPY&D:\UTL&PROFILE | | | | UTLVU OBJ.TABLE * Version 8 Table View for Mainframe | | from Qualx (QLX?) | | | | | | Useful prefix commands | | ======================= | | | | C CC | | M MM | | R RR R5 RR5 -- RRNNNN | | D DD D2 | | B | | A | | | | ) )) | | < << | | | | Wish SAS would implement X XX FLIP. | | | | | | Other useful tools no keys left | | | | UTLPCNT - PICTURE FORMATS FOR DOLLARS M, K NNN | | UTLPART - SPLIT ON SAS VAR | | UTLOJYN - DATASTEP OUTER JOIN | | UTLNOBS - MACRO IMPLEMENTATION OF OB COUNT | | UTLXPLO - PROC EXPLODE | | UTLPHLO - UTLFLO UTLFLOW - PARSE MACRO FOR METADATA UTLPFLO | | UTLDMOD - UPDATE INSERT DELETE MODIFY KEYED INDEX | | UTLSMRZ - SUMMARIZE A BIG TABLE ( RANDOM SAMPLING ) | | UTLNFLT - READ QUOTED COMMA DELIM FILE | | UTLRULR - HEX DUMP WITH RULER | | UTLPRTX - PRINT A RANDOM OB VERTICALLY | | UTLXPRT - PRINT A RANDOM OB VERTICALLY | | UTLORDR - REORDER VARS | | UTLUNQE - COUNT DISTINCT COMBINATIONS OF VARS | | UTLTYTL - STANDARD TITLE | | UTLJUST - RIGHT LEFT CENTER IN ONE TITLE LINE | | UTLCLIP - CLEAR SAS LIB TABLES CATALOGS MACROS etc | | UTLSDSN - NICE SET OF ENTITY DIAGRAMS GRAPH OR PRINT | | UTLOXST - DOES THAT SAS OBJECT EXIST | | UTLRMK - RECREATE DATASET IF ONLY CONTENTS EXISTS | | UTLFONT - IDENTIFY YOUR FONT SET | | UTLMACXT- MACRO VAR EXIST | | UTLCTON - CONVERT CHAR TO NUMERIC | | UTLRDZP - READ A ZIPPED FILE IN SAS | | UTLCRDN - COLUMN CARDINALITY | | UTLFDUP - FIND DUPS | | UTLRSEL - SELECT N OF M OBS RANDOMLY | | UTLDSDB - RECORDS IN MVS FILE WITHOUT READING FILE RECFM=F | | UTLEPST - ADD YOUR TITLE TO POSTSCRIPT EPS FILE | | UTLDBIN - KEEP ONLY KEYBOARD CHARS | | UTLDSQL - PROCS INSIDE MACRO DATA STEPS | | UTLCAPT - PROPER UPCASE | | UTLSQUZ - ZIP SAS TRANSPORT FILE | | | |==============================================================| | | | Useful tips | | | | | | TSO Send MSG Multiple Users | | | | SE 'your message',USER=(uid1,uid2,uid3) | | | |==============================================================| | | | data hasword; | | set phonebuk end=end; | | retain rx; | | if _n_ = 1 then | | rx = rxparse ("`$wCOURT$w|$wLANE$w|$wSTREET$w|$wROAD$w"); | | if rxmatch (rx, Upcase(Address)) then output; | | run; | | | |==============================================================| | | | options obs=100; | | | | * set up pipe; | | x 'mknod inpipe p'; | | libname outpipe xport 'inpipe'; | | | | * force uncompress data stream through pipe; | | x 'unzip -p pai.zip pai.xpt >! inpipe &'; | | data test; set outpipe.pai(keep=slvl p1i1); run; | | | | * test; | | proc sort data=test; by slvl; run; | | proc means data=test; var p1i1; by slvl; run; | | | |==============================================================| | | | proc sql; | | title 'The SAS System'; | | create table sql.newintl | | like sql.internat; | | | | proc sql; | | insert into sql.newintl | | select flight, date, dest, boarded | | from sql.march | | where flight in ('132','219','271','622'); | | | | select * from sql.newintl(obs=10); | | | |==== | | | | insert into sql.newintl | | set flight='501', | | date='01MAR94'd, | | dest='MXC', | | boarded=150 | | set flight='501', | | date='02MAR94'd, | | dest='MXC', | | boarded=109; | |==== | | | | create table new as | | select * from sql.payroll; | | update new | | set salary=salary*1.03 | | where jobcode like '__1'; | |==== | | | | create table new as | | select * from sql.payroll; | | reset outobs=15; | | alter table new | | add age_hir num label='Age at Hire' format=2.; | | update new | | set age_hir=int(hired-birth)/365.25; | | select * from new; | | | |==== | | | | create table new as | | select * from sql.payroll; | |reset outobs=5; | |alter table new | | modify idnum char(5); | |update new | | set idnum=substr(jobcode,1,1)||idnum; | |select idnum, jobcode from new; | | | |==== | | | |select p.idnum, coalesce(p2.jobcode,p.jobcode) | | coalesce(p2.salary,p.salary) label='Current Salary' | | from sql.payroll p left join sql.payroll2 p2 | | on p.idnum=p2.idnum; | | | |==== | | | |select * | | from sql.march | | where exists (select * | | from sql.delay | | where march.flight=delay.flight | | and destype='International'); | | | |==============================================================| | data a; | | input x y; | | datalines; | | 1 2 | | 2 3 | | ; | | run; | | | | data b; | | input x y; | | datalines; | | 1 5 | | 2 6 | | ; | | run; | | | | proc sql; | | | | update a | | set x=(select y from b where a.x=b.x); | | | | select * from a; | | | | quit; | | run; | | | |==============================================================| | | | PROC SQL NOPRINT; | | SELECT COUNT(DISTINCT X) INTO :NOFX | | FROM YOURDATA; | | | | *** NOFX is a macro variable which contains distinct | | values of X **** | | | | %LET TOTN=&NOFX **** to remove leading blanks ***** | | | | SELECT DISTINCT(X) INTO :V1 - :V&TOTN | | FROM YOURDATA; | | | \*=============================================================*/ ;;; /* SOME USEFUL TOOLS *** NOFX is a macro variable which contains distinct values of X **** %LET TOTN=&NOFX **** to remove leading blanks ***** SELECT DISTINCT(X) INTO :V1 - :V&TOTN FROM YOURDATA; UTLFSE.SAS FSEDIT ( SAS HASE FSE WORK.TXTX AND FSV WORK.TXT ) UTLFSV.SAS FSVIEW UTLP.SAS COMMAND STYLE PRINT UTLPA.SAS COMMAND STYLE PRINT PROC CALLED BY UTLPA UTLE.SAS FSEDIT COMMAND MACRO UTLRXWD.SAS COUNTING WORDS WITH RX CMNDS UTLFHLD.SAS HOLD A FILE FROM BEING ACCESSED BY ANY USER UTLCDES.SAS CHECK DES ALGORITHM WITH REAL DATA UTLDDES.SAS CHECK DES ALGORITHM WITH REAL DATA UTLJUST.SAS LEFT CENTER RIGHT JUSTIFY TEXT UTLCDES1.SAS CHECK DES ALGORITHM WITH REAL DATA UTLDESF.SAS CHECK DES ALGORITHM WITH REAL DATA UTLDRPV.SAS DROP ALL MISING COLUMNS UTLTXLS.SAS DDE SAS TABLE TO EXCEL UTLDFLT.SAS FLATFILE TO SAS TABLE,IM FLATFILE UTLBKY.SAS MAKE UTLBKY1 AS MAY ETC UTLMON.SAS MAKE UTLMON1 AS MAY ETC UTLADTM.SAS ADD TIMESTAMP DBMS TABLE UTLDMOD.SAS UPDATE INSERT DELETE IN SYBASE TABLE UTLDTBL.SAS QC A SAS IMAGE OF SYBASE TABLE UTLFALC.SAS SAVE STATUS AND CLEAR LIBNAMES UTLFCLR.SAS SAVE STATUS AND CLEAR LIBNAMES UTLMLIB.SAS CREATE GLOBAL MVAR WITH AUTOLIB UTLMTBL.SAS CREATE DBMS TABLE UTLNOPTS.SAS TURN ALL DEBUGGING OPTIONS OFF 4 PROD UTLOPTS.SAS GOOD SET OF OPTIONS FOR DEBUGGING UTLRCDE.SAS TRACK THE GREATEST RETURN CODE UTLSPEX.SAS DOES A RDMS TABLE EXIST UTLSPIX.SAS DOES A RDMS TABLE EXIST UTLTBOK.SAS CHECK RDBMS TABLES UTLTITL.SAS STANDARD TITLE OBJECT ORIENTED UTLA2OP.SAS NICE DATA DICTIOARY WITH SAMPLE VALS UTLBAT.SAS RUNS OBJECTS IN BATCH MODE UTLBOX.SAS DRAW A BOX UTLBOPT.SAS BATCH OPTIONS FOR MVS UTLC2D.SAS UNCOMPRESS CSRC MVS COMPRESSION UTLCHKR.SAS FLOOR AND CEIL A VAR UTLCCAT.SAS COPY A GRAPHICS TEMPLATE UTLCKCL.SAS CONTENTS OF SYBASE TABLES COL & TYPE UTLCOP.SAS COPY AND COMPRESS A FILE UTLD2C.SAS COPY AND COMPRESS MVS FLATFILE UTLD2D.SAS SUBMIT A BATCH JOB TO COPY A FILE UTLD2TF.SAS COPY MVS FILE TO TAPE AND RENAME FILE UTLD2T.SAS COPY ANY FILE TO TAPE MVS BATCH UTLD2V.SAS COPY MVS FILE TO TAPE RECFM=VB ON TAPE UTLDADD.SAS ADD COLUMS TO DBMS TABLE UTLD2Z.SAS PKZIP A MVS FILE UTLDBDB.SAS LOAD A RDMS TABLE UTLDBDR.SAS DROP A RDMS TABLE UTLDBIX.SAS INDEX RDMS TABLE UTLDBLA.SAS DBLOAD WITH APPEND OPTION UTLDBMK.SAS CREATE SAS TABLE FOR RDMS LOAD UTLDBSR.SAS SORT & INDEX SAS TABLE FOR RDMS LOAD UTLDBMS.SAS DBMS ENGINES FOR SUN UTLDEIX.SAS REMOVE AN INDEX UTLDFRG.SAS DEFRAG MVS VOLUMES UTLDICL.SAS DB2XSAS CROSS REF DATA DICTIONARIES UTLDISL.SAS XREF TABLES UTLDICT.SAS XREF TABLES UTLDMDL.SAS PRINT TABLES WITH ROW COUNT UTLDPTM.SAS DROP TIMESTAMP DBMS TABLE UTLDVAR.SAS NICE TABLE OF LABELS AND SAS VARS UTLDVLE.SAS DEVEL IN SAS UTLDVMC.SAS DEVEL IN SAS UTLETNP.SAS NICE IML EXAMPLE UTLEXPL.SAS EXAMPLE ONE OF PROC EXPLODE UTLFIDX.SAS TEST FOR EXISTENCE OF MVS FILE UTLFILE.SAS SAS DATASET TO FLATFILE WITH HEADER REC UTLFLAT.SAS CREATE FLATFILE FROM SAS TABLE UTLFLOW.SAS EXAMIMES CODE OBJECTS AND DETAIL IPO UTLFLTN.SAS CREATE FLATFILE NO DELIMETERS UTLFOPN.SAS SAVE STATUS AND CLEAR LIBNAMES UTLFRMC.SAS FORMCHAR FOR HP LASERJET USE WITH UTLHPLJ UTLFXDT.SAS INPLACE REFORMAT SAS DATE TO RDBMS FORM UTLG.SAS GRAPHICS EXAMPLE UTLGCAT.SAS PRINT CONTENTS OF GRAPHICS CATALOG UTLGCOP.SAS COPY GRAPHS FROM CAT TO CAT UTLGETF.SAS GET FULLY QUAL NAME OF SAS AUTOLIB UTLGFLO.SAS GPRINT A FLAT FILE POSTSCRIPT SMALL TYPE UTLGLBL.SAS GLOBAL MACRO VAR WITH DATASET LABEL UTLGOBS.SAS NUMBER OF OBS IN SAS DATASET UTLGPRN.SAS PRINT A GRAPH UTLGPR.SAS GPRINT A FLAT FILE POSTSCRIPT SMALL TYPE UTLGPRT.SAS BMS RPT TO POSCRIPT UTLGRA.SAS DMS DRUG CLASS PLOTS UTLGROT.SAS OUTPUT EACH GRAPH FRO CATALOG TO A FILE UTLHBYH.SAS HOUR BY HOUR TIMESHEET UTLHELP.SAS SAS CONTACTS UTLHILO1.SAS TOP AND BOTTOM 100 BASED ON CV UTLHILO.SAS GPRINT A FLAT FILE POSTSCRIPT SMALL TYPE UTLHMNT.SAS MOVE TO VOL AND SLOT ON 3480 STACKER UTLIML2.SAS SAMPLE IML CODE 2 UTLIML1.SAS SAMPLE IML CODE UTLIML3.SAS SAMPLE IML UTLIMLS.SAS SAMPLE IML SUBROUTINE UTLKFMT.SAS BUILD AND DOCUMENT SAS FORMATS UTLKILL.SAS DELETE ALL DATASETS IN LIBRARY IN UTLKWRD.SAS DISPLAY MAN KEYDEFS FOR ROGER ON MVS UTLLABL.SAS CODE TO DUMP IBM STANDARD LABEL INFO UTLLCAT.SAS GET A LIST OF ALL ROGERS FILES MVS UTLLST.SAS COMMAND LIST OF FILES INTO FILE UTLM2M.SAS COPY PDS MEMBER TO ANOTHER PDS UTLMAKE.SAS SAS CONFIG AND SHELL INTO PRODUCTION UTLMEMO.SAS MS WORD DONE IN SAS NEEDS WORK UTLMKDIR.SAS MAKE A SYSTEM OF UNIX DIREDCTORIES UTLMKIX.SAS CREATE INDEX ON SAS DATASET UTLMPRD.SAS MOVE CODE DEVEL INTO PRODUCTION UTLMONS.SAS CREATE &&MMYY&I BACT12 FOR12 CURRENT UTLMPRX.SAS FIX PRODUCTION SCRIPTS UTLMSUB.SAS SUBSTITUTE MEAN FOR MISSING VALS UTLNDCV.SAS DEVEL IN SAS UTLNPGE.SAS PAGE 1 (OF 20) UTLPALC.SAS ALLOCATE LIBRARIES UTLPCNT.SAS PICTURE FORMATS UTLPGMN.SAS GET LAST TABLE CREATED FOR QC UTLPRNT.SAS FLATFILE MAKER WITH HEADER AND LENGTHS UTLPSET.SAS PAGE SETTINGS INTO MAC VARS UTLPRT.SAS MVS PRINDS MACRO WITH OPTIONS UTLPWRK.SAS PATH FOR SASWORK UTLQCMP.SAS COMPARE SETS OF TABLES UTLQDOC.SAS BASIC DOCUMENTATION UTLRMDIR.SAS REMOVE A SYSTEM OF UNIX DIRECTORIES UTLRLSE.SAS RELEASE UNUSED SPACE FROM MVS FILE UTLRPLY.SAS REPLAY GRAPH TO POSTSCRIPT UTLS2S.SAS CREATE A COPY OF A SAS LIB W/WO COMPRESS UTLS2R.SAS REPAIR A SAS DATASET UTLS2T.SAS COPY A SAS LIB TO TAPE NOT TAPE ENG UTLSAGE.SAS COMPUTING INDICES IN SAS UTLSENV.SAS GET UNIX SYSTEM VARIABLE UTLSETS.SAS DOES VENN DIAGRAMS UNION/XCT TWO TABLES UTLSHDE.SAS GRAPHICS SHADED BACKGROUND UTLSLOT.SAS POSITION TAPE IN SLOT UTLSMAC.SAS SAVEING MACRO VARS FOR LATER USE UTLSPCN.SAS PROC CONTENTS SYBASE TABLE FLT UTLSPLT.SAS MAKE SAS DATASETS BASED ON VAR IN DATASET UTLSTMC.SAS STORING MACRO VARIABLES UTLSYEX.SAS DOES A RDMS TABLE EXIST SP_HELP UTLT2C.SAS TAPE TO COMPRESSED DATA ONLINE MVS UTLT2D.SAS TAPE TO DISK UTLT2P.SAS UNLOAD A PDS FROM TAPE TO ONLINE UTLT2S.SAS TAPE SAS DATASET TO DISK UTLTARR.SAS EXTRACT A TAR FILE UTLTBL.SAS UTLTBL PARSES CONFIG FILES UTLTBMS.SAS TABLE DICTIONARY TO DEVEL WINDOW UTLTFSF.SAS FORWARD SPACE FILES ON TAPE UTLTMNT.SAS POSTION TAPE AT FILE UFILE UTLTMPL.SAS TEMPLATES FROM SAS SAMPLE LIB UTLTMPL1.SAS 2 BOXES LEFT, 2 BOXES RIGHT (WITH SPACE) UTLTPL.SAS LOAD ANY LABELED TAPE OR FILE UTLTPLD.SAS LOAD ANY LABELED TAPE UTLTPLL.SAS LOAD ANY LABELED TAPE UTLTRET.SAS MOD TO A MVS TAPE FILE UTLTSO.SAS BRING UP TSO BATCH XEQ SAS AND SAS OBJECTS UTLTVOL.SAS READ CONFIGS PRINT CONTROL RPTS WITH OBS UTLTYMT.SAS PART OF LOGREC FOR SAS RESTART UTLUDTO.SAS COPY UNLAB IBM FILE TYPES TO UNIX BINARY UTLUFXT.SAS TEST IF UNIX FILE EXISTS UTLULOG.SAS FLOATING LOG FILE FOR PATALLEL RUNS UTLUNIV.SAS SAMPLE INDEPENDENT DATA UTLUOBS.SAS NUMBER OF OBS IN TABLE UTLVCHK.SAS CHECK LABEL ON TAPE AGAINST CONFIG UTLVIOA.SAS ALLOCATE VIO MVS UTLVIOF.SAS ALLOCATE VIO MVS UTLVN2B.SAS VENDER MARKET PRODUCT TO BMS NAME UTLVSAM.SAS READING KEYED SEQUENTAIL VSAM FILES UTLVSMA.SAS EXAMPLE OF READING KEYED SEQ VSAM UTLVSMB.SAS EXAMPLE OF READING KEYED SEQ VSAM UTLVTOC.SAS LISTING AN MVS VTOC UTLWIN1.SAS WINDOW SYSTEM 1 UTLWIN3.SAS WINDOW SYSTEM 3 UTLWIN2.SAS WINDOW SYSTEM 2 UTLWIN6.SAS WINDOW SYSTEM 6 UTLWINS.SAS WINDOW SYSTEM UTLX2S.SAS CREATE INDEX FOR EXISTING DATASET UTLXCLV.SAS SAS TO EXCEL AND WORD DDE WORD MACROS UTLXCWD.SAS COMPARE WORD TO EXCEL UTLXDEL.SAS REMOVING A SAS INDEX UTLXEQM.SAS EXECUTE SAS OBJECTS UTLXMBR.SAS CHECKS EXISTANCE OF MEMBER OF SAS LIB UTLXPLO.SAS EXPLODED BANNER FOR PRINTOUTS UTLXTBL.SAS CREATE RDMS TABLE PASSTHRU UTLZ2D.SAS PKUNZIP UNDER MVS UTLZALC.SAS KEYWORD BASED ALLOCATIONS UTLZIP.SAS PKZIP/PKUNZIP MVS UNDER DISPLAY MANAGER UTLDCTY.SAS RDBMSXSAS CROSS REF DATA DICTIONARIES UTLCAST.SAS SOME OF THE CASE TOOLS UTLCNFG.SAS UTLCNFG PARSES GLOBAL CONFIG FILES UTLPRIT.SAS PRINT A FLATFILE UTLPHLO.SAS IPO AND SAS CODE OBJECT MACRO UTLCNTX.SAS DRAW DETAIL CONTEXT DIAGRAM UTLDVLD.SAS DEVEL IN SAS UTLCHRV.SAS GLOBAL MACRO VARS ALL CHR VARS UTLSMRX.SAS FREQUENCY ANALYSIS ON ALL CHAR VARS UTLSMRZ.SAS SUMMARIZE A SAS TABLE CONTROL OUTPUT UTLFLO.SAS PARSES CONFIG FILES FOR UTLPFLO UTLCNFL.SAS GET LIST OBJECTS FROM CONFIG FILE UTLODVC.SAS DEVEL IN SAS UTLFLOC.SAS PARSES CONFIG FILES FOR UTLPFLO UTLLTBL2.SAS TBALE DRIVEN LOADS FOR XPLAT XHARDWARE UTLCNF.SAS UTLCNF PARSES CONFIG FILES UTLDMOD0.SAS UPDATE INSERT DELETE IN SYBASE TABLE UTLAGEY.SAS AGE CALCULATION UTLVTYP.SAS DETERMINE TYPE FOR SAS VARIABLE UTLCMAQ.SAS ANOTHER SAS TO FLATFILE UTLDDOC.SAS DOCUMENTS SAS DATASETS UTLXCLS.SAS READ EXCEL 5.0 2 SAS UTLVRML.SAS MAKE A VRML FILE FROM SAS UTLISMP.SAS GENERATE INPUT SENSITIVE MAPS UTLMKFT.SAS CREATES A FORMAT FROM A SAS UTLHTMT.SAS HMTL TABLE FROM A SAS DATA SET UTLHTMZ.SAS SAS TO PRODUCE HTML CODE UTLMNMX.SAS SCALE VARIABLE FROM LO TO HI UTLPART.SAS SPLITS A SAS DATA SET UTLTBHM.SAS TABULATE OUTPUT TO HTML UTLFSPE.SAS ENCOURAGE USING PROC FSEDIT UTLOJYN.SAS OUTER JOIN UTLAFOK.SAS SIMPLE SQL UTILITY AF/SCL UTLPFLO.SAS AFT UTLFLO DOES IPO & FLOCHRT UTLNFLT0.SAS READ QUOTED COMMA DELIM FLATFILE UTLDICM0.SAS DATA DICTIONARY FOR RDBMS LOADS UTLNFLT.SAS READ QUOTED COMMA DELIM FLATFILE UTLRULR.SAS ASCII FLATFILE RULER & HEX CHARS UTLJKNF.SAS CODE TO DO JACKNIFE SAMPLING UTLCUTR1.SAS CREATE SAS TABLE EACH LEVEL FO SAS VAR UTLCLDR1.SAS CREATE SAS TABLE EACH LEVEL FO SAS VAR UTLXREWF.SAS CROSS REFERENCE LISTING SAS MACROS UTLXREF2.SAS CROSS REFERENCE LISTING SAS MACROS UTLLTBL.SAS TBALE DRIVEN LOADS FOR XPLAT XHARDWARE UTLCONT.SAS WELL DOCUMENTED CONTENTS OF SAS TABLE UTLT.SAS TBALE DRIVEN LOADS FOR XPLAT XHARDWARE UTLSMRY.SAS SUMMARIZE A SAS TABLE CONTROL OUTPUT UTLFTPG.SAS REMOTE SAS DATASETS INTO MS-ACCESS UTLCUTR.SAS CREATE SAS TABLE EACH LEVEL FO SAS VAR UTLXRFM.SAS CROSS REFERENCE LISTING SAS MACROS UTLDITO.SAS DITTO A FILE UTLVLCK.SAS CHECK IBM STANDARD LABEL UTLDBPR.SAS PRINT XREF DICT RDBMS AND SAS UTLFMAT.SAS CREATE FORMAT FROM SAS DATA ** UTLPANL.SAS PRINT PANELS FOR SKINNY DATA UTLFTPR.SAS BUILD AND ACCESS SAS REMOTE DATA UTLXREF.SAS CROSS REFERENCE LISTING SAS MACROS UTLFTP.SAS FTP A FILE UTLCIMP.SAS TABLES INTO TRANSPORT FILE UTLDLTA.SAS BUILD DELTA SAS TABLE FOR RDBMS UPDATE UTLONES.SAS SET PATTERN OF 0S AND 1S IN 8 BYTE FLOAT UTLODBC.SAS SAS ODBC WITHOUT THE REST OF SAS UTLS2DB.SAS SAS DATASET TO DBASE III FILE UTLDB2S.SAS DBASEIII TO SAS DATASET UTLPRSE.SAS UTLPRSE PARSES CONFIG FILES UTLSYSI.SAS FLOW POINTS, GENERAL UTLCON.SAS COMMAND MACRO TO SUBMIT PROC CONTENTS UTLCONA.SAS CALLED BY COMMAND MACRO UTLCON UTLMKCL.SAS MAKE A BILLING CALENDAR UTLCLDR2.SAS INPUT TO UTLCLDR UTLSPCO.SAS PROC CONTENTS ON SYBASE TABLE UTLCAPS.SAS UPPERCASE CHARACTER VARIABLES UTLEB2A.SAS CONVERT EBCDIC FILE TO ASCII UTLCPOR.SAS TABLES INTO TRANSPORT FILE UTLHPLJ.SAS PRINT A FILE ON HP LASERJET SMOOTH LINES UTLFKIL.SAS DELETE AN EXTERNAL FILE UTLVENN.SAS VENN DIAGRAM FOR TWO TABLES UTLSAVO.SAS SAVE OPTIONS IN GLOBAL VAR UTLSAVO1 UTLMEMO1.SAS MS WORD DONE IN SAS NEEDS WORK UTLTYTL.SAS STANDARD TITLE OBJECT ORIENTED UTLDSET.SAS TEXT FILE FROM MEMBERS OF CATALOG UTLCSET.SAS PRINT SAS PRINFILES WITHOUT SAS UTLPRTX.SAS TRANSPOSE PRINT 1ST OB SAS DATASET UTLSHOP.SAS SAMPLE NETSCAPE FRONT END FOR SAS UTLORDR.SAS CHANGE VARIABLE ORDER SAS DATASET UTLDICM.SAS DATA DICTIONARY UTLPXLS.SAS SAS TO EXCEL NEED ACCESS ODBC UTLFONT.SAS FINDING SPECIAL PRINT CHARACTERS UTLCHNO.SAS MS LINE DRAW CHARSET UTLDMP.SAS DUMP 1ST 10 RECS OF LIST OF FILES UTLWRDS.SAS RETURN # WORDS IN LIST UTLUNQE.SAS UNIQUE OCCURS OF GROUP OF VARS UTLDDEW.SAS SAS DDE TO WORD UTLGENI.SAS GENERATE ZERO PADDED N INTEGERS IN EDITOR UTLSUPS.SAS CREATE INDEX OF SAS TOOLS UTLSTRN.SAS NUMBER OF TIMES SUBSTRING IN STRING UTLIOTB.SAS CALLED BY UTLIOTA N INTEGERS IN EDITOR UTLMTOS.SAS CHANGE VARIABLE ORDER SAS DATASET UTLMKMC.SAS RESTORING MACRO VARIABLES UTLXPLD.SAS EXPLODE UTLDMKY.SAS SET DISPLAY MANAGER KEYS UTLBUFX.SAS PUTTING X IN THE PASTE BUFFER UTLRILE.SAS LEFT AND RIGHT JUSTIFY TEXT UTLDST.SAS APPENDIX 15.12 LISTING 5.12 UTLCTYT.SAS CREATE JUSTIFIED TITLES FOOTNOTE SELECTED UTLWRAP.SAS SPLIT TEXT AT A BOUNDARY UTLPCAT.SAS PRINT CATALOG OUTPUT ENTRY TRADEMARKED UTLGRIT.SAS COMPILING AND EXECUTING SAS CODE UTLAUTO.SAS PUT YOUR AUTOCALL LIB 1ST UTLOUGT.SAS ANOTHER WAY RO SET AUTOEXEC UTLSHEL.SAS CREATE UNIX SHELL SCRIPTS UTLCALN.SAS BUILD A BILLING CALENDAR UTLBILG.SAS MS WORD DONE IN SAS NEEDS WORK UTLXCPT.SAS VALUES IN ONE TABLE NOT THE OTHER UTLMETB.SAS ADD KEY FIELDS PRINT MACRO UTLNTOS.SAS FLATFILES TO SAS ALL MEMBERS OF A LIB UTLODM.SAS 11001032 DM_DEMO DEMOGRAPHICS TABLE UTLCATG.SAS GRAPHIC STREAM FILES OUT CAT UTLDMS.SAS CREATE STARTUP PGM TOOLS LINK UTLMETA.SAS EXTRACT METADATA FORM MACROS UTLPATP.SAS PRINT SELECTED PAGES FROM A CATALOG UTLBATB.SAS RUNS OBJECTS WINDOWS BATCH MODE UTLLBLV.SAS LABEL A SET OF SAS OBJECTS UTLMETS.SAS CLINICAL DOCUMENTATION/PROGRESS REPORTS UTLBATW.SAS RUNS OBJECTS WINDOWS BATCH MODE UTLMVEC.SAS RETAIN MAX NUM AND LONGEST CHAR VAR UTLNOBZ.SAS NUMBER OF OBS IN SAS DATASET UTLCALM.SAS BUILD A BILLING CALENDAR UTLMETD.SAS CLINICAL DOCUMENTATION/PROGRESS REPORTS UTLCLIP.SAS CLEAN OUT WORK LIBRARY UTLGMAC.SAS CONVERT SAS VARS TO MACRO VARS UTLSCHD.SAS BUILD MONTHLY CALENDAR UTLCNCT.SAS SAS DATASET/PGMS MAINFRAME 2 PC CONNECT UTLBATE.SAS RUNS OBJECTS WINDOWS BATCH MODE UTLCOPY.SAS CREATE A COPY OF SAS TABLE UTLFTPI.SAS GET FILES FROM REMOTE SYSTEM UTLFTPO.SAS GET FILES FROM REMOTE SYSTEM UTLFTPX.SAS ACCESS REMOTE SAS XPORT DATASET UTLPROJ.SAS HRS WORKED ON A PROJECT UTLGCDM.SAS PULL A BUNCH OF TABLES OUT OF ORACLE UTLACUX.SAS TCP ACCESS SCRIPTS TO UNIX UTLCYCT.SAS CREATE JUSTIFIED TITLES FOOTNOTE SELECTED UTLTBUL.SAS INTERSETING PROC TABULATE UTLRFMT.SAS REMOVE ALL FORMATS FROM DATASET UTLPBSH.SAS SAS PUBLISH UTLSDSN.SAS ENTITY DIAGRAMS FOR A SET OF TABLES UTLXPRT.SAS TRANSPOSE PRINT 1ST OB SAS DATASET UTLFXCT.SAS FIX BOX OPTION REPORT PROBLEM UTLCATC.SAS COPY CAT ENTRIES TO NEW CATALOG UTLA1OR.SAS COPY ORACLE DATA TO SAS TABLES UTLBUTO.SAS ROOT PROCESS FOR AE STANDARDS UTLBUTN3.SAS FRAME BUTTONS UTLBUTN.SAS CREATE YOUR OWN FRAMES UTLMACO.SAS INTERACTIVE MACRO DRIVER UTLMCRO.SAS INTERACTIVE MACRO DRIVER UTLOXST.SAS DOES A SAS OBJECT EXIST UTLMFMT.SAS MAKE FORMATS UTLSTOW.SAS SEND SAS OUTPUT TO WORD UTLMCGM.SAS GREPLAY A GSEG TO CGM FILE UTLFDMP.SAS LIST FORMATS ATTACHED TO COLUMNS UTLPPP.SAS SAMPLE PROJECT PRICING SAS SAMPLE UTLCALG.SAS BUILD A BILLING CALENDAR UTLPAGI.SAS PRINT PAGE 1 OF EACH DIR MEMBER UTLGXLS.SAS COPY EXCEL TO SAS USING ACCESS UTLDB2.sas DB2 EXTRACT to SAS UTLDTYP.SAS MACRO VAR NUMBER OR CHAR UTLANMC.SAS ALL SAS ANNOTATE MACROS UTLAFCL.SAS MACRO VARS IN FRAME UTLANGL.SAS DSGI ANGLE TEXT UTLDMDG.SAS CHANGES THE DEFAULT WINDOW COLOR UTLCDBK.SAS CREATES A CODEBOOK FOR SAS TABLES UTLFOTR.SAS LEFT RIGHT CENTER TEXT 132 CHAR LINE UTLGRLN.SAS LEGEND IN STANDARD SAS/ASSIST FORMAT UTLHANO.SAS HELP FOR ANNOTATE UTLMARY.SAS MACRO VARS WITH # WORDS AND WORD LIST UTLCFRM.SAS SOME COMMON FORMCHARS UTLMQUO.SAS MATCHING QUOTES ?? UTLSWAK.SAS SWAPPPING OF KEYS BETWEEN TWO DEFS UTLKDTO.SAS DITTO A FILE UTLCDLT.SAS DELTA BETWEEN DATASETS UTLOGMN.SAS PROGRAM THAT WAS EXECUTED UTLRMK.SAS CREATE SAS CODE TO MAKE DATASET UTLULOBS.SAS NUMBER OF OBS IN TABLE UTLRXSM.SAS FIND THE SUM OF DIGITS UTLMCAT.SAS SEACH FOR AVAIL CAT UTLPAWS.SAS PAUSE FOR X SECONDS UTLSQLU.SAS NICE EXAMPLE OF SQL UPDATE UTLPKPG.SAS PL/SQL ORACLE PACKAGES UTLDSTC.SAS COUNT DISTINCT ID IN SEVERAL TABLES UTLMACD.SAS STORING MACRO ARGS IN SAS DATASET UTLRXNU.SAS NUMERIC STRING FROM CHAR STRING UTLOTHT.SAS REPORT OUTPUT TO HTML UTLSTOD.SAS CONVERT SAS DATASET TO DBASE DBF UTLCOMB.SAS COMBINING MODIFYING SAS DATA UTLDBFT.SAS FILE FORMAT FOR DBASEIII UTLSTPG.SAS RUN A STORED PROGRAM UTLSTOD1.SAS CONVERT SAS DATASET TO DBASE DBF UTLDB2SD.SAS DBASEIII TO SAS DATASET UTLGETC.SAS GET SAS CODE FROM LOG UTLRXMN.SAS FIND SMALLEST DIGIT IN A STRING UTLRXMX.SAS FIND SMALLEST DIGIT IN A STRING UTLSUPX.SAS CREATE INDEX OF SAS TOOLS UTLKDBDC.SAS CONNECT TO DB2 GET SYSTEM TABLES UTLUONE.SAS UPPERCASE FIRST CHARACTER UTLACTN.SAS SIMPLE PROJECT CALENDAR UTLCDMP.SAS SAS CATALOG DUMP UTLCLEN.SAS REMOVE CR/LF ETC FROM CHARACTER DATA UTLCLMA.SAS CLEAR MACRO VARIABLES UTLDB2S1.SAS DBASEIII TO SAS DATASET UTLDBTS.SAS DBASEIII TO SAS DATASET UTLDPGM.SAS CODEBOOK FOR SAS DATASET UTLEMAL.SAS EMAIL FROM SAS UTLEMOD.SAS UPDATE INSERT DELETE IN SYBASE TABLE UTLFPRT.SAS PRINT A SELECTED FORMAT UTLFSRC.SAS MAKE FORMAT SOURCE CODE ** MAY BE BEST UTLGPAN.SAS CREATE GRAPHICS PANELS UTLGRB.SAS EXAMPLE OF FOUR DRUGS ON ONE PAGE UTLGRC.SAS EXAPLE OF TITLE FOR BMS GRAPHS UTLGT2G.SAS CREATING A FILE GREATER THAN 2 GIG UTLJSTY.SAS TITLE STATEMENT STYLE MACRO USING PBUFF UTLJUST1.SAS LEFT CENTER RIGHT JUSTIFY TEXT UTLLBAL.SAS RESTORE LIBREFS SAVED BY UTLLBCL UTLLBCL.SAS SAVE CLEAR LIBREFS FOR REUSE UTLOB.SAS LIST OF ACCESS TABLES/OBJECTS UTLOBAC.SAS SAS DATASET TO MS-ACCESS TABLE UTLOBAC1.SAS SAS DATASET TO MS-ACCESS TABLE UTLPRTG.SAS USING PRINTER DRIVERS UTLSCLP.SAS PRINTING USING PROC BUILD UTLSQMK.SAS CREATE UPDATE TABLE USING AF UTLSY.SAS LIST OF ACCESS SYSTEM TABLES/OBJECTS UTLSYSC.SAS CASE TOOL FOR BATCH XEQ SAS UTLTMOD.SAS UPDATE INSERT DELETE IN SYBASE TABLE UTLTOPR.SAS TWO PROCS PER PAGE UTLVDOC.SAS VALIDATE AND VERIFY YOUR DATA UTLATTR.SAS ATTRIBUTE STATEMENT FROM DATASET UTLWAIT.SAS WAIT A SPECIFIED # SECS UTLMFLT.SAS MERGING FLATFILES UTLAGEA.SAS ANOTHER AGE CALC MACRO UTLVERN.SAS VERFY THAT NAME IS VALID UTLCDIR.SAS COMPARE DIRECTORY CONTENTS AFTER COPY UTLFLOV.SAS FLOW A LONG STRING VARIABLE UTLFSTU.SAS UPCASE FIRST CHAR OF WORDS UTLFMTM.SAS ANOTHER FORMAT MAKER MACRO UTLWKDY.SAS BUSINESS DAYS BETWEEN TWO DATES UTLRNAM.SAS RENAME A LIST OF VARIABLES UTLIOTA.SAS SEQ IN PGM EDITOR UTLSPCK.SAS CHECK SPELLING CONTENTS SAS VARIABLE UTLVRFY.SAS DATA VALIATION MACRO UTLAFDM.SAS DUMP AF SOURCE CODE TO FILATFILE UTLXPWD.SAS ANOTHER SAS TO WORD UTLXPXL.SAS EXPORT DATA 2 LOTUS DDE UTLXPGR.SAS EXPORT A GRAPH 2 WORD UTLAFGR.SAS TEMPLATE DSGI TABLES USING AF UTLSBMT.SAS SAS SOURCE CODE SUBMITTER UTLSQTU.SAS TUTORIAL ON SQL UTLCNFT.SAS DATA DOCS USING PROC CONTENTS & FORMATS UTLJFCB.SAS PARSE FILE CONTROL BLOCKS IN MVS UTLGPDS.SAS PARSE A IBM PDS DIRECTORY UTLQPRN.SAS IBM DIRECT PRINT UTLNDEX.SAS INDEXED READ FROM A VSAM FILE UNDER MVS UTLTKLD.SAS EXECUTABLES INTO A TEXT FILE UTLTKLL.SAS TEXT FILE TO EXECUTABLE USE WITH UTLTKLD UTLAFNF.SAS FRAME LINKAGE USE PMENU UTLDICMS.SAS DATA DICTIONARY UTLREPO.SAS SAMPLES OF PROC REPORT UTLRPTA.SAS SAMPLE OF COMPLEX PROC REPORT UTLRSLV.SAS WHITLOCK CODE STORED IN DATA UTLPSAF.SAS PREP DEMOGRAHIC TABLE UTLCATV.SAS CLASS N(PCNT) ACROSS TREATMENT GRPS UTLTABO.SAS CREATE ALL REPORTS UTLSTOT.SAS CREATE STUDT TOTALS DATASET UTLSPRO.SAS STRING PROCESSING IN SAS UTLVETR.SAS FIND SILLY CLINICAL ERRORS UTLDEMO.SAS TABLE X.X BASELINE DEMOGRAPHICS UTLJAVA.SAS SAMPLE NETSCAPE FRONT END FOR SAS UTLRXOC.SAS COUNT NUMBER OF AS IN STRING UTLPLUG.SAS SAMPLE NETSCAPE FRONT END FOR SAS UTLMLMC.SAS RESTORING MACRO VARIABLES UTLMCMP.SAS COMPARING MULTIPLE DATASETS UTLHPCL.SAS HIGH QUALITY REPORTS UTLVBAS.SAS EXECUTABLES FOR NON SAS PCS UTLIOTW.SAS CALLED BY UTLIOTA N INTEGERS IN EDITOR UTLWEBU.SAS WEB USAGE SUMMARY UTLJAVB.SAS JAVA SCRIPT EXAMPLES PART A UTLJAVD.SAS COOKIES AND RADIO CHECKBOX LIST DIALOG UTLNEAR.SAS JOIN WITH A NEAR MATCH UTLDBDC.SAS CREATE DATA DICTIONARY FOR DB2 UTLXPOR.SAS CREATE SAS XPORT FILE PROC COPY UTLDWMD.SAS CHAR METADATA FOR DATA WAREHOUSE UTLIMPR.SAS IMPORT A PROC COPY DATA TO WORK UTLSTOP.SAS SAMPLE NETSCAPE FRONT END FOR SAS UTLMTAD.SAS ADD KEY FIELDS PRINT MACRO UTLMACX.SAS DOES A MACRO VARIABLE EXIST UTLGETO.SAS SAMPLE GETOPTION IN DATASTEP UTLGRFO.SAS COMBINING BARS ON SAS GRAPH UTLSPKK.SAS SPELL CHECK A VARIABLE UTLUPCS.SAS UPCASE FIRST CHAR OF WORD UTLCFLD.SAS SOURCE CODE LOADER AND SPLITTER UTLCFFM1.SAS FORMAT THE FORMAT CODE UTLCFDA.SAS DATASETS THE DATASETS CODE UTLCFRP.SAS FORMAT THE REPORT CODE UTLCFDS.SAS CREATES DOCUMENTED DATASTEP CODE UTLCFSQ.SAS FORMAT THE DATASTEP CODE UTLPLTT.SAS PRODUCTION LOGGING OF ERRORS UTLORPO.SAS ODBC PER ORACLE UTLRBTC.SAS REMOTE SAS BATCH ON SERVER UTLDELE.SAS FILE HANDLER UTLSMPL.SAS SAMPLE PRINT PROGRAM UTLGDCI.SAS GET EXT FILE ATTRIBUTES MVS UTLSTMA.SAS EXECUTE MACROS STORED IN SAS DATASETS UTLLPUT.SAS PASS LOCAL MACRO VAR TO REMOTE HOST UTLBITT.SAS BIT TESTING IN WHERE CLAUSE UTLSFIO.SAS X PLATFORM SAS INPUT/OUTPUT ENGINE UTLFRIA.SAS FTP FILE FROM UNIX TO PC UTLFRIB.SAS FTP FILE FROM PC TO UNIX UTLFRIC.SAS FTP FILE FROM UNIX TO PC UTLFRID.SAS FTP FILE FROM PC TO UNIX UTLPDOC.SAS FLOW POINTS, GENERAL UTLRSHA.SAS RUN A CHILD C SHELL CRATE LOG UTLRSHB.SAS SAS BATCH C-SHELL RUN SCRIPT UTLMVSP.SAS PASSING PARMS TO SAS MVS ESA UTLFMTF.SAS EXAMPLE OF FUNCTIONS STORED IN FORMATS UTLFMTX.SAS EXAMPLE OF FUNCTIONS STORED IN FORMATS UTLXPNE.SAS EXPAND DMS EDITOR TO 255 CHARACTERS UTLWDCT.SAS COUNTS WORDS LIKE C1-C6 Y1-Y2 -> 8 UTLSQLT.SAS SQL SELF JOIN EXAMPLE UTLUDB2.SAS UPDATE DB2 TABLE VERY SYMPLE UTLSMRG.SAS STOPPING A VERY LARGE MERGE UTLAVAL.SAS CHECK SPACE BEFORE RUN UNIX UTLPGIN.SAS PAGE XX OF XX UTLMETM.SAS META DATA TABLE STRUCTURES UTLGDST.SAS DISTINCT X'S INTO MACRO VARS UTLFRLS.SAS RELEASE A FILE PREVIOUSLY HELD BY UTLHOLD UTLPLSQ.SAS ORACLE PL/SQL UTILITIES 1 UTLTRIM.SAS TRIM AND UPCASE CHARACTER VARIABLES UTLGEC.SAS LOADS GEOGRAPHY DEMENSIONS UTLMTMO.SAS EARLY DESIGN METATDATA UTLSFMT.SAS ANOTHER CODE FORMATTER UTLPCRF.SAS USER DEFINED TEMPLATE 1 OB PER PAGE UTLPCRF1.SAS USER DEFINED TEMPLATE 1 OB PER PAGE UTLFMRG.SAS FLATFILE MERGE UTLFTPX1.SAS ACCESS REMOTE SAS XPORT DATASET UTLPERF.SAS KMSELF ON LARGE TABLE PERF ISSUES UTLORAT.SAS ORACLE DICTIONARY STATUS UTLDYNT.SAS DYNAMIC TEMPLATES WITH PROC GREPLAY UTLANOG.SAS GRAHICS ANNOTATION UTLCALN1.SAS BUILD A BILLING CALENDAR UTLUNXB.SAS CHRON JOBS UNIX BATCH UTLRBAT.SAS SAS BATCH FROM EXCEL UTLUNIS.SAS PROC MEANS WITH MEDIAN UTLGGIF.SAS SAS GRAPH YO GIF FORMAT UTLDDEA.SAS MS-ACCESS TO SAS USING DDE UTLPV2S.SAS 2 PLOTS STACKED VERTICALLY UTLP2VS.SAS 2 PLOTS STACKED VERTICALLY UTLRSMP.SAS RANDOM SAMPLE OF N RECORDS UTLPDFC.SAS BUILDING ONE PDF OF 2 PAGES UTLRPSM.SAS PROC REPORT SAMPLES UTLGRSP.SAS PROC REPORT SAMPLES UTLOBDD.SAS READING MS-ACCESS TABLE VIA SAS UTLMVOT.SAS RETURNING MACRO VARS TO CALL PROGRAM UTLVSEL.SAS GET VIEW SELECT STATEMENT UTLWEBF.SAS RESTRUCURE WEB PAGE UTLORA1.SAS PL/SQL AND VARIABLES IN FROM CLAUSE UTLORA2.SAS PERL LOGON TO ORACLE UTLBUTN4.SAS ANOTHER FRAME?? UTLMACR.SAS INTERACTIVE MACRO DRIVER UTLTOXL.SAS DATASET TO EXCEL SHEET UTLDLBL.SAS RETRIEVE THE LABEL FROM TABLE UTLMVSD.SAS DOES AN MVS DATASET EXIST UTLMEAN.SAS UNIVARIATE PROC MEANS OUTPUT UTLOXCT.SAS DOES A SAS OBJECT EXIST UTLGTEM.SAS DYNAMIC SAS GRAPHICS TEMPLATES UTLDSQL.SAS EXECUTING PROCS INSIDE DATASTEPS UTLHYJK.SAS SAS DATASET TO MS-ACCESS TABLE UTLSQLZ.SAS SAMPLES OF BASIC SQL CODE UTLMKRT.SAS SAS MARKET RESEARCH CODE UTLPRJM.SAS PROJECT MANAGEMENT USING SAS UTLGRHO.SAS HOW TO SAS GRAPH UTLGRHP.SAS GRAPH EXAMPLES UTLGRHQ.SAS REPORTING FROM THE FEILD UTLCNCZ.SAS SAS CONNECT EXAMPLES UTLGRPY.SAS SAS GRAPH EXAMPLES 2 UTLGRPX.SAS SAS GRAPH EXAMPLES 3 UTLGRPW.SAS SAS REPORT EXAMPLES 3 UTLEXMY.SAS SAS EXAMPLES 4 UTLRPTX.SAS SAS REPORT WRITING UTLMVSV.SAS UTILITY TO READ MVS VTOC UTLACSA.SAS ACCESS TABLE TO SAS UTLXLOS.SAS EXCEL VB CALL TO RUN SAS? UTLCDAT.SAS CHECKING COLUMNS VALUE MACRO LANGUAGE UTLPLEX.SAS XCEPTIONS IN PL/SQL UTLNICX.SAS MAKE A NICE AXIS FOR GRAPH UTLSMDL.SAS S-DESIGNOR MAINTAINING PHYSICAL MODEL CHARATERISTICS UTLLOCL.SAS WINDOWS: CGI & SAS HTTP FORMS SERVER UTLBYVL.SAS FIX BYVAL VALUES IN TITLE UTLCURD.SAS CURRENT SAS DIRECTORY UTLEXRO.SAS READING ROWS FROM EXCEL UTLMITS.SAS CREATE MIT STANDARD FILE 300BYTE UTLMVST.SAS PERF PERSON CAPABILITIES UTLMVSU.SAS HOW TO UPLOAD MULTIPLE FILES FROM PC TO HOST? UTLDBIN.SAS KEEP ONLY KEYBOARD CHARS UTLXLAT.SAS KEEP ONLY KEYBOARD CHARS UTLSQUZ.SAS ZIP A SAS TRANSPORT DATASET UTLUNSQ.SAS UNSQUEEZE A SQUEEZED FILE UTLEPST.SAS ADD TITLE TO EPS FILE UTLPG31.SAS UTLPG31 IN C:\UTL UTLFTPC.SAS USEFUL COMMANDS TO FTP TO MAINFRAME UTLDSCB.SAS DISK / TAPE PROPERTIES TO MACRO VARS UTLDSCC.SAS MVS MAP DISK INFO FROM DSCB UTLDSDF.SAS MVS MAP DISK INFO FROM DSCB UTLDSDB.SAS DISK PROPERTIES TO MACRO VARS UTLWBAT.SAS SUBMIT A SEQUENCE SAS JOBS WIN95 UTLCSRC.SAS COMPRESS A FIXED LENGTH FILE UTLCRSC.SAS COMPRESS A FIXED LENGTH FILE UTLCRUN.SAS CRUNCH A FIXED RECORD FILE UTLUCRU.SAS COMPRESS A FIXED LENGTH FILE UTLCRUN1.SAS CRUNCH A FIXED RECORD FILE UTLUCRU1.SAS COMPRESS A FIXED LENGTH FILE UTLFDUP.SAS SQL FINDING DUPLICATE OBSERVATIONS UTLT2R.SAS COPY RANDOM R% OF FILE TO DISK UTLDSCB1.SAS DISK / TAPE PROPERTIES TO MACRO VARS UTLCREB.SAS CRUNCH A FIXED RECORD FILE UTLCREBO.SAS CRUNCH A FIXED RECORD FILE UTLRSEL.SAS RANDOMLY SELECT M OF N OBS UTLMRGK.SAS CHECK BEFORE YOU MATCH MERGE UTLCTAP.SAS CONCATENATING SAS TAPE DATASETS UTLCENS.SAS ZIP LAT LONG + OTHER FREE DAT UTLCRDN.SAS CARDINALITY OF SAS COLUMNS UTLRDZP.SAS READ A ZIPPED SAS DATASET UTLMTCI.SAS INFLATE MATCHCODE SEQ TO 16 BYTES UTLMKUZ.SAS UNZIP SEGMENTED INFOZIP FILES UTLOLEM.SAS SAS OLE COMMANDS TO CONTROL MS WORD UTLTYGX.SAS CONVERT TIGER MILE COORD TO LAT LONG UTLZMAP.SAS GIVEN ZIP->LAT LONG COUNT STATE FIPS UTLUPYP.SAS USING PIPES IN UNIX UTLUPCU.SAS ADD MEMBERS TO PC FOLDER USE DATE UTLCTON.SAS MACRO VARS WITH # WORDS AND WORD LIST UTLCAPT.SAS CONVERT CHARACTER VARIABLE TO PROPER NAME UTLFNDF.SAS LIST OF FILES IN DIRECTORY UTLPYPY.SAS EXAMPLE OF UNIX PIPES UTLDELF.sas DELETE MVS FILE UTLALOC.SAS ALLOCATE SAS LIB UTLTRSP.SAS TAPE RESPONSE TIMES FOR MVS' UTLRNDE.SAS RANDOM SAMPLE FROM A LARGE DATASET UTLRSVG.SAS EXCEL TO SAS VIA ODBC UTLMDOC.SAS GAZETTER LAYOUTS FOR ZIP LAT/LONG UTLZMAP1.SAS ZIP TO STATE COUNTY FOR GMAP UTLFIXG.SAS PLOT POINTS ON GMAP OF TEXAS UTLZMPA.SAS MAP ZIPCODE DATA US STATE OR COUNTY UTLDFTP.SAS DEFER TAPE MOUNTS USE AFF UTLMCXST.SAS DOES A MACRO VAR EXIST UTLMACXT.SAS MACRO FOR TESTING FOR EXISTENCE OF A MACRO UTLVBAA.SAS VB USING SAS UNIVERSAL ODBC DRIVER UTLVBAS1.SAS EXECUTABLES FOR NON SAS PCS UTLTSSN.SAS TSO HOW TO SEND MSG TO MULTIPLE USERS UTLTIEG.SAS COUNTY MAP WITH ROADS AND DATA UTLTIEG1.SAS COUNTY MAP WITH ROADS AND DATA UTLZMPB.SAS STATE AND COUNTY MAPS WITH RANK UTLZMPB1.SAS STATE AND COUNTY MAPS WITH RANK UTLVIWS.SAS WEB SERVER AND ASP WITH MS-VISUAL INTERDEV UTLOBTB.SAS LIST OF ACCESS TABLES/OBJECTS UTLODBS.SAS MS-ACCESS TABLE TO SAS DATASET UTLOBDS.SAS MS-ACCESS TABLE TO SAS DATASET UTLFIAN.SAS BEST FLATFILE PROGRAM */ ;;; /*------------------------------------------------------------*\ | | | Put the magic reset string into function F1 | | | \*------------------------------------------------------------*/ data _null_; length utl_f1 $200; utl_f1="dm 'keydef f1 ''~/*''''''*/"!! ' '!! '*'!! ')'!! "'';''"!! '*'!! '/'!! "'';''"!! '/'!! "''*''"!! ' """" '!! '*'!! '/'!! "'';%''"!! 'M'!! 'E'!! 'N'!! 'D'!! "'';''"!! 'Q'!! 'U'!! 'I'!! 'T'!! "'';''"!! 'E'!! 'N'!! 'D'!! "'';''"!! 'R'!! 'U'!! 'N'!! "'';*''"!! "'''''''"; put utl_f1=; call execute(utl_f1); call execute(utl_f1); run; ;;;; run; DM 'KEYDEF ''RMB'' ''PASTE''' ; DM 'KEYDEF ''CTL RMB'' ''SUBMIT'''; DM 'KEYDEF ''SHF RMB'' '':i10''' ; DM 'KEYDEF F2 RIGHT 1'; DM 'KEYDEF F3 END'; DM 'KEYDEF F4 LEFT 1'; DM 'KEYDEF F5 RFIND'; DM 'KEYDEF F6 RCHANGE'; DM 'KEYDEF F7 1'';''F """ """ '';''MARK'';''HOME'';''2'';''HOME'';''MARK'';''HOME'';''STORE'';''HOME'';''UNMARK'';'''; DM 'KEYDEF F8 NOTESUBMIT'; DM 'KEYDEF F9 :d1'; DM 'KEYDEF F11 LOG'';''TOP'';''FIND """ERROR"""'; ;;;;RUN; DM 'KEYDEF F12 LOG'';''CLEAR'';''OUT'';''CLEAR'';''PGM'';''SUB'';'''; DM 'KEYDEF ''CTL B'' ''UP 1'''; DM 'KEYDEF ''CTL D'' ''DOWN 1'''; DM 'KEYDEF ''CTL E'' ''~INC "D:\UTL\UTL_XXXXXXXX.SAS"'''; DM 'KEYDEF ''CTL G'' ''~CREATE TABLE SQL.NEWTABLE LIKE SQL.OLDTABLE;'''; DM 'KEYDEF ''CTL H'' ''UTL_SAVEPROFILES'''; DM 'KEYDEF ''CTL I'' ~''/''*------------------------------------------------------------*\'; DM 'KEYDEF ''CTL J'' ~| |'; DM 'KEYDEF ''CTL K'' ~\*------------------------------------------------------------*''/'''; DM 'KEYDEF ''CTL L'' ''UTL_REPAIRPROFILES'''; DM 'KEYDEF ''CTL M'' ''~SELECT COUNT(*) INTO :UT FROM SASHELP.PRODUCTS'''; DM 'KEYDEF ''CTL Q'' ''~%UTLCOPY(UIN1=D:\OBJ,UINMEM11=TWIN1,UOTMEM11=TWIN2)'''; DM 'KEYDEF ''CTL R'' ''UTL_RESTOREPROFILE'''; DM 'KEYDEF ''CTL T'' ''~SEE ABOVE DMKEYS;UPDATE A SET X=(SELECT Y FROM B WHERE A.X=B.X);'''; DM 'KEYDEF ''CTL U'' ''~%UTLXPRT(UIN=D;\OBJ,UMEM=TABLE1,UOB=5)'''; DM 'KEYDEF ''CTL W'' ''~%UTLVENN(UIN=E:\OBJ,UINMEMA=TABLE1,UVARA=PATID,UINMEMB=TABLE2,UVARB=PTNO)'''; DM 'KEYDEF ''CTL Y'' ''~PROC DATASETS DDNAME=IN;MODIFY &MBR;INDEX DELETE &INDEX;QUIT;'''; DM 'KEYDEF ''SHF F1'' ''~UTLFSV OBJ.'''; DM 'KEYDEF ''SHF F2'' ''~UTLCON OBJ.'''; DM 'KEYDEF ''SHF F3'' ''~SELECT MSGID,(100*MSGID/SUM(MSGID)) AS PCNT FROM SASHELP.SASMSG;'''; DM 'KEYDEF ''SHF F6'' ''~CREATE TABLE D (S INT,T DATE LABEL="D");INSERT INTO D VALUES(1,"01JAN99"D)'''; DM 'KEYDEF ''SHF F7'' ''~%SYSFUNC(TRANWRD("&UTL_VAR",%STR( ),","))'';'''''; DM 'KEYDEF ''SHF F8'' ''~SELECT A, B, INTO :UA SEPARATED BY " ",:UB SEPARATED BY " " FROM OBJ.'''; DM 'KEYDEF ''SHF F9'' ''~DATA TST(INDEX=(TRIALPNO/UNIQUE CLUSTER1=(TRIAL PTNO)/UNIQUE))'''; DM 'KEYDEF ''SHF F10'' ''~SEL COU(DISTI X) INTO :Z FROM T;%LET T=&Z;SEL DISTI(X) INTO :V1-:V&T FROM T'''; DM 'KEYDEF ''SHF F11'' ''~SELECT A,CASE WHEN ID=9 THEN 1 WHEN ID=0 THEN 1 ELSE 0 END AS RECODE'''; DM 'KEYDEF ''SHF F12'' ''~PROC TABULATE DATA=;CLASS SEX TRT;TABLE SEX,TRT*(N PCTN)/RTS=8'''; DM 'KEYDEF ''CTL F1'' ''~SELECT COUNT(*) INTO :UT FROM SASHELP.PRODUCTS'''; DM 'KEYDEF ''CTL F2'' ''~FILENAME FREF ;PROC FSLIST FILEREF=FREF;RUN;'''; DM 'KEYDEF ''CTL F3'' ''~SELECT PROD AS NAME FROM SASUSER.PRODUCTS GROUP BY NAME HAVING COUNT(*) gt 1'''; DM 'KEYDEF ''CTL F11'' ''~DATA X;S="SEL Y FROM X";Y=2;PROC SQL;SEL S INTO :C FROM X;CREA TABL Z AS &C'''; DM 'KEYDEF ''CTL F12'' ''~DATA DEL;SET OBJ.;WHERE NAME LIKE "B_B" "%B%" "B%B" NAME =*(SOUNS LIKE) _ '''; DM 'KEYDEF ''ALT F1'' ''~SELECT A,CASE WHEN I BETWEEN 2 AND 30 THEN 0 WHEN I 1 THEN 1 ELSE 9 END AS MS'''; DM 'KEYDEF ''ALT F2'' ''~UTLIOTA 20'''; DM 'KEYDEF ''ALT F3'' ''~SAMPLE IML CODE INC UTLIML1 UTLIML2 UTLIML3 UTLIMLS'''; DM 'KEYDEF ''ALT F11'' ''~SELECT * FROM OBJ. ORDER BY PUT ( PATID, PAT2AGE. )''' ; DM 'KEYDEF ''ALT F12'' ''~%UTLNOPTS'''; %utlopts; %mend utl_dmkeys; /*-----------------------------------------*\ | Template program used in demo | \*-----------------------------------------*/ The macro variables that form the arguments below are automatically saved as meta data so that reports, timelines etc can be produced automatically later. %utl_meta does %macro Asa_PynLabFin578 /* Molecule Protochol Lab Final 578 patients */ ( Utl_Title=%nrstr(Table 25 Final Laboratory Analysis Changes from Baseline Molecule=Asa Protochol=Pyn), Uobj=Asa_PynLabFin578, /*------------------------------------------*\ | Inputs | \*------------------------------------------*/ Utl_InLib01=OraCln, /* set in autoexec */ Utl_InMem0101=Asa_PynLabBas576, Utl_InMem0102=Asa_PynLabFin578, Utl_InFmt01=PynFmt, Utl_InFmt0101=pat2tym, /* patient to Time of first dose / version 9 has long format names */ Utl_InFmt0102=pat2rth, /* patient Arthritis = Y/N */ /*------------------------------------------*\ | Process | \*------------------------------------------*/ Utl_ProtoVio=%str("7890","3256"), Utl_Opts=%str(ps=62 ls=150 nocenter formdlim=''), Utl_Para1=%nrstr(Laboratory changes for the Asa molecule, Acetasalacylic Acid, under the Pyn protochol), Utl_Para2=%str(is presented here. Baseline data were those results taken at 0 time.), Utl_Para3=%str(Baseline data is in Table &Utl_InMem0101 while final data is in &Utl_InMem0102), Utl_Para4=%str(Patients &Utl_ProroVio were excluded due to missing baseline data), /*------------------------------------------*\ | Inputs | \*------------------------------------------*/ Utl_OtLst01=Rep, Utl_OtLst0101=Asa_PynLabFin578.out, Ut_Flop=III /* macro is called to produce at least 3 diff outputs */ ) / Des="Table 25 Final Laboratory Analysis Changes"; %global Upg; %let Upg=&sysmacroname; %let Upg=%lowcase(&Upg); run; Proc Sql; Create Table Asa_PynLab01 ( centre numeric, country char(4), Trt numeric ); insert into Asa_PynLab01 values(11 ,"AA",33 ) values(1111 ,"AA",333) values(11 ,"AA",33 ) values(1 ,"AA",3 ) values(1 ,"AA",3 ) values(1111 ,"AA",333) values(1 ,"A ",3 ) values(1 ,"A ",3 ) values(11 ,"AA",33 ) values(1 ,"AA",3 ) values(1 ,"A ",33 ) values(1 ,"AA",3 ) values(1 ,"A ",3 ) values(11 ,"AA",33 ) values(1 ,"AA",3 ) values(1111 ,"AA",333) values(1 ,"A ",3 ) values(11 ,"AA",33 ) values(1 ,"AA",3 ) values(1111 ,"AA",333) values(1 ,"A ",333) values(11 ,"AA",33 ) values(1 ,"A ",3 ) values(11 ,"AA",33 ) values(1 ,"AA",3 ) values(1111 ,"AA",333) values(1 ,"A ",3 ) ; quit; run; PROC TABULATE DATA=Asa_PynLab01; CLASS Country Trt; table country,trt*(n pctn)/rts=16; run; dm "out;save work.lab.lab.output replace;top;home"; dm "note work.lab.lab.output;c ' 1.00' 'next extract' all"; %Utl_Meta; /* update a row in meta table using primary key pgm!sod version #. utl_flop is unique for each production invocation ( I use roman numerals ) version # is updated autmatically every time you checkin a object */ %Mend Asa_PynLabFin578; %Asa_PynLabFin578; * Command line macros demonstarted at gabfest ; %macro prnt /cmd parmbuff; /*-----------------------------------------*\ | prnt work.tst 4 | \*-----------------------------------------*/ %local arg1 arg2; %let arg1=%scan(&syspbuff,1,%str( )); %let arg2=%scan(&syspbuff,2,%str( )); note;notesubmit '%prnta'; %mend prnt; %macro prnta /des="Print n obs from table"; proc print data=&arg1. ( Obs= &arg2. ); run; %mend prnta; %macro prntv /cmd parmbuff; /*-----------------------------------------*\ | prntv work.tst 4 sex age | \*-----------------------------------------*/ %Let ArgLst=&syspbuff; note;notesubmit '%prntva'; %mend prntv; %macro prntva /des="Print obs from table"; %local i; %Utlmary(uroot=mvar,ustr=&ArgLst); run; /* must have this run */ proc print data=&mvar1. ( Obs= &mvar2. ); var %do i=3 %to &mvar; &&mvar&i %end; ; run; %mend prntva; %macro frq /cmd parmbuff; /*-----------------------------------------*\ | frq work.tst sex*age | \*-----------------------------------------*/ %local arg1 arg2; %let arg1=%scan(&syspbuff,1,%str( )); %let arg2=%scan(&syspbuff,2,%str( )); note;notesubmit '%frqa'; %mend frq; %macro frqa /des="Print n obs from table"; proc freq data=&arg1.; tables &arg2. / missing; run; %mend frqa; %macro cnt /cmd parmbuff; /*-----------------------------------------*\ | cnt work.tst age | \*-----------------------------------------*/ %local arg1 arg2; %let arg1=%scan(&syspbuff,1,%str( )); %let arg2=%scan(&syspbuff,2,%str( )); note;notesubmit '%cnta'; %mend cnt; %macro cnta /des="Print n obs from table"; proc sql; select count (distinct &arg2.) as d_arg1 from &arg1.; quit; run; %mend cnta; %macro rptv /cmd parmbuff; /*-----------------------------------------*\ | rptv work.tst max sex age | \*-----------------------------------------*/ %Let ArgLst=&syspbuff; note;notesubmit '%rptva'; %mend rptv; %macro rptva /des="Print obs from table"; %local i; %Utlmary(uroot=mvar,ustr=&ArgLst); run; /* must have this run */ proc report data=&mvar1. ( Obs= &mvar2. ) box panels=99 nowd; cols %do i=3 %to &mvar; &&mvar&i %end; ; quit; run; %mend rptva; %macro utlmary ( uroot=, /* root macro var for subscripting ie x1, x2 .. xn */ /* macro var x will contain the number of word in list */ ustr=, /* blank separated words ie Rover Spotty Fluffy */ udlim=%str( ) ) /des="macro vars with # words and word list"; /*----------------------------------------------*\ | | | WIN95 SAS612 | | | | Given a macro variable which contains | | a string of blank separated words. Return the | | number of words in the list. | | | | Also create a sequence of macro variables. | | One for each word in the list. | | | |================================================| | | | This code does not create global macro variabls| | but does add macro variables to the scope | | of the calling macro | | | | This code cannot be run inside a datastep | | | |================================================| | | | | | Sample Usage | | ============ | | | | %utlmary(uroot=mvar,ustr=Rover Spotty Fluffy); | | | | Result | | | | &mvar contains 3 | | &mvar1 contains Rover | | &mvar2 contains Spotty | | &mvar3 contains Fluffy | | | | %put I have &mvar friends; | | | | Result | | ====== | | I have 3 Friends | | | | %put My first friend was &mvar1; | | | | Result; | | ====== | | My first friend was Rover; | | | | | | %put My 2nd friend was &mvar2; | | | | Result | | ====== | | My 2nd friend was Spotty; | | | | | | | \*----------------------------------------------*/ /*%^&*------------------------------------------*\ | | | Description: | | | | | | Given a macro variable which contains | | a list of blank separated words. | | ( macro does support other delimiters ) | | | | This macro is not bulletproof, it does not | | check for empty lists and may fail for some | | when input text has ,&,,& type characters. | | | | IPO | | | | INPUTS | | ====== | | | | A root macro variable name. Numeric | | subscripts will be attached to this root. | | If mvar is the root then the code may create | | aditional macro vars mvar1, mvar2 ... mvarn | | | | A string of blank separated words | | | | %let friends = Rover Spotty Fluffy | | | | | | PROCESS | | ======= | | | | Scan the list incrementing and create a | | macro varable with the number of words and | | a macro variable for each word in the string | | | | OUTPUTS | | ======= | | | | If the root is X and the string is | | | | Rover Spotty Fluffy, then macro vars | | | | &X will contain 3 | | &X1 will contain Rover | | &X2 will contain Spotty | | &X3 will contain Fluffy | | | | | |================================================| | | | This macro does not create global macro | | variables. The macro variables are placed in | | the scope of the calling nacro. | | | | This macro will not work inside a datastep. | | | \*----------------------------------------------*/ %local utlmary1 utlmary2 utlmary3; /*-------------------------------------*\ | | | I use these terrible names so that | | user defined global macro vars | | will never collide with my utilities | | | | The macro keyword arguments are | | registered names. | | | \*-------------------------------------*/ %do %until(%quote(&utlmary1)=%str()); %let utlmary2=%eval(&utlmary2 + 1); %let utlmary1=%qscan(%str(&ustr), &utlmary2, %str(&udlim)); %let &uroot.&utlmary2 = &utlmary1; %end; %let &uroot = %eval ( &utlmary2 - 1 ); data _null_; call symput ( "&uroot" , "&&&uroot&utlmary3" ); %do utlmary3 = 1 %to &utlmary2; call symput ( "&uroot.&utlmary3" , "&&&uroot&utlmary3" ); %end; /*-------------------------------------*\ | | | Do not put a run statement after this | | data null. The next run in the | | calling program will assure that | | the macro generated macro | | variables will be contained in the | | scope of the calling program. | | | \*-------------------------------------*/ %mend utlmary; proc freq noprint; table x*y / chisq; output out=data1 chisq ; run; /*------------------------------------------------------*\ | | | Create macro var list = Sex Age Height Weight | | and Table | | | | Table List | | | | Name | | ====== | | 1 Name | | 2 Sex | | 3 Age | | 4 Height | | 5 Weight | | | | In one sql create table | | | | | \*------------------------------------------------------*/ proc sql; %let list=; create table _list as select name||resolve('%let list=%left(&list '||trim(name)||');') as name from dictionary.columns where libname='SASHELP' and memname='CLASS' ; quit; data table_list (Keep=name); set sashelp.vcolumn (where=(libname eq 'SASHELP' AND memname eq 'CLASS') ); call symput('list', "&list" || ' ' || name ); output; run; * pop up window with job status; %macro longtim; %do x=1 %to 999; data _null_; do i=1 to 1000; end; run; data _null_; file userNote; put "The looping is now at &x"; run; %end; %mend; filename userNote terminal; %longtim; filename userNote clear; %Macro Utl_DivChk(Utl_Dnm); /*------------------------------------------*\ | How this works: | | | | The ordinal function selects the nth | | item from an ordered list ie | | | | Ordinal(2,.,3,-99) | | | | Here we are asking for the second item | | after .,3,-99 have been put in order. | | | | Sort .,3,-99 => .-99,3 so -99 is answer | | | | Since '.' is less than any real number | | it will always be first. | | | | If the denominator is ne 0 the | | ordinal will select the denominator | | and do the division, else it will | | select '.' and yeild a missing | | quotient without a divide by zero warning | | | \*------------------------------------------*/ / ordinal((&utl_dnm ne 0)+1,.,&utl_dnm ) %Mend Utl_DivChk; /*------------------------------------------*\ | This program will not issue divide by 0 | | errors | \*------------------------------------------*/ Data _null_; Do t = 10, 24, 40 ; Do b = ., 0, 1, 2; y= t %Utl_DivChk(b) ; put t= b= y=; End; End; Run; /*------------------------------------------*\ | | | You need a SAS table of all your files and| | directories in your home area on | | the HP Unix server | | from Steve Goins on SAS-L | | modified by Roger DeAngelis 8/12/02 | | | | | | Here is an example of what you want | | | | cdp99999 | | clipboard.txt | | doc | | nsmail | | nut | | sas612user | | sas8user | | tmp | | | \*------------------------------------------*/ *Solution; Filename DirLst pipe "ls $HOME"; Data DirLst; Informat DirNam $50.; Infile DirLst TruncOver; /* often better than missover */ Input DirNam &; /* read using informat until a blank is found */ Run; proc print data=DirLst; run; /*---------------------------------------------*\ | | | Return arguments from macros. The object is | | to pass data or variables back to the | | calling program. The data or variables are | | placed in the scope of the calling program | | Global variables are created here because the | | calling program is in open code. Wrap a | | macro around the calling program and the | | macro variables are in the scope of | | the calling program. | | | | | | We would like to do something like this | | | | %Area(2,4,Area); | | Run; | | %Put Area=&Area; | | | | and get | | | | Area=8 | | | | and have Area local to the calling pgm scope | | | | Solution: | | | | %Macro Area(length,width,Area); | | | | %let Area=%eval(&length.*&width.); | | | | Data _null_; | | | | call symput('Area',putn(&Area,2.-l)); | | %Mend; | | | | However thisrequires an incomplete data | | step and a strategic run statement; | | | | | | | \*---------------------------------------------*/ *==========================================================; * Symput Method %AreaSymput(2,4,Area); Run; %Put Area=&Area; Result Area=8 %Macro AreaSymput(length,width,Area); %let Area=%eval(&length.*&width.); Data _null_; call symput('Area',put(&Area.,2.)); %Mend AreaSymput; *==========================================================; * Sysparm Method for multiple arguments; %sqftvol(30,7,3,Sysparm=Area Volume); %Let Area=%sysparms(1); %Let Volume=%sysparms(2); %put area=&area volume=&volume; Result area=210 volume=630 %macro sysparms(idx); %scan(&sysparm,&idx); %mend sysparms; %macro sqftvol(length,width,height,sysparm=); %let sysparm= %left(%eval(&length * &width )) %left(%eval(&length * &width * &height )); %mend sqftvol; *==========================================================; * Peek Poke Method can be set up without using a global sysparm macro variable.; %area(30,7,Area=sysparm); %put Area= %sysfunc(peekc(&sysparm,3)); %macro area(length,width,Area=); %local answer ln; %let sysparm=%sysfunc(addr(sysparm)); %let answer=%left(%eval(&length * &width ))NN; %let ln=3; %syscall poke(answer,sysparm,ln) ; %mend area; %macro UtlAlib ( UtlAlib_LibRef ) / cmd; /*----------------------------------------------*\ | | | Suppose your SAS Object/Relational database | | is located in | | | | C:\My Documents\My SAS Files\ObjectRelational | | | | folder. | | | | And you do not want to type: | | | | libname obj | | "C:\My Documents\My SAS Files\ObjectRelational"| | | | to access it. | | | | | | What you want is line above in your paste | | buffer, that way you can | | | | Cntl-V or Edit-Paste it anywhere. | | | |================================================| | | | This macro is a modification of a macro | | that appeared in January SAS-L | | | | Subject: Re: Get data from clipboard | | From: dward@SASHELP.COM (David Ward) | | Date: Tue, 18 January 2000 04:05 PM EST | | | \*----------------------------------------------*/ /*----------------------------------------------*\ | | | Code Inspired by David Ward | | | | Version 8 TSO 00M0 Win Platforms | | | | | | Compucraft Inc | | 49 Spackenkill Rd | | Poughkeepsie, NY 12603 | | | | Office 914-463-2770 | | Fax 914-462-7595 | | | | Email deangel@horizsys.com | | xlr82sas@aol.com | | | | Compucraft is not responsible for any | | problems associated with this code. | | | | Use at your own risk | | | \*----------------------------------------------*/ %local UtlAlib_SavePath UtlAlib_TargetPath UtlAlib_FileId UtlAlib_TempFile ; /*------------------------------------------------------------*\ | Save the current working directory in macro var utlAlib0 | \*------------------------------------------------------------*/ %let rc =%sysfunc(libname(_,.)); %let UtlAlib_SavePath =%sysfunc(pathname(_)); %let rc =%sysfunc(libname(_)); /*------------------------------------------------------------*\ | Reassign the Current Working Directory | \*------------------------------------------------------------*/ dlgcdir; /*------------------------------------------------------------*\ | Save the New Current Directory Path in UtlAlib1_TargetPath | \*------------------------------------------------------------*/ %let rc =%sysfunc(libname(_,.)); %let UtlAlib_TargetPath =%sysfunc(pathname(_)); %let rc =%sysfunc(libname(_)); %if %upcase(&UtlAlib_Libref) ne %upcase(SAVE) %then x "cd &UtlAlib_SavePath";; /*------------------------------------------------------------*\ | Build Libname statement and save write to source Catalog | \*------------------------------------------------------------*/ %let UtlAlib1=TempFile; %let rc=%sysfunc(filename(UtlAlib1,work.UtlAlib1.UtlAlib1.source,CATALOG)); %let UtlAlib_FileId=%sysfunc(fopen(TempFile,O)); %let rc=%sysfunc(fput (&UtlAlib_FileId,%str( libname &Utlalib_LibRef "&UtlAlib_TargetPath"; ))); %let rc=%sysfunc(fwrite (&UtlAlib_FileId)); %let rc=%sysfunc(fclose (&UtlAlib_FileId)); %let rc=%sysfunc(filename(TempFIle,)); /*------------------------------------------------------------*\ | Store then Libname statement in the Past Buffer | \*------------------------------------------------------------*/ notepad work.UtlAlib1.UtlAlib1.source; 1;find " ";mark;home;bot;mark;store;home;unmark;end; %mend UtlAlib; * Right left and center justification of titles, footnotes puts and lines Suppose you want to produce the following output, with two title lines and one footnote line.; /*---------------------------------------------------------*\ | | | PAGE 1 15FEB95 | | | | JANE DOE ART HOMEWORK | | | | | | | | | | | | OBS OPTNAME SETTING | | | | 1 BATCH NOBATCH | | 2 BUFNO 3 | | 3 BUFSIZE 0 | | 4 BYERR BYERR | | 5 BYLINE BYLINE | | | | | | | | | | | | TABLE 1 | | | \*---------------------------------------------------------*/ *Solution: ; /* Options ls=70 ps=25 nodate nonumber;run; Title1 "%UtlJust(L=Page 1,R=15Feb95)"; Title2 ; Title3 "%UtlJust(L=Jane Doe,C=Art,R=Homework)"; Footnote1 "%utljust(R=Table 1)"; Proc Print Data=sashelp.voption(obs=5) widt=min; Var Optname; Run; * other uses are:; Data _Null_; Put "%UtlJust(L=%Str(Pgm: UtlJust),C=SasMacro,R=Nutley NJ)"; Run; %Put %UtlJust(L=%Str(Pgm: UtlJust),C=SasMacro,R=Nutley NJ); title;footnote; Proc Report Data=sashelp.voption(obs=5) Nowd ; Col Optname; Define OptName / display ''; compute before; lne="%UtlJust(L=Jane Doe,C=Art,R=Homework)" ; line @1 lne $%SYSFUNC(GETOPTION(LS)).; endcomp; quit; run; */ %MACRO UTLJUST ( UTITLE=LEFT RIGHT AND CENTER TEXT IN TITLES AND FOOTNOTES, UOBJ=UTLJUST, /*-------------------------------------*\ | INPUTS - TEXT TO BE JUSTIFIED | | | | SUPPOSE YOU NEED THE FOLLOWING: | | | | TITLE1 "PAGE 1 17FEB95";| | TITLE2 "JANE DOE ART HOMEWORK";| | | | FOOTNOTE1 " TABLE 1";| | | | IE PAGE 1 LEFT JUSTIFIED | | 17FEB95 RIGHT JUSTIFIED | | | | JANE DOE LEFT JUSTIFIED | | ART CENTERED | | HOMEWORK RIGHT JUSTIFIED | | | | TABLE 1 RIGHT JUSTIFIED | | | | YOU CANNOT HARDCODE THE TITLE STATE- | | MENTS BECAUSE LINSIZE WILL CHANGE | | SEVERAL TIMES DURING DEVELOPMENT | | | | YOU NEED THE MACROS REPEAT AND | | ROUND FOR THIS UTILITY. I HAVE | | ENCLOSED THE MACROS BELOW | | | | | \*-------------------------------------*/ L=%STR(), /* LEFT JUSTIFIED TEXT IE PAGE 1 */ R=%STR(), /* RIGHT JUSTIFIED TEXT IE 15FEB95 */ C=%STR(), /* CENTERED TEXT */ ) / DES ="LEFT CENTER RIGHT JUSTIFY TEXT"; /*-------------------------------------------------*\ | | | SAS 612 WIN95 1996 | | | | JUSTIFICATION OF TEXT ( TITLES AND FOOTNOTES ) | | | | NOTE THIS MACRO CAN BE USED TO JUSTIFY | | ANY TEXT | | | | IPO | | | | INPUTS | | ULEFT -- TEXT TO BE LEFT JUSTIFIED | | URIGHT-- TEXT TO BE RIGHT JUSTIFIED | | UCENTER- TEXT TO BE CENTERED | | | | | | PROCESS | | GET LINESIZE | | GET LENGTHS OF TEXT URIGHT ULEFT UCENTER | | COMPUTE NUMBER OF BLANKS BETWEEN TEXT | | CONCATENATE TEXT AAND BLANKS | | | | OUTPUT | | EXECUTION OF MACRO RESULTS IN THE | | A A SINGLE STRING OF TEXT WITH THE PROPER | | JUSTIFICATION. | | | \*-------------------------------------------------*/ /*------------------------------------------------------------------------------*\ | | | SAMPLE INVOCATION WITH OUTPUT | | | | OPTIONS LS=70 PS=20; | | RUN; | | | | TITLE1 "%UTLJUST(ULEFT=PAGE 1,URIGHT=15FEB95)"; | | TITLE2 ; | | TITLE3 "%UTLJUST(ULEFT=JANE DOE,UCENTER=ART,URIGHT=HOMEWORK)"; | | FOOTNOTE1 "%UTLJUST(URIGHT=TABLE 1)"; | | | | PROC PRINT DATA=SASHELP.VOPTION(OBS=5); | | VAR OPTNAME SETTING; | | RUN; | | | |================================================================================| | | | **** SAMLPLE OUTPUT ****** | | | | | | PAGE 1 15FEB95 | | | | JANE DOE ART HOMEWORK | | | | OBS OPTNAME SETTING | | | | 1 BATCH NOBATCH | | 2 BUFNO 3 | | 3 BUFSIZE 0 | | 4 BYERR BYERR | | 5 BYLINE BYLINE | | | | | | TABLE 1 | | | | | | | \*------------------------------------------------------------------------------*/ %Local U1 U2 ULC UREPS L R C; %Let Tst=%Length(&L.&C.&R); %IF %Str(&Tst.)=0 %Then %Do; %Put ; %Put You must provide some text to Justify ; %Put Please provide left, right or center text and resubmit; %Put ; %End; %Else %Do; /* 1 2 3 4 5 6 7 */ /* 1234567890123456789012345678901234567890123456789012345678901234567890 */ /* MACRO UTLJUST PAGE 10 15FEB95 */ /* ! ! ! ! */ /* U1 U2 U3 U4 */ /* */ %LET ULINSZ = %SYSFUNC(GETOPTION(LS)); /* GET LINESIZE */ %LET U1 = %LENGTH(&L); %LET U2 = %Sysfunc(ROUND(&ULINSZ/2-%LENGTH(&C)/2,1)); /* BEST POSITION */ %LET ULC = &L%Sysfunc(REPEAT(%STR( ),%EVAL(&U2-&U1-1)))&C; %LET UREPS = %EVAL( &ULINSZ - %LENGTH(&ULC) - %LENGTH(&R) ); &ULC%Sysfunc(REPEAT(%STR( ),%EVAL(&UREPS-2)))&R. %End; %MEND UTLJUST; /*=================================================================*/ /*== Deleting Data with SQL ==*/ /*=================================================================*/ /* * In this example, a copy is made of the Customer table so that the * permanently stored table is not modified. Here, all the customers * with stores in Virginia Beach are eliminated. */ create table cities as select * from customr; delete from cities where custcity = 'Virginia Beach'; title2 'CITIES TABLE'; select * from cities; /*=================================================================*/ /*== Updating data in tables. ==*/ /*=================================================================*/ /* * This is an example of an UPDATE statement using a CASE expression. * The case expression returns the multiplier that we would like * to modify the prodlist column by. */ create table updateex as select *, prodlist as oldlist from product; update updateex set prodlist = prodlist * case when prodcost < 1000 then 1.1 else 1.2 end where prodname not= 'kayak'; title2 'UPDATEEX TABLE'; select * from updateex; /* * This is an example of the previous example of an UPDATE statement * without a CASE expression. When you do not use a CASE expression, * you must use two UPDATE statements to modify the Updateex data. */ create table updateex as select *, prodlist as oldlist from product; update updateex set prodlist = prodlist * 1.1 where prodname not= 'kayak' and prodcost < 1000; update updateex set prodlist = prodlist * 1.2 where prodname not= 'kayak' and prodcost >= 1000; /*=================================================================*/ /*== VALIDATE statement ==*/ /*=================================================================*/ /* * This example checks the query for syntactic accuracy and writes a * message on the SAS log. */ validate select custname, custcity from customr where custcity contains 'Beach'; /*=================================================================*/ /*== MACRO VARIABLES set ==*/ /*== by PROC SQL statements ==*/ /*=================================================================*/ /* * This example retrieves the data in the Employee table but does not * display them in SAS output because of the NOPRINT option on the * PROC SQL statement. %PUT macro language statement is used to request * and display the &SQL variable values. */ proc sql noprint; select * from employe; %put sqlobs=**&sqlobs** sqloops=**&sqloops** sqlrc=**&sqlrc**; /* * This example demonstrates the use of a SUMMARY function * with a GROUP BY clause. The example lists the number of * different customers for each product whose outstanding * inventory count is more than 30 units. */ title2 'INVENTORIES GREATER THAN 30 UNITS'; select prodname as products, count(distinct custname) label='Number of Customers' from invoice as i1 group by prodname having (select sum(invqty) from invoice where prodname = i1.prodname ) > 30 order by 1,2; I have lost the original "LOCF" posting, but the essense, if I recall correctly, was to plug a nonmissing variable value instead of a consecutive series of missing values for the same variable *preceding* the non-missing value, so that a data set like this (EOS = End of study) data a ; input @1 visit $3. @5 score $4. @10 other 2. ; cards ; 1 poor 11 2 22 3 33 4 good 44 5 55 6 66 7 77 EOS fair 88 ; run ; would become this: Obs visit score other 1 1 poor 11 2 2 good 22 3 3 good 33 4 4 good 44 5 5 fair 55 6 6 fair 66 7 7 fair 77 8 EOS fair 88 where OTHER is a variable collectively representing other possible satellite variables in the record. There have been scores of interesting solutions; it occured to me that another one would not hurt too much. Like Howards, it effectively uses two passes through the file, but in a different (more parsimonious) manner: data b (drop = s); set a ; by score notsorted ; if score ne: '' then return ; if first.score then do p = _n_ by 1 until (s ne: put('', $4.) | p = n) ; set a (keep=score rename=(score=s)) point = p nobs = n ; end ; score = s ; run ; Basically, the scheme is very simple: 1. Read next record serially. 2. If score is nonmissing, output the record and go to 1. 3. Otherwise if the missing score is the first in the missing group, read the file from that point on forward using a direct access until a non-missing score or the end of file has been found. 4. Memorize the non-missing score. 5. Replace the score read from the serial buffer by the memorized value. 6 Output the record. 7. If any records left, go to 1, else stop. I would think the manner NOTSORTED is used to determine the beginning of the missing queue (instead of setting up flags and stuff) is somewhat unconventional, the rest is plain. Kind regards, ================== Paul M. Dorfman Jacksonville, FL ==================