52%macro mp_stripdiffs(libds
56 ,outds=work.mp_stripdiffs
60%
if &mdebug=1 %then %
do;
61 %put &sysmacroname entry vars:;
66%let libds=%upcase(&libds);
69%mp_abort(iftrue= (&syscc ne 0)
71 ,msg=%str(SYSCC=&syscc on entry. Clean session required!)
73%let libds=%upcase(&libds);
74%mp_abort(iftrue= (%mf_islibds(&libds)=0)
76 ,msg=%str(Invalid library.dataset reference - %superq(libds))
80%local ds1 ds2 ds3 ds4 ds5 fref1 filterstr;
81%let fref1=%mf_getuniquefileref();
82%
if &filtervar ne 0 %then %let filterstr=%superq(&filtervar);
83%
else %let filterstr=%str(1=1);
88select put(processed_dttm,datetime19.6) into: ts
89 from &difftable where load_ref="&loadref";
90%mp_abort(iftrue= (&sqlobs=0)
92 ,msg=%str(Load ref %superq(loadref) not found!)
96%let ds1=%upcase(work.%mf_getuniquename(prefix=mpsd_diffs));
97create table &ds1 (drop=libref dsn) as
98 select * from &difftable
99 where upcase(cats(libref))="%scan(&libds,1,.)"
100 and upcase(cats(dsn))="%scan(&libds,2,.)"
101 and processed_dttm ge "&ts"dt
102 order by processed_dttm desc, key_hash, is_pk;
105%let ds2=%upcase(work.%mf_getuniquename(prefix=mpsd_pks));
106%local keyhash processed;
107%let keyhash=%upcase(%mf_getuniquename(prefix=mpsdvar_keyhash));
108%let processed=%upcase(%mf_getuniquename(prefix=mpsdvar_processed));
110 select key_hash as &keyhash,
113 coalescec(oldval_char,newval_char) as charval,
114 coalesce(oldval_num, newval_num) as numval,
115 processed_dttm as &processed
118 order by &keyhash, &processed;
122select distinct upcase(tgtvar_nm) into: pk separated by ' ' from &ds2;
124%let ds3=%upcase(work.%mf_getuniquename(prefix=mpsd_keychar));
125proc transpose data=&ds2(where=(tgtvar_type='C'))
126 out=&ds3(drop=_name_);
127 by &keyhash &processed;
132%let ds4=%upcase(work.%mf_getuniquename(prefix=mpsd_keynum));
133proc transpose data=&ds2(where=(tgtvar_type='N'))
134 out=&ds4(drop=_name_);
135 by &keyhash &processed;
140%mp_ds2squeeze(&ds3,outds=&ds3)
141%mp_ds2squeeze(&ds4,outds=&ds4)
144%let ds5=%upcase(work.%mf_getuniquename(prefix=mpsd_merged));
146 length &keyhash $32 &processed 8;
148 by &keyhash &processed;
149 if not missing(&keyhash);
151proc sort data=&ds5 nodupkey;
157create table &outds as select "No " as _____DELETE__THIS__RECORD_____
158 %do x=1 %to %sysfunc(countw(&pk,%str( )));
159 ,a.%scan(&pk,&x,%str( ))
162 %let notpkcols=%upcase(%mf_getvarlist(&libds));
163 %let notpkcols=%mf_wordsinstr1butnotstr2(str1=¬pkcols,str2=&pk);
164 %do x=1 %to %sysfunc(countw(¬pkcols,%str( )));
165 ,b.%scan(¬pkcols,&x,%str( ))
168 left join &libds (where=(&filterstr)) b
170%do x=1 %to %sysfunc(countw(&pk,%str( )));
171 and a.%scan(&pk,&x,%str( ))=b.%scan(&pk,&x,%str( ))
178 file &fref1 lrecl=33000;
179 length charval $32767;
180 if _n_=1 then put 'proc sql noprint;';
181 by descending processed_dttm key_hash is_pk;
182 if move_type='M' then do;
183 if first.key_hash then do;
184 put "update &outds set " @@;
187 put " " tgtvar_nm '=' @@;
188 cnt=count(oldval_char,'"');
189 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
190 if tgtvar_type='C' then put charval @@;
191 else put oldval_num @@;
192 if not last.is_pk then put ',';
195 if first.is_pk then put " where 1=1 " @@;
196 put " and " tgtvar_nm '=' @@;
197 cnt=count(oldval_char,'"');
198 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
199 if tgtvar_type='C' then put charval @@;
200 else put oldval_num @@;
203 else if move_type='A' then do;
204 if first.key_hash then do;
205 put "update &outds set _____DELETE__THIS__RECORD_____='Yes' where 1=1 "@@;
209 put ' AND ' tgtvar_nm '=' @@;
210 cnt=count(newval_char,'"');
211 charval=quote(trim(substr(newval_char,1,32765-cnt)));
212 if tgtvar_type='C' then put charval @@;
213 else put newval_num @@;
215 else if move_type='D' then do;
216 if first.key_hash then do;
217 put "update &outds set _____DELETE__THIS__RECORD_____='No' " @@;
220 put " ," tgtvar_nm '=' @@;
221 cnt=count(oldval_char,'"');
222 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
223 if tgtvar_type='C' then put charval @@;
224 else put oldval_num @@;
227 if first.is_pk then put " where 1=1 " @@;
228 put " and " tgtvar_nm '=' @@;
229 cnt=count(oldval_char,'"');
230 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
231 if tgtvar_type='C' then put charval @@;
232 else put oldval_num @@;
235 if last.key_hash then put ';';
239%inc &fref1/source2 lrecl=33000;
241%if &mdebug=0 %then %do;
243 drop table &ds1, &ds2, &ds3, &ds4, &ds5;
250 if _n_=1 then putlog "Contents of SQL adjustments";