Macros for SAS Application Developers
https://github.com/sasjs/core
Loading...
Searching...
No Matches
mp_stripdiffs.test.2.sas
Go to the documentation of this file.
1/**
2 @file
3 @brief Testing mp_stripdiffs.sas macro with special missing values
4
5 <h4> SAS Macros </h4>
6 @li mp_assert.sas
7 @li mp_assertscope.sas
8 @li mp_storediffs.sas
9 @li mp_stripdiffs.sas
10
11**/
12
13/* Both the key and the changed cells hold special missings - reverting them
14 means writing ._ / .A / .Z back into a PROC SQL statement */
15libname libby (work);
16data libby.spm;
17 pknum=._; grp='a'; score=._; output;
18 pknum=.A; grp='b'; score=7; output;
19 pknum=.Z; grp='c'; score=.B; output;
20 pknum=1; grp='d'; score=.; output;
21run;
22
23/* the original snapshot, and the change sets to be applied to the base */
24data work.orig work.deleted work.changed;
25 set libby.spm;
26 output work.orig;
27 if pknum=._ then output work.deleted;
28 else if pknum=.A then do;
29 score=42;
30 output work.changed;
31 end;
32 else if pknum=.Z then do;
33 score=99;
34 output work.changed;
35 end;
36run;
37data work.appended;
38 pknum=.C; grp='e'; score=1; output;
39 pknum=8; grp='f'; score=.Q; output;
40run;
41
42/* first, store the diffs */
43%mp_storediffs(libby.spm,work.orig,PKNUM GRP
44 ,delds=work.deleted
45 ,modds=work.changed
46 ,appds=work.appended
47 ,outds=work.audit
48 ,loadref=SPM1
49 ,mdebug=0
50)
51%mp_assert(
52 iftrue=(&syscc=0),
53 desc=Checking diffs were stored for special missing values,
54 outds=work.test_results
55)
56
57/* now apply those changes to the base table */
58proc sql;
59delete from libby.spm where pknum=._;
60delete from libby.spm where pknum=.A;
61delete from libby.spm where pknum=.Z;
62quit;
63proc append base=libby.spm data=work.changed;
64run;
65proc append base=libby.spm data=work.appended;
66run;
67
68/* prepare the revert dataset */
69%mp_assertscope(SNAPSHOT)
70%mp_stripdiffs(libby.spm
71 ,SPM1
72 ,work.audit
73 ,outds=work.sd_stage
74 ,mdebug=1
75)
76%mp_assertscope(COMPARE)
77%mp_assert(
78 iftrue=(&syscc=0),
79 desc=Checking no failure when reverting special missing values,
80 outds=work.test_results
81)
82
83/* the reverted stage should be the original four rows, with the two appended
84 rows marked for deletion */
85data work.sd_expected;
86 pknum=._; grp='a'; score=._; delflag='No'; output;
87 pknum=.A; grp='b'; score=7; delflag='No'; output;
88 pknum=.Z; grp='c'; score=.B; delflag='No'; output;
89 pknum=1; grp='d'; score=.; delflag='No'; output;
90 pknum=.C; grp='e'; score=1; delflag='Yes'; output;
91 pknum=8; grp='f'; score=.Q; delflag='Yes'; output;
92run;
93data work.sd_actual;
94 set work.sd_stage(rename=(_____DELETE__THIS__RECORD_____=delflag));
95 length delflag $3;
96run;
97
98proc compare base=work.sd_expected compare=work.sd_actual;
99run;
100data _null_;
101 /* data-relevant bits only: 64 missing obs, 128 extra obs, 4096 unequal
102 values, 32768 different number of observations */
103 call symputx('cmpfail',band(&sysinfo,64+128+4096+32768),'l');
104run;
105%mp_assert(
106 iftrue=(&cmpfail=0),
107 desc=Checking restored values match the original for special missings,
108 outds=work.test_results
109)