Loading...
Searching...
No Matches
demodata.sas
Go to the documentation of this file.
1/**
2 @file
3 @brief Creates demo tables and associated config
4 @details Can be removed in prod installs.
5
6 To activate this job, add the following to SETTINGS:
7
8 %let demolib=PUBLIC;
9 libname &demolib "%sysfunc(pathname(&dc_libref))/&demolib";
10 %let joblib=HOOKLIB;
11 libname &joblib "%sysfunc(pathname(&dc_libref))/&joblib";
12 %let dcdemoflag=1;
13
14 Note that this will:
15 * REPLACE any tables named CARS_EXT or COUNTRIES in the PUBLIC library
16 * REPLACE all DC config for libraries named PUBLIC
17 * CREATE a folder called "demo" in the DC Apploc
18 * CREATE two BASE libraries (HOOKLIB & PUBLIC) in the DC (physical) folder
19
20 <h4> SAS Macros </h4>
21 @li mpeinit.sas
22 @li mf_getengine.sas
23 @li mf_getuser.sas
24 @li mf_increment.sas
25 @li mf_nobs.sas
26 @li mf_uid.sas
27 @li mp_abort.sas
28 @li mp_binarycopy.sas
29 @li mp_replace.sas
30 @li mx_createjob.sas
31
32 @author 4GL Apps Ltd
33 @copyright 4GL Apps Ltd. This code may only be used within Data Controller
34 and may not be re-distributed or re-sold without the express permission of
35 4GL Apps Ltd.
36
37**/
38
39%let dcdemoflag=0;
40options dlcreatedir;
41%global joblib demolib;
42%mpeinit()
43
44%mp_abort(iftrue= (&dcdemoflag ne 1)
45 ,mac=&_program
46 ,msg=%str(Job not configured. See comments in the code.)
47)
48
49data work.cars_ext(index=(carspk=(make model PRODUCTIONDATE) /unique));
50 attrib
51 MAKE length= $13
52 MODEL length= $40
53 TYPE length= $8
54 ORIGIN length= $6
55 COUNTRY length= $30
56 POTENTIALBUY length= $6
57 COMMENT length= $30
58 NOTES length= $30
59 CHECKBOXVAR length= $3
60 PRODUCTIONDATE length= 8 format=DATE9.
61 ;
62 set sashelp.cars;
63 retain comment 'n/a';
64 if mod(ceil(ranuni(1)*100),3)=0 then notes=catx(' ',make,type);
65 call missing(notes);
66 /* random / reproducible date between 1960 and 2020 */
67 PRODUCTIONDATE=ceil(ranuni(1)*365*60);
68 if mod(ceil(ranuni(1)*1000),2)=0 then CHECKBOXVAR='YES';
69 else CHECKBOXVAR='No';
70 if mod(ceil(ranuni(1)*1000),3)=0 then POTENTIALBUY='Maybe';
71 else if mod(ceil(ranuni(1)*1000),2)=0 then POTENTIALBUY='Yes';
72 else POTENTIALBUY='No';
73 make=cats(make);
74 model=cats(model);
75
76 array cntrs (4) $ 60 _temporary_ ( "Germany" "France" "Poland" "Italy");
77 if origin='USA' then country='USA';
78 else if origin='Asia' then do;
79 if mod(_n_,2)=0 then country='Japan';
80 else country='Korea';
81 end;
82 else COUNTRY = cntrs[ ceil(dim(cntrs) * ranuni(1))];
83
84 *put (_all_)(=);
85run;
86
87data work.COUNTRIES(index=(countriespk=(origin country) /unique));
88 attrib
89 ORIGIN length= $6
90 COUNTRY length= $30
91 ;
92 infile cards dsd;
93 input
94 ORIGIN :$char.
95 COUNTRY :$char.
96 ;
97datalines4;
98Europe,Germany
99Europe,France
100Europe,Poland
101Europe,Italy
102USA,USA
103Asia,Japan
104Asia,Korea
105;;;;
106run;
107
108data work.jobdata;
109 length message job $100;
110 call missing(of _all_);
111 stop;
112run;
113
114%let engine_type=%mf_getengine(&demolib);
115%put &=engine_type;
116%if &engine_type=CAS %then %do;
117 proc cas;
118 table.tableExists result=r / name="CARS_EXT" caslib="PUBLIC";
119 if r.exists then
120 table.dropTable / name="CARS_EXT" caslib="PUBLIC" quiet=TRUE;
121
122 table.tableExists result=r2 / name="COUNTRIES" caslib="PUBLIC";
123 if r2.exists then
124 table.dropTable / name="COUNTRIES" caslib="PUBLIC" quiet=TRUE;
125
126 table.tableExists result=r2 / name="MPE_AUDIT" caslib="PUBLIC";
127 if r2.exists then
128 table.dropTable / name="MPE_AUDIT" caslib="PUBLIC" quiet=TRUE;
129 quit;
130 proc casutil;
131 load data=work.CARS_EXT outcaslib="PUBLIC" casout="CARS_EXT" promote;
132 load data=work.COUNTRIES outcaslib="PUBLIC" casout="COUNTRIES" promote;
133 load data=&dc_libref..MPE_AUDIT
134 outcaslib="PUBLIC" casout="MPE_AUDIT" promote;
135 run;
136 data &joblib..JOBDATA; set work.JOBDATA;run;
137%end;
138%else %do;
139 options replace;
140 data &demolib..CARS_EXT; set work.cars_ext;
141 data &demolib..COUNTRIES; set work.countries;
142 data &joblib..JOBDATA; set work.JOBDATA;run;
143%end;
144
145%let apploc=%mf_getapploc(&_program);
146%let demolib=%upcase(&demolib);
147proc sql;
148delete from &dc_libref..mpe_tables
149 where libref="&demolib" and dsn in ('CARS_EXT','COUNTRIES');
150data append;
151 if 0 then set &dc_libref..mpe_tables;
152 TX_FROM=0;
153 TX_TO='31DEC9999:23:59:59'dt;
154 LIBREF="&demolib";
155 LOADTYPE='UPDATE';
156 NUM_OF_APPROVALS_REQUIRED=1;
157 PRE_EDIT_HOOK="&apploc/demo/PREEDIT";
158 POST_EDIT_HOOK="&apploc/demo/POSTEDIT";
159 PRE_APPROVE_HOOK="&apploc/demo/PREAPPROVE";
160 POST_APPROVE_HOOK="&apploc/demo/POSTAPPROVE";
161 DSN='CARS_EXT'; BUSKEY='MAKE MODEL PRODUCTIONDATE'; output;
162 DSN='COUNTRIES'; BUSKEY='ORIGIN COUNTRY'; output;
163run;
164proc append base=&dc_libref..MPE_TABLES data=&syslast;
165run;
166
167/* hard coded values for CHECKBOXVAR */
168%let rk=1e6;
169proc sql noprint;
170delete from &dc_libref..mpe_selectbox
171 where select_lib="&demolib"
172 and select_ds in ('CARS_EXT');
173select max(selectbox_rk) into: rk
174 from &dc_libref..mpe_selectbox;
175
176insert into &dc_libref..mpe_selectbox set
177 selectbox_rk=%mf_increment(rk)
178 ,ver_from_dttm=0
179 ,select_lib="&demolib"
180 ,select_ds="CARS_EXT"
181 ,base_column="CHECKBOXVAR"
182 ,selectbox_value='Yes'
183 ,selectbox_order=1
184 ,ver_to_dttm='31DEC5999:23:59:59'dt;
185insert into &dc_libref..mpe_selectbox set
186 selectbox_rk=%mf_increment(rk)
187 ,ver_from_dttm=0
188 ,select_lib="&demolib"
189 ,select_ds="CARS_EXT"
190 ,base_column="CHECKBOXVAR"
191 ,selectbox_value='No'
192 ,selectbox_order=2
193 ,ver_to_dttm='31DEC5999:23:59:59'dt;
194
195/* Table driven values */
196delete from &dc_libref..MPE_VALIDATIONS
197 where base_lib="&demolib" and base_ds="CARS_EXT";
198
199insert into &dc_libref..MPE_VALIDATIONS set
200 tx_from=0
201 ,base_lib="&demolib"
202 ,base_ds="CARS_EXT"
203 ,base_col="MAKE"
204 ,rule_type='HARDSELECT'
205 ,rule_value="SASHELP.CARS.MAKE"
206 ,rule_active=1
207 ,tx_to='31DEC5999:23:59:59'dt;
208insert into &dc_libref..MPE_VALIDATIONS set
209 tx_from=0
210 ,base_lib="&demolib"
211 ,base_ds="CARS_EXT"
212 ,base_col="MODEL"
213 ,rule_type='HARDSELECT'
214 ,rule_value="SASHELP.CARS.MODEL"
215 ,rule_active=1
216 ,tx_to='31DEC5999:23:59:59'dt;
217insert into &dc_libref..MPE_VALIDATIONS set
218 tx_from=0
219 ,base_lib="&demolib"
220 ,base_ds="CARS_EXT"
221 ,base_col="TYPE"
222 ,rule_type='SOFTSELECT'
223 ,rule_value="SASHELP.CARS.TYPE"
224 ,rule_active=1
225 ,tx_to='31DEC5999:23:59:59'dt;
226insert into &dc_libref..MPE_VALIDATIONS set
227 tx_from=0
228 ,base_lib="&demolib"
229 ,base_ds="CARS_EXT"
230 ,base_col="POTENTIALBUY"
231 ,rule_type='SOFTSELECT'
232 ,rule_value="&demolib..CARS_EXT.POTENTIALBUY"
233 ,rule_active=1
234 ,tx_to='31DEC5999:23:59:59'dt;
235insert into &dc_libref..MPE_VALIDATIONS set
236 tx_from=0
237 ,base_lib="&demolib"
238 ,base_ds="CARS_EXT"
239 ,base_col="COMMENT"
240 ,rule_type='NOTNULL'
241 ,rule_value="n/a"
242 ,rule_active=1
243 ,tx_to='31DEC5999:23:59:59'dt;
244insert into &dc_libref..MPE_VALIDATIONS set
245 tx_from=0
246 ,base_lib="&demolib"
247 ,base_ds="CARS_EXT"
248 ,base_col="ENGINESIZE"
249 ,rule_type='MINVAL'
250 ,rule_value="1.3"
251 ,rule_active=1
252 ,tx_to='31DEC5999:23:59:59'dt;
253insert into &dc_libref..MPE_VALIDATIONS set
254 tx_from=0
255 ,base_lib="&demolib"
256 ,base_ds="CARS_EXT"
257 ,base_col="ENGINESIZE"
258 ,rule_type='MAXVAL'
259 ,rule_value="8.3"
260 ,rule_active=1
261 ,tx_to='31DEC5999:23:59:59'dt;
262%mp_abort(iftrue= (&syscc ne 0)
263 ,mac=&_program
264 ,msg=%str(syscc=syscc=&syscc during param configuration)
265)
266
267/* programmatic values for COUNTRY (Dynamic Dropdown) */
268filename vldtr temp;
269data _null_;
270 file vldtr ;
271 put 'proc sql;';
272 put 'create table work.vals as';
273 put ' select distinct ORIGIN as display_value,';
274 put ' ORIGIN as raw_value';
275 put " from &demolib..COUNTRIES";
276 put ' order by 1;';
277 put 'data work.DYNAMIC_VALUES; set work.vals;display_index=_n_;run;';
278 put ' ';
279 put 'proc sql;';
280 put 'create table work.dev as ';
281 put ' select a.display_index,b.country as display_value';
282 put ' from work.DYNAMIC_VALUES as a';
283 put " left join &demolib..countries as b";
284 put " on a.raw_value=b.origin";
285 put ' order by display_index;';
286 put 'data work.DYNAMIC_EXTENDED_VALUES; set work.dev;by display_index;';
287 put ' EXTRA_COL_NAME="COUNTRY";';
288 put ' DISPLAY_TYPE="C";';
289 put ' RAW_VALUE_CHAR=DISPLAY_VALUE;';
290 put ' RAW_VALUE_NUM=.;';
291 put ' if first.display_index then forced_value=1;';
292 put 'run;';
293run;
294%mx_createjob(path=&apploc/demo
295 ,name=origin,code=vldtr
296)
297proc sql;
298insert into &dc_libref..MPE_VALIDATIONS set
299 tx_from=0
300 ,base_lib="&demolib"
301 ,base_ds="CARS_EXT"
302 ,base_col="ORIGIN"
303 ,rule_type='HARDSELECT_HOOK'
304 ,rule_value="&apploc/demo/origin"
305 ,rule_active=1
306 ,tx_to='31DEC5999:23:59:59'dt;
307
308/* PRE_EDIT JOB */
309%let fvar=XXXXXXXXXXX; /* cannot substitute macvars in parmcards */
310filename ft15f001 temp;
311parmcards4;
312 proc sql;
313 insert into XXXXXXXXXXX.JOBDATA values(
314 "&orig_libds (%mf_nobs(work.out) obs) fetched for editing %trim(
315 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
316;;;;
317filename f1 temp;
318%mp_binarycopy(inref=ft15f001, outref=f1)
319%mp_replace("%sysfunc(pathname(f1))", findvar=fvar, replacevar=joblib)
320%mx_createjob(path=&apploc/demo,name=PREEDIT,code=f1)
321filename ft15f001 clear;
322
323/* POST EDIT JOB */
324filename ft15f001 temp;
325parmcards4;
326 proc sql;
327 insert into XXXXXXXXXXX.JOBDATA values(
328 "&orig_libds staged %trim(
329 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
330;;;;
331filename f2 temp;
332%mp_binarycopy(inref=ft15f001, outref=f2)
333%mp_replace("%sysfunc(pathname(f2))", findvar=fvar, replacevar=joblib)
334%mx_createjob(path=&apploc/demo,name=POSTEDIT,code=f2)
335filename ft15f001 clear;
336
337/* PRE APPROVE JOB */
338filename ft15f001 temp;
339parmcards4;
340 proc sql;
341 insert into XXXXXXXXXXX.JOBDATA values(
342 "&orig_libds (%mf_nobs(work.staging_ds) obs) under review by %trim(
343 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
344;;;;
345filename f3 temp;
346%mp_binarycopy(inref=ft15f001, outref=f3)
347%mp_replace("%sysfunc(pathname(f3))", findvar=fvar, replacevar=joblib)
348%mx_createjob(path=&apploc/demo,name=PREAPPROVE,code=f3)
349filename ft15f001 clear;
350
351/* POST APPROVE JOB */
352filename ft15f001 temp;
353parmcards4;
354 proc sql;
355 insert into XXXXXXXXXXX.JOBDATA values(
356 "&orig_libds (%mf_nobs(work.staging_ds) obs) approved by %trim(
357 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
358;;;;
359filename f4 temp;
360%mp_binarycopy(inref=ft15f001, outref=f4)
361%mp_replace("%sysfunc(pathname(f4))", findvar=fvar, replacevar=joblib)
362%mx_createjob(path=&apploc/demo,name=POSTAPPROVE,code=f4)
363filename ft15f001 clear;