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( ))
181 file &fref1 lrecl=33000;
182 length charval $32767;
183 if _n_=1 then put 'proc sql noprint;';
184 by descending processed_dttm key_hash is_pk;
185 if move_type=
'M' then do;
186 if first.key_hash then do;
187 put
"update &outds set " @@;
190 put
" " tgtvar_nm
'=' @@;
191 cnt=count(oldval_char,
'"');
192 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
193 if tgtvar_type=
'C' then put charval @@;
194 else if missing(oldval_num) and oldval_num ne .
195 then put
"." oldval_num @@;
196 else put oldval_num @@;
197 if not last.is_pk then put
',';
200 if first.is_pk then put
" where 1=1 " @@;
201 put
" and " tgtvar_nm
'=' @@;
202 cnt=count(oldval_char,
'"');
203 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
204 if tgtvar_type=
'C' then put charval @@;
205 else if missing(oldval_num) and oldval_num ne .
206 then put
"." oldval_num @@;
207 else put oldval_num @@;
210 else if move_type=
'A' then do;
211 if first.key_hash then do;
212 put
"update &outds set _____DELETE__THIS__RECORD_____='Yes' where 1=1 "@@;
216 put ' AND ' tgtvar_nm
'=' @@;
217 cnt=count(newval_char,
'"');
218 charval=quote(trim(substr(newval_char,1,32765-cnt)));
219 if tgtvar_type=
'C' then put charval @@;
220 else if missing(newval_num) and newval_num ne .
221 then put
"." newval_num @@;
222 else put newval_num @@;
224 else if move_type=
'D' then do;
225 if first.key_hash then do;
226 put
"update &outds set _____DELETE__THIS__RECORD_____='No' " @@;
229 put
" ," tgtvar_nm
'=' @@;
230 cnt=count(oldval_char,
'"');
231 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
232 if tgtvar_type=
'C' then put charval @@;
233 else if missing(oldval_num) and oldval_num ne .
234 then put
"." oldval_num @@;
235 else put oldval_num @@;
238 if first.is_pk then put
" where 1=1 " @@;
239 put
" and " tgtvar_nm
'=' @@;
240 cnt=count(oldval_char,
'"');
241 charval=quote(trim(substr(oldval_char,1,32765-cnt)));
242 if tgtvar_type=
'C' then put charval @@;
243 else if missing(oldval_num) and oldval_num ne .
244 then put
"." oldval_num @@;
245 else put oldval_num @@;
248 if last.key_hash then put
';';
252%inc &fref1/source2 lrecl=33000;
254%if &mdebug=0 %then %do;
256 drop table &ds1, &ds2, &ds3, &ds4, &ds5;
263 if _n_=1 then putlog
"Contents of SQL adjustments";