Macros for SAS Application Developers
https://github.com/sasjs/core
Loading...
Searching...
No Matches
mp_loadformat.test.2.sas
Go to the documentation of this file.
1/**
2 @file
3 @brief Testing mp_loadformat.sas macro for multilabel formats
4 @details Multilabel records can be complete duplicates!! Also, the order is
5 important.
6
7 The provided formats create a table as follows:
8
9
10|TYPE:$1.|FMTNAME:$32.|START:$10000.|END:$10000.|LABEL:$32767.|MIN:best.|MAX:best.|DEFAULT:best.|LENGTH:best.|FUZZ:best.|PREFIX:$2.|MULT:best.|FILL:$1.|NOEDIT:best.|SEXCL:$1.|EEXCL:$1.|HLO:$13.|DECSEP:$1.|DIG3SEP:$1.|DATATYPE:$8.|LANGUAGE:$8.|
11|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
12|`C `|`GENDERML `|` `|` `|`Total people `|`1 `|`40 `|`12 `|`12 `|`0 `|` `|`0 `|` `|`0 `|`N `|`N `|`M `|` `|` `|` `|` `|
13|`C `|`GENDERML `|`1 `|`1 `|`Male `|`1 `|`40 `|`12 `|`12 `|`0 `|` `|`0 `|` `|`0 `|`N `|`N `|`M `|` `|` `|` `|` `|
14|`C `|`GENDERML `|`1 `|`1 `|`Total people `|`1 `|`40 `|`12 `|`12 `|`0 `|` `|`0 `|` `|`0 `|`N `|`N `|`M `|` `|` `|` `|` `|
15|`C `|`GENDERML `|`2 `|`2 `|`Female `|`1 `|`40 `|`12 `|`12 `|`0 `|` `|`0 `|` `|`0 `|`N `|`N `|`M `|` `|` `|` `|` `|
16|`C `|`GENDERML `|`2 `|`2 `|`Female `|`1 `|`40 `|`12 `|`12 `|`0 `|` `|`0 `|` `|`0 `|`N `|`N `|`M `|` `|` `|` `|` `|
17|`C `|`GENDERML `|`2 `|`2 `|`Thormale `|`1 `|`40 `|`12 `|`12 `|`0 `|` `|`0 `|` `|`0 `|`N `|`N `|`M `|` `|` `|` `|` `|
18|`C `|`GENDERML `|`2 `|`2 `|`Total people `|`1 `|`40 `|`12 `|`12 `|`0 `|` `|`0 `|` `|`0 `|`N `|`N `|`M `|` `|` `|` `|` `|
19|`N `|`AGEMLA `|`1 `|`4 `|`Preschool `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
20|`N `|`AGEMLA `|`1 `|`18 `|`Children `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
21|`N `|`AGEMLA `|`19 `|`120 `|`Adults `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
22|`N `|`AGEMLB `|`1 `|`4 `|`Preschool `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
23|`N `|`AGEMLB `|`1 `|`18 `|`Children `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
24|`N `|`AGEMLB `|`19 `|`120 `|`Adults `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
25|`N `|`AGEMLC `|`1 `|`18 `|`Children `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
26|`N `|`AGEMLC `|`1 `|`4 `|`Preschool `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
27|`N `|`AGEMLC `|`19 `|`120 `|`Adults `|`1 `|`40 `|`9 `|`9 `|`1E-12 `|` `|`0 `|` `|`0 `|`N `|`N `|`SM `|` `|` `|` `|` `|
28
29
30 <h4> SAS Macros </h4>
31 @li mf_nobs.sas
32 @li mp_cntlout.sas
33 @li mp_loadformat.sas
34 @li mp_assert.sas
35 @li mp_assertdsobs.sas
36 @li mp_getformats.sas
37 @li mp_ds2md.sas
38
39
40 @sasjslint {"maxLineLength": 243}
41**/
42
43/* prep format catalog */
44libname perm (work);
45
46/* create some multilabel formats */
47%let cat1=perm.test1;
48proc format library=&cat1;
49 value $genderml (multilabel notsorted)
50 '1'='Male'
51 '2'='Female'
52 '2'='Female'
53 '2'='Farmale'
54 '1','2',' '='Total people';
55 value agemla (multilabel)
56 1-4='Preschool'
57 1-18='Children'
58 19-120='Adults';
59 value agemlb (multilabel)
60 19-120='Adults'
61 1-18='Children'
62 0-1='Preschool'
63 1-2='Preschool'
64 2-3='Preschool'
65 1-4='Preschool';
66 value agemlc (multilabel notsorted)
67 19-120='Adults'
68 1-18='Children'
69 1-4='Preschool';
70run;
71
72%mp_cntlout(libcat=&cat1,cntlout=work.cntlout1)
73%mp_assertdsobs(work.cntlout1,
74 desc=Has 19 records,
75 test=EQUALS 19
76)
77
78data work.stagedata3;
79 set work.cntlout1;
80 if fmtname='AGEMLA' and label ne 'Preschool' then deleteme='Yes';
81 if fmtname='AGEMLB' and label = 'Preschool' then label='Kids';
82 if fmtname='GENDERML' and label='Farmale' then do;
83 output;
84 fmtrow=101; output;
85 end;
86 else output;
87run;
88
89
90%mp_loadformat(&cat1
91 ,work.stagedata3
92 ,loadtarget=YES
93 ,auditlibds=perm.audit
94 ,locklibds=0
95 ,delete_col=deleteme
96 ,outds_add=add_test1
97 ,outds_del=del_test1
98 ,outds_mod=mod_test1
99 ,mdebug=1
100)
101
102%mp_assert(
103 iftrue=(%mf_nobs(del_test1)=2),
104 desc=Test 1 - deleted obs,
105 outds=work.test_results
106)
107%mp_assert(
108 iftrue=(%mf_nobs(mod_test1)=4),
109 desc=Test 1 - mod obs,
110 outds=work.test_results
111)
112%mp_assert(
113 iftrue=(%mf_nobs(add_test1)=1),
114 desc=Test 1 - add obs,
115 outds=work.test_results
116)
117
118/* now check the order of the notsorted format */
119%mp_cntlout(libcat=&cat1,cntlout=work.cntlout2)
120
121%let check1=0;
122%let check2=0;
123%let check3=0;
124data test;
125 set work.cntlout2;
126 where fmtname='GENDERML';
127 putlog fmtrow= label=;
128 if _n_=4 and label='Farmale' then call symputx('check1',1);
129 if _n_=5 and label ne 'Farmale' then call symputx('check2',1);
130 if _n_=8 and label = 'Farmale' then call symputx('check3',1);
131run;
132%mp_assert(
133 iftrue=(&check1=1 and &check2=1 and &check3=1),
134 desc=Ensuring Farmale values retain their order,
135 outds=work.test_results
136)
137
138/**
139 * completely delete a format and make sure it is removed
140 */
141
142/* first, make sure these three formats exist */
143options insert=(fmtsearch=(&cat1));
144%mp_getformats(fmtlist=AGEMLA AGEMLB AGEMLC $GENDERML,outsummary=work.fmtdels)
145
146%let fmtlist=NONE;
147proc sql;
148select distinct cats(fmtname) into: fmtlist separated by ' ' from work.fmtdels;
149
150%mp_assert(
151 iftrue=(%mf_nobs(fmtdels)=4),
152 desc=Deletion test 1 - ensure formats exist for deletion (&fmtlist found),
153 outds=work.test_results
154)
155
156/* deltest1 - deleting every record */
157%mp_cntlout(libcat=&cat1,cntlout=work.cntloutdel1)
158data work.stagedatadel1;
159 set work.cntloutdel1;
160 if fmtname='AGEMLA';
161 deleteme='Yes';
162run;
163%mp_loadformat(&cat1
164 ,work.stagedatadel1
165 ,loadtarget=YES
166 ,auditlibds=perm.audit
167 ,locklibds=0
168 ,delete_col=deleteme
169 ,outds_add=add_testdel1
170 ,outds_del=del_testdel1
171 ,outds_mod=mod_testdel1
172 ,mdebug=1
173)
174%mp_getformats(fmtlist=AGEMLA,outsummary=work.fmtdel1)
175%mp_assert(
176 iftrue=(%mf_nobs(fmtdel1)=0),
177 desc=Deletion test 1 - ensure AGEMLA format was fully deleted,
178 outds=work.test_results
179)
180
181/* deltest2 - deleting every record except 1 */
182data work.stagedatadel2;
183 set work.cntloutdel1;
184 if fmtname='AGEMLB';
185 x+1;
186 if x>1 then deleteme='Yes';
187run;
188%mp_loadformat(&cat1
189 ,work.stagedatadel2
190 ,loadtarget=YES
191 ,auditlibds=perm.audit
192 ,locklibds=0
193 ,delete_col=deleteme
194 ,outds_add=add_testdel2
195 ,outds_del=del_testdel2
196 ,outds_mod=mod_testdel2
197 ,mdebug=1
198)
199%mp_getformats(fmtlist=AGEMLB,outsummary=work.fmtdel2)
200%mp_assert(
201 iftrue=(%mf_nobs(fmtdel2)=1),
202 desc=Deletion test 2 - ensure AGEMLB format was not fully deleted,
203 outds=work.test_results
204)
205
206
207/* deltest3 - deleting every record, and adding a new one */
208data work.stagedatadel3;
209 set work.cntloutdel1;
210 if fmtname='GENDERML';
211 deleteme='Yes';
212run;
213data work.stagedatadel3;
214 set work.stagedatadel3 end=last;
215 output;
216 if last then do;
217 deleteme='No';
218 /* must be a new fmtrow (key value) if adding new row in same load! */
219 fmtrow=1000;
220 start='Mail';
221 end='Mail';
222 output;
223 end;
224run;
225
226%mp_loadformat(&cat1
227 ,work.stagedatadel3
228 ,loadtarget=YES
229 ,auditlibds=perm.audit
230 ,locklibds=0
231 ,delete_col=deleteme
232 ,outds_add=add_testdel2
233 ,outds_del=del_testdel2
234 ,outds_mod=mod_testdel2
235 ,mdebug=1
236)
237%mp_getformats(fmtlist=$GENDERML,outsummary=work.fmtdel3)
238%mp_assert(
239 iftrue=(%mf_nobs(fmtdel3)=1),
240 desc=Deletion test 3 - ensure GENDERML format was not fully deleted,
241 outds=work.test_results
242)
243
244%mp_ds2md(work.fmtdel3)