/* Example OPEN Routine */ dsid = open('sasuser.idb_usa', 'V'); if (dsid=0) then do; link logerror; _status_='H'; return; end; /* Check the composite key and rebuild it if needed */ else if (ivarlist(dsid, 'prodcomp') ne 'PRODUCT COMPANY') then do; rc=idelete(dsid, 'prodcomp'); rc=icreate(dsid, 'prodcomp', 'product company', 'unique'); if (rc=0) then put 'NOTE: Composite index PRODCOMP created' 'for SASUSER.IDB_USA'; else do; put 'ERROR: Composite index PRODCOMP creation' 'failed for SASUSER.IDB_USA'; link logerror; _status_='H'; end; /* Close data set and use the return code from CLOSE */ /* to reset dsid to zero */ dsid = close(dsid); end; return; /* Last statement executed if _status_='H' */ LOGERROR: emsg=sysmsg(); rc=sysrc(); put emsg; put 'SYSRC=' rc; return; ________________________________________________________________________ /* Generalizing the OPEN Routine */ ENTRY dsname $ 17 dsid 8 optional = rebuilt 8; INIT: dsid=0; rebuilt=0; /* flags a previous ICREATE attempt */ OPENUP: dsid=open(dsname, 'u'); if (dsid=0) then do; link logerror; _status_='H'; return; end; /* Check the composite key, rebuild it if needed-but no */ /* second attempts! */ else if ( ivarlist(dsid, 'prodcomp') ne 'PRODUCT COMPANY' or ioption(dsid, 'prodcomp') ne 'UNIQUE MISSING' ) then do; if (rebuilt=0) then do; link recreate; goto openup; /* back to the top and try again */ end; else do; put 'ERROR: Verification failed on composite' 'index PRODCOMP of data set ' dsname; put ' PRODCOMP does not exist or is' 'constructed incorrectly.'; dsid=close(dsid); _status_='H'; end; end; return; /* If _status_ not = 'H', the key PRODCOMP is */ /* now in place; dsname is opened for update */ RECREATE: dsid=close(dsid); dsid=open(dsname, 'V'); if (dsid=0) then do; link logerror; _status_='H'; /* return to calling program with dsid=0 */ return; end; rc=idelete(dsid, 'prodcomp'); rc=icreate(dsid, 'prodcomp', 'product company', 'unique'); if (rc=0) then put 'NOTE: Composite index PRODCOMP created for data set ' dsname; else do; put 'ERROR: Composite index PRODCOMP creation' 'failed for data set ' dsname; link logerror; _status_='H'; end; dsid=close(dsid); rebuilt=1; /* no loops! */ return; LOGERROR: emsg=sysmsg(); rc=sysrc(); put emsg; put 'SYSRC =' rc; return; MAIN: return; TERM: return; ________________________________________________________________________ /* Calling the OPEN Routine */ /* caller specifies data set to be opened */ dset='sasuser.idb_euro'; dsid=0; call display('group.catalog.myopen.scl', dset, dsid); if (dsid < 1) then put 'Open for update failed for data set' dset; else do; call set(dsid);