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) into: maxkey from &base_libds;
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=%eval(&maxkey+&newkey_cnt)
221 ,processed_dttm="%sysfunc(datetime(),%mf_fmtdttm())"dt;
225 set max_key=%eval(&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=%eval(&maxkey+&newkey_cnt)
238%let tempvar=%mf_getuniquename();
239data &outds(drop=&tempvar);
240 retain &tempvar %eval(&maxkey+1);
242 if &retained_key =. then &retained_key=&tempvar;