79 ,append_dsn=APPENDTABLE
80 ,retained_key=DEFAULT_RK
81 ,business_key= PK1 PK2
88%put &sysmacroname entry vars:;
91%local base_libds app_libds key_field check maxkey idx_pk newkey_cnt iserr
92 msg x tempds1 tempds2 comma_pk appnobs checknobs dropvar tempvar idx_val;
93%let base_libds=%upcase(&base_lib..&base_dsn);
94%let app_libds=%upcase(&append_lib..&append_dsn);
95%let tempds1=%mf_getuniquename();
96%let tempds2=%mf_getuniquename();
97%let comma_pk=%mf_getquotedstr(in_str=%str(&business_key),dlm=%str(,),quote=);
98%let outds=%sysfunc(ifc(%index(&outds,.)=0,work.&outds,&outds));
101%
if &syscc>0 %then %
do;
103 %let msg=%str(SYSCC=&syscc on macro entry);
105%
else %
if %sysfunc(exist(&base_libds))=0 %then %
do;
107 %let msg=%str(Base LIBDS (&base_libds) expected but NOT FOUND);
109%
else %
if %sysfunc(exist(&app_libds))=0 %then %
do;
111 %let msg=%str(Append LIBDS (&app_libds) expected but NOT FOUND);
113%
else %
if &maxkeytable ne 0 and %sysfunc(exist(&maxkeytable))=0 %then %
do;
115 %let msg=%str(Maxkeytable (&maxkeytable) expected but NOT FOUND);
117%
else %
if &maxkeytable ne 0 and %sysfunc(exist(&locktable))=0 %then %
do;
119 %let msg=%str(Locktable (&locktable) expected but NOT FOUND);
121%
else %
if %length(&business_key)=0 %then %
do;
123 %let msg=%str(Business key (&business_key) expected but NOT FOUND);
126%
do x=1 %to %sysfunc(countw(&business_key));
128 %let key_field=%scan(&business_key,&x,%str( ));
129 %
if not %mf_existvar(&app_libds,&key_field) %then %
do;
131 %let msg=Business key (&key_field) not found on &app_libds!;
134 %
else %
if not %mf_existvar(&base_libds,&key_field) %then %
do;
136 %let msg=Business key (&key_field) not found on &base_libds!;
141%
if &iserr=1 %then %
do;
144 UNLOCK,lib=&base_lib,ds=&base_dsn,ref=%superq(msg),ctl_ds=&locktable
147%mp_abort(iftrue=(&iserr=1),mac=mp_retainedkey,msg=%superq(msg))
150select sum(max(&retained_key),0) format=32. into: maxkey trimmed
157create table &tempds1 as
158 select distinct &comma_pk,&retained_key
159 from &base_libds &filter_str
160 order by &comma_pk,&retained_key;
162%if &check_uniqueness=YES %then %do;
163 select count(*) into:checknobs
164 from (select distinct &comma_pk from &app_libds);
165 select count(*) into: appnobs from &app_libds;
166 %if &checknobs ne &appnobs %then %do;
167 %let msg=Source table &app_libds is not unique on (&business_key);
171%if &iserr=1 %then %do;
174 UNLOCK,lib=&base_lib,ds=&base_dsn,ref=%superq(msg),ctl_ds=&locktable
177%mp_abort(iftrue= (&iserr=1),mac=mp_retainedkey,msg=%superq(msg))
179%if %mf_existvar(&app_libds,&retained_key)
180%then %let dropvar=(drop=&retained_key);
184create table &tempds2 as
185 select b.&retained_key, a.*
186 from &app_libds &dropvar a
189 %do idx_pk=1 %to %sysfunc(countw(&business_key));
190 %let idx_val=%scan(&business_key,&idx_pk);
191 and a.&idx_val=b.&idx_val
193 order by &retained_key;
196select count(*) into: newkey_cnt
198 where missing(&retained_key);
204%if &maxkeytable ne 0 %then %do;
206 select count(*) into: check from &maxkeytable
207 where upcase(keytable)="&base_libds";
209 %mp_lockanytable(LOCK
210 ,lib=%scan(&maxkeytable,1,.)
211 ,ds=%scan(&maxkeytable,2,.)
212 ,ref=Updating maxkeyvalues with mp_retainedkey
216 %if &check=0 %then %do;
217 insert into &maxkeytable
218 set keytable="&base_libds"
219 ,keycolumn="&retained_key"
220 ,max_key=%sysevalf(&maxkey+&newkey_cnt)
221 ,processed_dttm="%sysfunc(datetime(),%mf_fmtdttm())"dt;
225 set max_key=%sysevalf(&maxkey+&newkey_cnt)
226 ,processed_dttm="%sysfunc(datetime(),%mf_fmtdttm())"dt
227 where keytable="&base_libds";
229 %mp_lockanytable(UNLOCK
230 ,lib=%scan(&maxkeytable,1,.)
231 ,ds=%scan(&maxkeytable,2,.)
232 ,ref=Updating maxkeyvalues with maxkey=%sysevalf(&maxkey+&newkey_cnt)
238%let tempvar=%mf_getuniquename();
239data &outds(drop=&tempvar);
240 retain &tempvar %sysevalf(&maxkey+1);
242 if &retained_key =. then &retained_key=&tempvar;