/**********************************************************************/
libname dual '
/* your-saslib */
' disp=shr;
%let date='06JAN93'd;
%let userid=BOYLE;
%let dd=dual;
%let master=fitness;
%let journal=journal;
proc sort data=&dd..&master;
by patient;
run;
/**********************************************************************/
proc sort data=&dd..&journal out=journal;
by key descending datetime;
run;
/**********************************************************************/
/* Build transaction data set from journal */
data trans;
set journal(rename=(key=patient));
by patient
descending datetime;
keep patient age weight runtime rstpulse runpulse
maxpulse oxygen group datetime code1;
retain found 0
age weight runtime rstpulse runpulse
maxpulse oxygen group;
missing _;
if userid = "&userid" and
datepart(datetime)="&date"d
and substr(code,1,1)='2'
then do;
found=1;
code1=substr(code,1,1);
if code1='2' then code1='C';
/**********************************************************************/
if oldvalun=. then oldvalun='_';
if code1 ne 'A' then select (varchng);
when('AGE') age=oldvalun;
when('WEIGHT') weight=oldvalun;
when('RUNTIME') runtime=oldvalun;
when('RSTPULSE') rstpulse=oldvalun;
when('RUNPULSE') runpulse=oldvalun;
when('MAXPULSE') maxpulse=oldvalun;
when('OXYGEN') oxygen=oldvalun;
when('GROUP') group=oldvalun;
otherwise;
end; /* Select statement */
end; /* End do */
if last.patient and found=1 then do;
output;
age=.;
weight=.;
runtime=.;
rstpulse=.;
runpulse=.;
maxpulse=.;
oxygen=.;
group=.;
found=0;
end;
run;
/**********************************************************************/
data &dd..&master(keep=patient age weight
runtime rstpulse runpulse maxpulse
oxygen group)
except;
update &dd..&master(in=inf) trans(in=int);
by patient;
select(code1);
when('A') return;
when('C') do;
if not inf then output except;
output &dd..&master;
end;
when('D') do;
if inf then output except;
output &dd..&master;
end;
otherwise output &dd..&master;
end; /* End select */
run;
/**********************************************************************/
proc sort data=&dd..&journal out=journal;
by key datetime;
run;
/* Build transaction data set from journal data set */
data trans;
set journal(rename=(key=patient));
by patient datetime;
keep patient age weight runtime rstpulse runpulse
maxpulse oxygen group datetime code1;
retain age weight runtime rstpulse runpulse
maxpulse oxygen group;
missing _;
if datepart(datetime)>="&date"d
then do;
/* Build transaction obs */
code1=substr(code,1,1);
if code1='2' then code1='C';
if newvalun=. then newvalun='_';
select(varchng);
when('AGE') age=newvalun;
when('WEIGHT') weight=newvalun;
when('RUNTIME') runtime=newvalun;
when('RSTPULSE') rstpulse=newvalun;
when('RUNPULSE') runpulse=newvalun;
when('MAXPULSE') maxpulse=newvalun;
when('OXYGEN') oxygen=newvalun;
when('GROUP') group=newvalun;
otherwise;
end; /* Select statement */
if last.patient then do;
output;
age=.;
weight=.;
runtime=.;
rstpulse=.;
runpulse=.;
maxpulse=.;
oxygen=.;
group=.;
end;
end; /* End if datepart... then do */
run;
/* Update master data set with transactions */
data &dd..&master(keep=patient age weight
runtime rstpulse runpulse maxpulse
oxygen group);
update &dd..&master trans;
by patient;
if code1='D' then return;
else output;
run;
/**********************************************************************/
data temp;
set &dd..&journal;
if date(datetime) = today() - 1;
c1=substr(code,1,1);
run;
proc sort data=temp;
by datetime key c1;
run;
/**********************************************************************/
data _null_;
retain addcnt delcnt chngcnt dualcnt page 0 date;
length activity $9;
set temp end=eof;
by datetime key c1;
c2=substr(code,2,1);
file print header=hdr ps=60 n=1;
if _n_ = 1 then date=today();
if first.c1 then do;
select(c1);
when('A') do;
activity='ADD';
addcnt+1;
end;
when('D') do;
activity='DELETED';
delcnt+1;
end;
when('C') do;
activity='UPDATE';
chngcnt+1;
end;
when('2') do;
activity='DUAL UPDT';
dualcnt+1;
chngcnt+1;
end;
otherwise do;
put / 'Invalid code encountered. ' code= /;
end;
end; /* Select clause */
end;
if first.datetime then put @1 userid @9 datetime @;
if first.key then put @29 key @;
if first.c1 then put @40 activity @;
put @51 varchng @;
if c1 in ('C','2','D') then do;
if c2= 'N' then
put @66 'New: ' newvalun @;
else put @66 'New: ' newvaluc @;
if c1 = 'C' or c1='2' then do;
if c2='N' then do; /* Numeric change */
if oldvalun = . then put;
else put / @66 'Old: ' oldvalun;
end;
else do; /* Character change */
if oldvaluc = ' ' then put;
else put / @66 'Old: ' oldvaluc;
end;
end;
end;
else do;
if c2='N' then put @66 newvalun;
else put @66 newvaluc;
end;
if eof then do;
file print notitles;
put /// 'FSEDIT TRANSACTION SUMMARY';
put / 'Total Records Added: ' addcnt
/ 'Total Records Deleted: ' delcnt
/ 'Total Records Updated: ' chngcnt
// 'Total Records Updated via Dual Data Entry:
' dualcnt //;
end;
return;
hdr: page+1;
put 'Journal Transaction Log for ' date date7.
@125 'Page ' page
// @1 'Userid'
@9 'DateTime'
@29 'Key Value'
@40 'Code'
@51 'Variable'
/ @1 '___'
@9 '_________'
@29 '_____'
@40 '__'
@51 '____';
return;
run;
/**********************************************************************/