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 raw_value';
274 put " from &demolib..COUNTRIES";
275 put ' order by 1;';
276 put 'data work.DYNAMIC_VALUES; set work.vals;display_index=_n_;run;';
277 put ' ';
278 put 'proc sql;';
279 put 'create table work.dev as ';
280 put ' select a.display_index, a.raw_value';
281 put ' from work.DYNAMIC_VALUES as a';
282 put " left join &demolib..countries as b";
283 put " on a.raw_value=b.origin";
284 put ' order by display_index;';
285 put 'data work.DYNAMIC_EXTENDED_VALUES; set work.dev;by display_index;';
286 put ' EXTRA_COL_NAME="COUNTRY";';
287 put ' DISPLAY_TYPE="C";';
288 put ' RAW_VALUE_CHAR=raw_value;';
289 put ' RAW_VALUE_NUM=.;';
290 put ' if first.display_index then forced_value=1;';
291 put 'run;';
292run;
293%mx_createjob(path=&apploc/demo
294 ,name=origin,code=vldtr
295)
296proc sql;
297insert into &dc_libref..MPE_VALIDATIONS set
298 tx_from=0
299 ,base_lib="&demolib"
300 ,base_ds="CARS_EXT"
301 ,base_col="ORIGIN"
302 ,rule_type='HARDSELECT_HOOK'
303 ,rule_value="&apploc/demo/origin"
304 ,rule_active=1
305 ,tx_to='31DEC5999:23:59:59'dt;
306
307/* PRE_EDIT JOB */
308%let fvar=XXXXXXXXXXX; /* cannot substitute macvars in parmcards */
309filename ft15f001 temp;
310parmcards4;
311 proc sql;
312 insert into XXXXXXXXXXX.JOBDATA values(
313 "&orig_libds (%mf_nobs(work.out) obs) fetched for editing %trim(
314 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
315;;;;
316filename f1 temp;
317%mp_binarycopy(inref=ft15f001, outref=f1)
318%mp_replace("%sysfunc(pathname(f1))", findvar=fvar, replacevar=joblib)
319%mx_createjob(path=&apploc/demo,name=PREEDIT,code=f1)
320filename ft15f001 clear;
321
322/* POST EDIT JOB */
323filename ft15f001 temp;
324parmcards4;
325 proc sql;
326 insert into XXXXXXXXXXX.JOBDATA values(
327 "&orig_libds staged %trim(
328 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
329;;;;
330filename f2 temp;
331%mp_binarycopy(inref=ft15f001, outref=f2)
332%mp_replace("%sysfunc(pathname(f2))", findvar=fvar, replacevar=joblib)
333%mx_createjob(path=&apploc/demo,name=POSTEDIT,code=f2)
334filename ft15f001 clear;
335
336/* PRE APPROVE JOB */
337filename ft15f001 temp;
338parmcards4;
339 proc sql;
340 insert into XXXXXXXXXXX.JOBDATA values(
341 "&orig_libds (%mf_nobs(work.staging_ds) obs) under review by %trim(
342 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
343;;;;
344filename f3 temp;
345%mp_binarycopy(inref=ft15f001, outref=f3)
346%mp_replace("%sysfunc(pathname(f3))", findvar=fvar, replacevar=joblib)
347%mx_createjob(path=&apploc/demo,name=PREAPPROVE,code=f3)
348filename ft15f001 clear;
349
350/* POST APPROVE JOB */
351filename ft15f001 temp;
352parmcards4;
353 proc sql;
354 insert into XXXXXXXXXXX.JOBDATA values(
355 "&orig_libds (%mf_nobs(work.staging_ds) obs) approved by %trim(
356 )by %mf_getUser() at %sysfunc(datetime(),datetime19.)","&pgmloc");
357;;;;
358filename f4 temp;
359%mp_binarycopy(inref=ft15f001, outref=f4)
360%mp_replace("%sysfunc(pathname(f4))", findvar=fvar, replacevar=joblib)
361%mx_createjob(path=&apploc/demo,name=POSTAPPROVE,code=f4)
362filename ft15f001 clear;