80 ,append_dsn=APPENDTABLE
81 ,retained_key=DEFAULT_RK
82 ,business_key= PK1 PK2
89%put &sysmacroname entry vars:;
92%local base_libds app_libds key_field check maxkey idx_pk newkey_cnt iserr
93 msg x tempds1 tempds2 comma_pk appnobs checknobs dropvar tempvar idx_val;
94%let base_libds=%upcase(&base_lib..&base_dsn);
95%let app_libds=%upcase(&append_lib..&append_dsn);
96%let tempds1=%mf_getuniquename();
97%let tempds2=%mf_getuniquename();
98%let comma_pk=%mf_getquotedstr(in_str=%str(&business_key),dlm=%str(,),quote=);
99%let outds=%sysfunc(ifc(%index(&outds,.)=0,work.&outds,&outds));
102%
if &syscc>0 %then %
do;
104 %let msg=%str(SYSCC=&syscc on macro entry);
106%
else %
if %sysfunc(exist(&base_libds))=0 %then %
do;
108 %let msg=%str(Base LIBDS (&base_libds) expected but NOT FOUND);
110%
else %
if %sysfunc(exist(&app_libds))=0 %then %
do;
112 %let msg=%str(Append LIBDS (&app_libds) expected but NOT FOUND);
114%
else %
if &maxkeytable ne 0 and %sysfunc(exist(&maxkeytable))=0 %then %
do;
116 %let msg=%str(Maxkeytable (&maxkeytable) expected but NOT FOUND);
118%
else %
if &maxkeytable ne 0 and %sysfunc(exist(&locktable))=0 %then %
do;
120 %let msg=%str(Locktable (&locktable) expected but NOT FOUND);
122%
else %
if %length(&business_key)=0 %then %
do;
124 %let msg=%str(Business key (&business_key) expected but NOT FOUND);
127%
do x=1 %to %sysfunc(countw(&business_key));
129 %let key_field=%scan(&business_key,&x,%str( ));
130 %
if not %mf_existvar(&app_libds,&key_field) %then %
do;
132 %let msg=Business key (&key_field) not found on &app_libds!;
135 %
else %
if not %mf_existvar(&base_libds,&key_field) %then %
do;
137 %let msg=Business key (&key_field) not found on &base_libds!;
142%
if &iserr=1 %then %
do;
145 UNLOCK,lib=&base_lib,ds=&base_dsn,ref=%superq(msg),ctl_ds=&locktable
148%mp_abort(iftrue=(&iserr=1),mac=mp_retainedkey,msg=%superq(msg))
151select sum(max(&retained_key),0) format=32. into: maxkey trimmed
158create table &tempds1 as
159 select distinct &comma_pk,&retained_key
160 from &base_libds &filter_str
161 order by &comma_pk,&retained_key;
163%if &check_uniqueness=YES %then %do;
164 select count(*) into:checknobs
165 from (select distinct &comma_pk from &app_libds);
166 select count(*) into: appnobs from &app_libds;
167 %if &checknobs ne &appnobs %then %do;
168 %let msg=Source table &app_libds is not unique on (&business_key);
172%if &iserr=1 %then %do;
175 UNLOCK,lib=&base_lib,ds=&base_dsn,ref=%superq(msg),ctl_ds=&locktable
178%mp_abort(iftrue= (&iserr=1),mac=mp_retainedkey,msg=%superq(msg))
180%if %mf_existvar(&app_libds,&retained_key)
181%then %let dropvar=(drop=&retained_key);
185create table &tempds2 as
186 select b.&retained_key, a.*
187 from &app_libds &dropvar a
190 %do idx_pk=1 %to %sysfunc(countw(&business_key));
191 %let idx_val=%scan(&business_key,&idx_pk);
192 and a.&idx_val=b.&idx_val
194 order by &retained_key;
197select count(*) into: newkey_cnt
199 where missing(&retained_key);
205%if &maxkeytable ne 0 %then %do;
207 select count(*) into: check from &maxkeytable
208 where upcase(keytable)="&base_libds";
210 %mp_lockanytable(LOCK
211 ,lib=%scan(&maxkeytable,1,.)
212 ,ds=%scan(&maxkeytable,2,.)
213 ,ref=Updating maxkeyvalues with mp_retainedkey
217 %if &check=0 %then %do;
218 insert into &maxkeytable
219 set keytable="&base_libds"
220 ,keycolumn="&retained_key"
221 ,max_key=%sysevalf(&maxkey+&newkey_cnt)
222 ,processed_dttm="%sysfunc(datetime(),%mf_fmtdttm())"dt;
226 set max_key=%sysevalf(&maxkey+&newkey_cnt)
227 ,processed_dttm="%sysfunc(datetime(),%mf_fmtdttm())"dt
228 where keytable="&base_libds";
230 %mp_lockanytable(UNLOCK
231 ,lib=%scan(&maxkeytable,1,.)
232 ,ds=%scan(&maxkeytable,2,.)
233 ,ref=Updating maxkeyvalues with maxkey=%sysevalf(&maxkey+&newkey_cnt)
239%let tempvar=%mf_getuniquename();
240data &outds(drop=&tempvar);
241 retain &tempvar %sysevalf(&maxkey+1);
243 if &retained_key =. then &retained_key=&tempvar;