/**********************************************************************/
%let username=&sysjobid; /* on MVS system */
%let journal=fileref.journal;
%let master=fileref.master;
%let key1=ID; /* name of key variable */
/**********************************************************************/
FSEINIT: link JRNFINIT;
/* any other application specific code */
return;
INIT: link JRN_INIT;
/* any other application specific code */
return;
MAIN: link JRN_MAIN;
/* any other application specific code */
return;
TERM: link JRN_TERM;
/* any other application specific code */
return;
FSETERM: link JRNFTERM;
/* any other application specific code */
return;
JRNFINIT:
/* journal program specific code */
return;
JRN_INIT:
/* journal program specific code */
return;
JRN_MAIN:
/* journal program specific code */
link WRITEJRN;
return;
JRN_TERM:
/* journal program specific code */
WRITEJRN:
return;
JRNFTERM:
/* journal program specific code */
return;
/**********************************************************************/
JRNFINIT:
/**********************************************************/
/* The four macro variables, USERNAME, JOURNAL, MASTER, */
/* and KEY1 are created external to the FSEDIT session */
/**********************************************************/
control always;
/* get user making changes */
length lastcode $2 datetime 8;
userid=symget('username');
/* Open data set for update. */
/* map SCL vars to data set */
/* data vector (DDV) */
journal=open(symget('journal'),'u');
call set(journal);
/* create OLD_RECS and CHANGES data sets */
/* by using MASTER data set as the model. */
/* Open both temporary data sets for update. */
call new('old_recs',symget('master'),1,'n');
dsid_old=open('old_recs','u');
call set(dsid_old);
call new('changes','old_recs',1,'n');
dsid_chg=open('changes','u');
call set(dsid_chg);
/*_nvar= # of vars in data set */
_nvar = attrn(dsid_old,'nvars');
/* read first records */
rc=fetchobs(dsid_old,1);
rc=fetchobs(dsid_chg,1);
/* initialize vars for putvar */
num_chng = varnum(journal,'varchng');
num_oldc = varnum(journal,'oldvaluc');
num_oldn = varnum(journal,'oldvalun');
num_newc = varnum(journal,'newvaluc');
num_newn = varnum(journal,'newvalun');
num_key1 = varnum(journal,'key1');
num_code = varnum(journal,'code');
numokey1 = varnum(dsid_old,symget("key1"));
return;
/**********************************************************************/
JRN_INIT:
/* update OLD_RECS to null record */
if lastcode='DU' then do;
rc=delobs(dsid_old);
rc=append(dsid_old,'noset');
lastcode='AD';
end;
/* update w/ current values from MASTER. */
else rc=update(dsid_old);
return;
/**********************************************************************/
JRN_MAIN:
/* return command in uppercase */
command=word(1,'u');
/* look at first 3 chars */
command=substr(command,1,3);
if lastcode='AD' then addflag=1;
lastcode=' ';
select(command);
/* user deleted record */
when('DEL')
code='D ';
/* update the JOURNAL data set */
link WRITEJRN;
when('CAN')
code=' ';
when('ADD')
code='C ';
lastcode='AD';
when('DUP')
code='C ';
lastcode='DU';
otherwise
code='C ';
end; /* select clause */
return;
/**********************************************************************/
JRN_TERM:
/* check flag and set code for adds */
if addflag then code='AD';
addflag=0;
WRITEJRN:
/* Create the JOURNAL observation if necessary */
datetime=datetime();
/* update with current screen values */
rc=update(dsid_chg);
do _i=1 to _nvar;
if vartype(dsid_old,_i)='N' then do;
_num1=getvarn(dsid_old,_i);
_num2=getvarn(dsid_chg,_i);
/* let code reflect numeric change */
substr(code,2,1)='N';
end;
else do;
_char1=getvarc(dsid_old,_i);
_char2=getvarc(dsid_chg,_i);
/* let code reflect character change */
substr(code,2,1)='C';
end;
if (_char1 ¬= _char2) or (_num1 ¬= _num2) then do;
rc=append(journal);
call putvarc(journal,num_chng,varname(dsid_old,_i));
if _char1 ¬= _char2 then do;
/* save old value */
call putvarc(journal,num_oldc,_char1);
/* save new value */
call putvarc(journal,num_newc,_char2);
_char1=' '; _char2=' ';
end;
else do;
/* save old value */
call putvarn(journal,num_oldn,_num1);
/* save new value */
call putvarn(journal,num_newn,_num2);
_num1=.; _num2=.;
end;
/* add other variables that are not in */
/* changes data set if new observation */
if substr(code,1,1) = 'A' then
/* get key from changes */
key1=getvarc(dsid_chg,numokey1);
/* else key from old_recs */
else key1=getvarc(dsid_old,numokey1);
call putvarc(journal,num_key1,key1);
call putvarc(journal,num_code,code);
rc=update(journal);
end;
end;
return;
/**********************************************************************/
JRNFTERM:
/* close data sets, FSEDIT terminates */
rc=close(journal);
rc=close(dsid_old);
rc=close(dsid_chg);
/* delete temporary work data sets */
rc=delete('old_recs');
rc=delete('changes');
return;
/**********************************************************************/
FSEINIT:
call symput('journal','save.journal');
call symput('master','save.inventory');
link JRNFINIT;
/* any other application specific code */
return;
INIT: link JRN_INIT;
/* any other application specific code */
return;
MAIN: link JRN_MAIN;
/* any other application specific code */
return;
TERM: link JRN_TERM;
/* any other application specific code */
return;
FSETERM: link JRNFTERM;
/* any other application specific code */
return;
%JOURNAL;
/**********************************************************************/