![]() |
![]() |
Examples of SAS/ACCESS DATA Step Programs |
This example contains two separate DATA steps and demonstrates the use of the RETURN and GET calls across executions of the DATA step. The first DATA step creates an output data set containing index values from EMP-NAME-NDX. The RETURN command is used to navigate the index set. The index values stored in WORK.EMPSRTKY are used to locate EMPLOYEE records in the second DATA step. Once a record is located, a GET call moves the record data to the input buffer. The numbers in the program correspond to the numbered comments following the program.
1 *options $idmdbug; data work.empsrtky; length namekey $ 25; keep namekey; 2 infile empss01 idms func=func sequence=seq dbkey=dkey sortfld=skey errstat=stat set=inset; /* RETURN EMP-NAME-NDX key values to store */ /* in EMPSRTKY data set */ 3 func = 'RETURN'; seq = 'FIRST'; inset = 'EMP-NAME-NDX'; skey = ' '; dkey = ' '; 4 do until (stat ne '0000'); input; if stat not in ('0000', '1707') then go to staterr; if stat = '0000' then do; namekey = skey; output; dkey = ' '; skey = ' '; seq = 'NEXT'; end; end; 5 _error_ = 0; stop; 6 staterr: put @1 'ERROR: ' @10 func @17 'RETURNED STATUS =' @37 stat ; put @1 'ERROR: INFILE parameter values are: '; put @1 'ERROR: ' seq= inset= dkey= skey=; put @1 'ERROR: DATA step execution terminating.'; _error_ = 0; stop; run; proc print data=work.empsrtky; title1 'This is a List of Index Entries from EMP-NAME-NDX'; run; data work.employee; drop namekey; 7 infile empss01 idms func=func sortfld=skey ikeylen=keyl errstat=stat set=inset record=recname; /* BIND the record to be accessed */ 8 if _n_ = 1 then do; func = 'BIND'; recname = 'EMPLOYEE'; input; if stat ne '0000' then go to staterr; end; /* Read NAMEKEY values from EMPSRTKY and */ /* FIND EMPLOYEE using the EMP-NAME-NDX */ 9 set work.empsrtky; func = 'FIND'; recname = 'EMPLOYEE'; inset = 'EMP-NAME-NDX'; skey = namekey; keyl = 25; input; if stat not in ('0000', '0326') then go to staterr; if stat = '0000' then do; func = 'GET'; recname = ' '; inset = ' '; skey = ' '; keyl = 0; input @; if stat ne '0000' then go to staterr; input @1 employee_id 4.0 @5 firstname $char10. @15 lastname $char15. @30 street $char20. @50 city $char15. @65 state $char2. @67 zip $char9. @76 phone 10.0 @86 status $char2. @88 ssnumber $char9. @97 startdate yymmdd6. @103 termdate 6.0 @109 birthdate yymmdd6.; output; end; 10 else do; put @1 'WARNING: No EMPLOYEE record with name = ' namekey; put @1 'WARNING: Execution continues with next NAMEKEY'; _error_ = 0; end; return; 11 staterr: put @1 'ERROR: ' @10 func @17 'RETURNED STATUS =' @37 stat ; put @1 'ERROR: INFILE parameter values are: '; put @1 'ERROR: ' inset= skey= keyl= recname=; put @1 'ERROR: DATA step execution terminating.'; _error_ = 0; stop; run; proc print data=work.employee; format startdate birthdate date9. title1 'This is a List of Employee Information Obtained'; title2 'Using a Transaction Data Set Containing Name Index Values'; run;
| |
| |
| |
The DO UNTIL loop executes as long as STAT equals 0000. When the index set has been traversed and all sort values returned and stored in output data set WORK.EMPSRTKY, CA-IDMS returns a 1707 status code, which terminates the loop. | |
| |
| |
| |
| |
| |
| |
|
The following output shows a portion of the output from this program.
This is a List of Index Entries from EMP-NAME-NDX Obs namekey 1 ANDALE ROY 2 ANGELO MICHAEL 3 ARM HARRY 4 BANK MONTE 5 BLOOMER JUNE 6 BOWER CHARLES 7 BREEZE C. 8 CLOTH TERRY 9 CLOUD BETH 10 CRANE HERBERT 11 CROW CAROLYN 12 DONOVAN ALAN 13 DOUGH JANE 14 FERNDALE JANE This is a List of Employee Information Obtained Using a Transaction Data Set Containing Name Index Values employee_ Obs id firstname lastname street city state 1 466 ROY ANDALE 44 TRIGGER RD FRAMINGHAM MA 2 120 MICHAEL ANGELO 507 CISTINE DR WELLESLEY MA 3 457 HARRY ARM 77 SUNSET STRIP NATICK MA 4 7 MONTE BANK 45 EAST GROVE DR HANIBAL MA 5 69 JUNE BLOOMER 14 ZITHER TERR LEXINGTON MA 6 119 CHARLES BOWER 30 RALPH ST WELLESLEY MA 7 467 C. BREEZE 200 NIGHTINGALE ST FRAMINGHAM MA 8 479 TERRY CLOTH 5 ASPHALT ST EASTON MA 9 371 BETH CLOUD 3456 PINKY LN NATICK MA 10 4 HERBERT CRANE 30 HERON AVE KINGSTON NJ 11 334 CAROLYN CROW 891 SUMMER ST WESTWOOD MA 12 366 ALAN DONOVAN 6781 CORNWALL AVE MELROSE MA 13 24 JANE DOUGH 15 LOCATION DR NEWTON MA 14 32 JANE FERNDALE 60 FOREST AVE NEWTON MA Obs zip phone status ssnumber startdate termdate birthdate 1 03461 6175541108 03 027601115 15JUN1978 0 04MAR1960 2 01568 6178870235 01 127675593 08SEP1979 0 05APR1957 3 02178 6174320923 05 028770147 01DEC1977 0 05APR1934 4 02415 6173321933 01 022446676 30APR1978 0 01JAN1950 5 01675 6175555544 01 039557818 05MAY1980 0 25APR1960 6 01568 6178841212 01 092345812 14DEC1977 0 04MAR1939 7 03461 6175542387 01 111556692 02JUN1979 0 04MAY1934 8 05491 6177738398 01 028701666 02NOV1979 0 04MAR1945 9 02178 6174321212 01 326710472 04MAR1977 0 09SEP1945 10 21341 2013341433 01 016777451 14MAY1977 0 21MAR1942 11 02090 6173291776 01 023980110 17JUN1979 0 03APR1944 12 02176 6176655412 01 025503622 10OCT1981 0 17NOV1951 13 02456 6174458155 01 022337878 08AUG1976 0 29MAR1951 14 02576 6178888112 01 034567891 09SEP1979 0 17JAN1958
![]() |
![]() |
Copyright © 2007 by SAS Institute Inc., Cary, NC, USA. All rights reserved.