49%macro mp_prevobs(action,record,history=5,prefix=mp_prevobs
51%let action=%upcase(&action);
52%let prefix=%upcase(&prefix);
53%let record=%eval((&record+0) * -1);
55%
if &action=INIT %then %
do;
58 attrib &prefix._VAR length=$64;
59 dcl hash &prefix._HASH(ordered:
'Y');
61 &prefix._HASH.defineKey(
"&prefix._KEY");
63 call vnext(&prefix._VAR);
64 if &prefix._VAR=
'' then leave;
65 if &prefix._VAR eq
"&prefix._VAR" then
continue;
66 else if &prefix._VAR eq
"&prefix._KEY" then
continue;
67 &prefix._HASH.defineData(&prefix._VAR);
69 &prefix._HASH.defineDone();
73 &prefix._rc=&prefix._HASH.add();
74 if &prefix._rc then putlog
'adding' &prefix._rc=;
75 %
if &history>0 %then %
do;
76 if &prefix._key>&history+1 then
77 &prefix._HASH.remove(key: &prefix._KEY - &history - 1);
78 if &prefix._rc then putlog
'removing' &prefix._rc=;
81%
else %
if &action=FETCH %then %
do;
82 if &record>&prefix._key then putlog
"Not enough records in &Prefix._hash yet";
83 else &prefix._rc=&prefix._HASH.find(key: &prefix._KEY - &record);
84 if &prefix._rc then putlog &prefix._rc=
" when fetching " &prefix._KEY=
85 "with record &record and " _n_=;