Merge branch 'issue69' into issue-69-ui
Some checks failed
Build / Build-and-ng-test (pull_request) Failing after 13s
Some checks failed
Build / Build-and-ng-test (pull_request) Failing after 13s
This commit is contained in:
commit
7d1720a360
4
package-lock.json
generated
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "dcfrontend",
|
||||
"version": "6.2.7",
|
||||
"version": "6.3.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "dcfrontend",
|
||||
"version": "6.2.7",
|
||||
"version": "6.3.0",
|
||||
"hasInstallScript": true,
|
||||
"devDependencies": {
|
||||
"@saithodev/semantic-release-gitea": "^2.1.0",
|
||||
|
18
sas/sasjs/db/datactrl/mpe_xlmap_data.ddl
Normal file
18
sas/sasjs/db/datactrl/mpe_xlmap_data.ddl
Normal file
@ -0,0 +1,18 @@
|
||||
/**
|
||||
@file
|
||||
@brief DDL for MPE_XLMAP_DATA
|
||||
|
||||
@version 9.3
|
||||
@author 4GL Apps Ltd
|
||||
@copyright 4GL Apps Ltd
|
||||
**/
|
||||
|
||||
create table &curlib..MPE_XLMAP_DATA(
|
||||
LOAD_REF char(32) not null,
|
||||
XLMAP_ID char(32) not null,
|
||||
XLMAP_RANGE_ID char(32) not null,
|
||||
ROW_NO num not null,
|
||||
COL_NO num not null,
|
||||
VALUE_TXT char(4000),
|
||||
constraint pk_MPE_XLMAP_DATA
|
||||
primary key(LOAD_REF, XLMAP_ID, XLMAP_RANGE_ID, ROW_NO, COL_NO));
|
17
sas/sasjs/db/datactrl/mpe_xlmap_info.ddl
Normal file
17
sas/sasjs/db/datactrl/mpe_xlmap_info.ddl
Normal file
@ -0,0 +1,17 @@
|
||||
/**
|
||||
@file
|
||||
@brief DDL for mpe_xlmap_info
|
||||
|
||||
@version 9.3
|
||||
@author 4GL Apps Ltd
|
||||
@copyright 4GL Apps Ltd
|
||||
**/
|
||||
|
||||
create table &curlib..mpe_xlmap_info(
|
||||
tx_from num not null,
|
||||
XLMAP_ID char(32) not null,
|
||||
XLMAP_DESCRIPTION char(1000) not null,
|
||||
XLMAP_TARGETLIBDS char(41) not null,
|
||||
tx_to num not null,
|
||||
constraint pk_mpe_xlmap_info
|
||||
primary key(tx_from,XLMAP_ID));
|
19
sas/sasjs/db/datactrl/mpe_xlmap_rules.ddl
Normal file
19
sas/sasjs/db/datactrl/mpe_xlmap_rules.ddl
Normal file
@ -0,0 +1,19 @@
|
||||
/**
|
||||
@file
|
||||
@brief DDL for mpe_xlmap_rules
|
||||
|
||||
@version 9.3
|
||||
@author 4GL Apps Ltd
|
||||
@copyright 4GL Apps Ltd
|
||||
**/
|
||||
|
||||
create table &curlib..mpe_xlmap_rules(
|
||||
tx_from num not null,
|
||||
XLMAP_ID char(32) not null,
|
||||
XLMAP_RANGE_ID char(32) not null,
|
||||
XLMAP_SHEET char(32) not null,
|
||||
XLMAP_START char(1000) not null,
|
||||
XLMAP_FINISH char(1000),
|
||||
tx_to num not null,
|
||||
constraint pk_mpe_xlmap_rules
|
||||
primary key(tx_from,XLMAP_ID,XLMAP_RANGE_ID));
|
44
sas/sasjs/db/migrations/20230115_v6.5_release.sas
Normal file
44
sas/sasjs/db/migrations/20230115_v6.5_release.sas
Normal file
@ -0,0 +1,44 @@
|
||||
/**
|
||||
@file
|
||||
@brief migration script to move from v5 to v6.5 of data controller
|
||||
|
||||
**/
|
||||
|
||||
%let dclib=YOURDCLIB;
|
||||
|
||||
libname &dclib "/your/dc/path";
|
||||
|
||||
/**
|
||||
* Change 1
|
||||
* New MPE_SUBMIT table
|
||||
*/
|
||||
proc sql;
|
||||
create table &dclib..mpe_xlmap_rules(
|
||||
tx_from num not null,
|
||||
XLMAP_ID char(32) not null,
|
||||
XLMAP_RANGE_ID char(32) not null,
|
||||
XLMAP_SHEET char(32) not null,
|
||||
XLMAP_START char(1000) not null,
|
||||
XLMAP_FINISH char(1000),
|
||||
tx_to num not null,
|
||||
constraint pk_mpe_xlmap_rules
|
||||
primary key(tx_from,XLMAP_ID,XLMAP_RANGE_ID));
|
||||
|
||||
create table &dclib..MPE_XLMAP_DATA(
|
||||
LOAD_REF char(32) not null,
|
||||
XLMAP_ID char(32) not null,
|
||||
XLMAP_RANGE_ID char(32) not null,
|
||||
ROW_NO num not null,
|
||||
COL_NO num not null,
|
||||
VALUE_TXT char(4000),
|
||||
constraint pk_MPE_XLMAP_DATA
|
||||
primary key(LOAD_REF, XLMAP_ID, XLMAP_RANGE_ID, ROW_NO, COL_NO));
|
||||
|
||||
create table &dclib..mpe_xlmap_info(
|
||||
tx_from num not null,
|
||||
XLMAP_ID char(32) not null,
|
||||
XLMAP_DESCRIPTION char(1000) not null,
|
||||
XLMAP_TARGETLIBDS char(41) not null,
|
||||
tx_to num not null,
|
||||
constraint pk_mpe_xlmap_info
|
||||
primary key(tx_from,XLMAP_ID));
|
@ -24,6 +24,7 @@
|
||||
@li mp_lockanytable.sas
|
||||
@li mpe_accesscheck.sas
|
||||
@li mpe_alerts.sas
|
||||
@li mpe_xlmapvalidate.sas
|
||||
@li mpe_loadfail.sas
|
||||
@li mpe_runhook.sas
|
||||
|
||||
@ -450,7 +451,7 @@ run;
|
||||
%do i=1 %to %sysfunc(countw(&pk));
|
||||
%let iWord=%scan(&pk,&i);
|
||||
call symputx('duplist',symget('duplist')!!
|
||||
" &iWord="!!trim(&iWord));
|
||||
" &iWord="!!cats(&iWord));
|
||||
%end;
|
||||
run;
|
||||
%let msg=This upload contains duplicates on the Primary Key columns %trim(
|
||||
@ -472,6 +473,10 @@ run;
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* If a Complex Excel Upload, needs to have the load ref added to the table */
|
||||
%mpe_xlmapvalidate(&mperef,work.staging_ds,&mpelib,&orig_libds)
|
||||
|
||||
/* Run the Post Edit Hook prior to creation of staging folder */
|
||||
%mpe_runhook(POST_EDIT_HOOK)
|
||||
|
||||
/* stop if err */
|
||||
|
@ -269,6 +269,210 @@ insert into &lib..mpe_datadictionary set
|
||||
,DD_SENSITIVITY="Low"
|
||||
,tx_to='31DEC5999:23:59:59'dt;
|
||||
|
||||
/**
|
||||
* mpe_xlmap_info
|
||||
*/
|
||||
insert into &lib..mpe_xlmap_info set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_description='Basel 3 Key Metrics report'
|
||||
,XLMAP_TARGETLIBDS="&lib..MPE_XLMAP_DATA";
|
||||
|
||||
/**
|
||||
* mpe_xlmap_rules
|
||||
*/
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:a'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH 4 R[2]C[0]:a';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:b'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH 4 R[2]C[0]:b';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:c'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH 4 R[2]C[0]:c';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:d'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH 4 R[2]C[0]:d';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:e'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH 4 R[2]C[0]:e';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:f'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH 4 R[2]C[0]:f';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1/a'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[0]C[1]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1/b'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[0]C[2]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1/c'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[0]C[3]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1/d'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[0]C[4]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1/e'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[0]C[5]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1/f'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[0]C[6]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1a/e'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[1]C[5]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:1a/f'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='MATCH C R[1]C[6]:Common Equity Tier 1 (CET1)';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:2/a'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='ABSOLUTE D10';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:2/b'
|
||||
,xlmap_sheet='/3'
|
||||
,xlmap_start='ABSOLUTE E10';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:2/c'
|
||||
,xlmap_sheet='/3'
|
||||
,xlmap_start='RELATIVE R[10]C[6]';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:2/d'
|
||||
,xlmap_sheet='/3'
|
||||
,xlmap_start='RELATIVE R[10]C[8]';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:2/e'
|
||||
,xlmap_sheet='/3'
|
||||
,xlmap_start='RELATIVE R[10]C[9]';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:2/f'
|
||||
,xlmap_sheet='/3'
|
||||
,xlmap_start='RELATIVE R[10]C[10]';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:2a'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='ABSOLUTE H11'
|
||||
,xlmap_finish='RELATIVE R[0]C[1]';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-KM1'
|
||||
,xlmap_range_id='KM1:3'
|
||||
,xlmap_sheet='KM1'
|
||||
,xlmap_start='RELATIVE R[12]C[4]'
|
||||
,xlmap_finish='ABSOLUTE I13';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-CR2'
|
||||
,xlmap_range_id='CR2-sec1'
|
||||
,xlmap_sheet='CR2'
|
||||
,xlmap_start='ABSOLUTE D8'
|
||||
,xlmap_finish='BLANKROW';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='BASEL-CR2'
|
||||
,xlmap_range_id='CR2-sec2'
|
||||
,xlmap_sheet='CR2'
|
||||
,xlmap_start='ABSOLUTE D18'
|
||||
,xlmap_finish='LASTDOWN';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='Sample'
|
||||
,xlmap_range_id='header'
|
||||
,xlmap_sheet='/1'
|
||||
,xlmap_start='ABSOLUTE B3'
|
||||
,xlmap_finish='ABSOLUTE B8';
|
||||
insert into &lib..mpe_xlmap_rules set
|
||||
tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,xlmap_id='Sample'
|
||||
,xlmap_range_id='data'
|
||||
,xlmap_sheet='/1'
|
||||
,xlmap_start='ABSOLUTE B13'
|
||||
,xlmap_finish='ABSOLUTE E16';
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* MPE_GROUPS
|
||||
*/
|
||||
@ -981,6 +1185,42 @@ insert into &lib..mpe_selectbox set
|
||||
,notes='Docs: https://docs.datacontroller.io/column-level-security'
|
||||
,post_edit_hook='services/hooks/mpe_column_level_security_postedit'
|
||||
;
|
||||
insert into &lib..mpe_tables
|
||||
set tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,libref="&lib"
|
||||
,dsn='MPE_XLMAP_INFO'
|
||||
,num_of_approvals_required=1
|
||||
,loadtype='TXTEMPORAL'
|
||||
,var_txfrom='TX_FROM'
|
||||
,var_txto='TX_TO'
|
||||
,buskey='XLMAP_ID'
|
||||
,notes='Docs: https://docs.datacontroller.io/complex-excel-uploads'
|
||||
,post_edit_hook='services/hooks/mpe_xlmap_info_postedit'
|
||||
;
|
||||
insert into &lib..mpe_tables
|
||||
set tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,libref="&lib"
|
||||
,dsn='MPE_XLMAP_RULES'
|
||||
,num_of_approvals_required=1
|
||||
,loadtype='TXTEMPORAL'
|
||||
,var_txfrom='TX_FROM'
|
||||
,var_txto='TX_TO'
|
||||
,buskey='XLMAP_ID XLMAP_RANGE_ID'
|
||||
,notes='Docs: https://docs.datacontroller.io/complex-excel-uploads'
|
||||
,post_edit_hook='services/hooks/mpe_xlmap_rules_postedit'
|
||||
;
|
||||
insert into &lib..mpe_tables
|
||||
set tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
,libref="&lib"
|
||||
,dsn='MPE_XLMAP_DATA'
|
||||
,num_of_approvals_required=1
|
||||
,loadtype='UPDATE'
|
||||
,buskey='LOAD_REF XLMAP_ID XLMAP_RANGE_ID ROW_NO COL_NO'
|
||||
,notes='Docs: https://docs.datacontroller.io/complex-excel-uploads'
|
||||
;
|
||||
insert into &lib..mpe_tables
|
||||
set tx_from=0
|
||||
,tx_to='31DEC5999:23:59:59'dt
|
||||
@ -1253,6 +1493,27 @@ insert into &lib..MPE_VALIDATIONS set
|
||||
,rule_value="services/validations/mpe_alerts.alert_lib"
|
||||
,rule_active=1
|
||||
,tx_to='31DEC5999:23:59:59'dt;
|
||||
|
||||
insert into &lib..MPE_VALIDATIONS set
|
||||
tx_from=0
|
||||
,base_lib="&lib"
|
||||
,base_ds="MPE_XLMAP_INFO"
|
||||
,base_col="XLMAP_ID"
|
||||
,rule_type='CASE'
|
||||
,rule_value='UPCASE'
|
||||
,rule_active=1
|
||||
,tx_to='31DEC5999:23:59:59'dt;
|
||||
|
||||
insert into &lib..MPE_VALIDATIONS set
|
||||
tx_from=0
|
||||
,base_lib="&lib"
|
||||
,base_ds="MPE_XLMAP_RULES"
|
||||
,base_col="XLMAP_ID"
|
||||
,rule_type='CASE'
|
||||
,rule_value='UPCASE'
|
||||
,rule_active=1
|
||||
,tx_to='31DEC5999:23:59:59'dt;
|
||||
|
||||
insert into &lib..MPE_VALIDATIONS set
|
||||
tx_from=0
|
||||
,base_lib="&lib"
|
||||
|
@ -268,6 +268,56 @@ proc datasets lib=&lib noprint;
|
||||
pk_mpe_excel_config=(tx_to xl_libref xl_table xl_column)
|
||||
/nomiss unique;
|
||||
quit;
|
||||
|
||||
proc sql;
|
||||
create table &lib..MPE_XLMAP_DATA(
|
||||
LOAD_REF char(32) ¬null,
|
||||
XLMAP_ID char(32) ¬null,
|
||||
XLMAP_RANGE_ID char(32) ¬null,
|
||||
ROW_NO num ¬null,
|
||||
COL_NO num ¬null,
|
||||
VALUE_TXT char(4000)
|
||||
);quit;
|
||||
proc datasets lib=&lib noprint;
|
||||
modify MPE_XLMAP_DATA;
|
||||
index create
|
||||
pk_MPE_XLMAP_DATA=(load_ref xlmap_id xlmap_range_id row_no col_no)
|
||||
/nomiss unique;
|
||||
quit;
|
||||
|
||||
proc sql;
|
||||
create table &lib..mpe_xlmap_info(
|
||||
tx_from num ¬null,
|
||||
tx_to num ¬null,
|
||||
XLMAP_ID char(32) ¬null,
|
||||
XLMAP_DESCRIPTION char(1000) ¬null,
|
||||
XLMAP_TARGETLIBDS char(41) ¬null
|
||||
);quit;
|
||||
proc datasets lib=&lib noprint;
|
||||
modify mpe_xlmap_info;
|
||||
index create
|
||||
pk_mpe_xlmap_info=(tx_to xlmap_id)
|
||||
/nomiss unique;
|
||||
quit;
|
||||
|
||||
proc sql;
|
||||
create table &lib..mpe_xlmap_rules(
|
||||
tx_from num ¬null,
|
||||
tx_to num ¬null,
|
||||
XLMAP_ID char(32) ¬null,
|
||||
XLMAP_RANGE_ID char(32) ¬null,
|
||||
XLMAP_SHEET char(32) ¬null,
|
||||
XLMAP_START char(1000) ¬null,
|
||||
XLMAP_FINISH char(1000),
|
||||
XLMAP_TARGETLIBDS char(41)
|
||||
);quit;
|
||||
proc datasets lib=&lib noprint;
|
||||
modify mpe_xlmap_rules;
|
||||
index create
|
||||
pk_mpe_xlmap_rules=(tx_to xlmap_id xlmap_range_id)
|
||||
/nomiss unique;
|
||||
quit;
|
||||
|
||||
proc sql;
|
||||
create table &lib..mpe_filteranytable(
|
||||
filter_rk num ¬null,
|
||||
|
28
sas/sasjs/macros/mpe_xlmapvalidate.sas
Normal file
28
sas/sasjs/macros/mpe_xlmapvalidate.sas
Normal file
@ -0,0 +1,28 @@
|
||||
/**
|
||||
@file
|
||||
@brief Validates excel map structure and adds load ref
|
||||
@details Used in staging, prior to the post edit hook
|
||||
|
||||
@version 9.2
|
||||
@author 4GL Apps Ltd
|
||||
@copyright 4GL Apps Ltd. This code may only be used within Data Controller
|
||||
and may not be re-distributed or re-sold without the express permission of
|
||||
4GL Apps Ltd.
|
||||
**/
|
||||
|
||||
%macro mpe_xlmapvalidate(mperef,inds,dclib,tgtds);
|
||||
|
||||
%local ismap;
|
||||
proc sql noprint;
|
||||
select count(*) into: ismap
|
||||
from &dclib..mpe_xlmap_info
|
||||
where XLMAP_TARGETLIBDS="&tgtds" and &dc_dttmtfmt. le TX_TO ;
|
||||
|
||||
%if "&tgtds"="&dclib..MPE_XLMAP_DATA" or &ismap>0 %then %do;
|
||||
data &inds;
|
||||
set &inds;
|
||||
LOAD_REF="&mperef";
|
||||
run;
|
||||
%end;
|
||||
|
||||
%mend mpe_xlmapvalidate;
|
59
sas/sasjs/macros/mpe_xlmapvalidate.test.sas
Normal file
59
sas/sasjs/macros/mpe_xlmapvalidate.test.sas
Normal file
@ -0,0 +1,59 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mpe_xlmapvalidate macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mpe_xlmapvalidate.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertscope.sas
|
||||
|
||||
<h4> SAS Includes </h4>
|
||||
@li mpe_xlmap_data.ddl ul
|
||||
|
||||
@author 4GL Apps Ltd
|
||||
@copyright 4GL Apps Ltd. This code may only be used within Data Controller
|
||||
and may not be re-distributed or re-sold without the express permission of
|
||||
4GL Apps Ltd.
|
||||
|
||||
**/
|
||||
|
||||
/* create the table */
|
||||
%let curlib=work;
|
||||
proc sql;
|
||||
%inc ul;
|
||||
|
||||
data work.test1;
|
||||
if 0 then set work.MPE_XLMAP_DATA;
|
||||
LOAD_REF='0';
|
||||
XLMAP_ID='Sample';
|
||||
XLMAP_RANGE_ID='Range 1';
|
||||
ROW_NO=1;
|
||||
COL_NO=2;
|
||||
VALUE_TXT='something';
|
||||
run;
|
||||
|
||||
%mp_assertscope(SNAPSHOT)
|
||||
%mpe_xlmapvalidate(DCTEST1,work.test1,&dclib,NOT.MAP)
|
||||
%mp_assertscope(COMPARE,
|
||||
desc=Checking macro variables against previous snapshot
|
||||
)
|
||||
|
||||
data _null_;
|
||||
set work.test1;
|
||||
call symputx('test1',load_ref);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(&test1=0),
|
||||
desc=Checking load ref was not applied
|
||||
)
|
||||
|
||||
%mpe_xlmapvalidate(DCTEST2,work.test1,&dclib,&dclib..MPE_XLMAP_DATA)
|
||||
|
||||
data _null_;
|
||||
set work.test1;
|
||||
call symputx('test2',load_ref);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(&test2=DCTEST2),
|
||||
desc=Checking load ref was applied for default case
|
||||
)
|
@ -207,7 +207,7 @@
|
||||
},
|
||||
{
|
||||
"name": "4gl",
|
||||
"serverUrl": "https://sas9.4gl.io",
|
||||
"serverUrl": "https://sas.4gl.io",
|
||||
"serverType": "SASJS",
|
||||
"httpsAgentOptions": {
|
||||
"allowInsecureRequests": false
|
||||
|
@ -34,7 +34,8 @@ run;
|
||||
%mp_testservice(&_program,
|
||||
viyacontext=&defaultcontext,
|
||||
inputdatasets=work.sascontroltable work.jsdata,
|
||||
outlib=web1
|
||||
outlib=web1,
|
||||
mdebug=&sasjs_mdebug
|
||||
)
|
||||
|
||||
%let status=0;
|
||||
|
@ -14,8 +14,9 @@
|
||||
<h5> sasdata </h5>
|
||||
<h5> sasparams </h5>
|
||||
Contains info on the request. One row is returned.
|
||||
* CLS_FLG - set to 0 if there are no CLS rules (everything should be editable)
|
||||
@li CLS_FLG - set to 0 if there are no CLS rules (everything should be editable)
|
||||
else set to 1 (CLS rules exist)
|
||||
@li ISMAP - set to 1 if the target DS is an excel map target, else 0
|
||||
|
||||
<h5> approvers </h5>
|
||||
<h5> dqrules </h5>
|
||||
@ -534,6 +535,11 @@ data _null_;
|
||||
run;
|
||||
|
||||
%put params;
|
||||
%let ismap=0;
|
||||
proc sql noprint;
|
||||
select count(*) into: ismap from &mpelib..mpe_xlmap_info
|
||||
where XLMAP_TARGETLIBDS="&orig_libds" and &dc_dttmtfmt. le TX_TO;
|
||||
|
||||
data sasparams;
|
||||
length colHeaders $20000 filter_text $32767;
|
||||
colHeaders=cats(upcase("%mf_getvarlist(sasdata1,dlm=%str(,))"));
|
||||
@ -551,8 +557,11 @@ data sasparams;
|
||||
if %mf_nobs(work.cls_rules)=0 then cls_flag=0;
|
||||
else cls_flag=1;
|
||||
put (_all_)(=);
|
||||
if "&orig_libds"="&mpelib..MPE_XLMAP_DATA" or &ismap ne 0 then ismap=1;
|
||||
else ismap=0;
|
||||
run;
|
||||
|
||||
|
||||
/* Extract validation DQ Rules */
|
||||
proc sort data=&mpelib..mpe_validations
|
||||
(where=(&dc_dttmtfmt. le TX_TO
|
||||
|
@ -141,13 +141,15 @@ run;
|
||||
data work.fmts;
|
||||
length fmtname $32;
|
||||
fmtname="&fmtname";
|
||||
type='N';
|
||||
do start=1 to 10;
|
||||
label= cats("&fmtname",start);
|
||||
end=start;
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
proc sort data=work.fmts nodupkey;
|
||||
by fmtname;
|
||||
by fmtname type start;
|
||||
run;
|
||||
proc format cntlin=work.fmts library=dctest.dcfmts;
|
||||
run;
|
||||
@ -157,8 +159,9 @@ data work.inquery3;
|
||||
infile datalines4 dsd;
|
||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||
RAW_VALUE="'&fmtname'";
|
||||
datalines4;
|
||||
AND,AND,1,FMTNAME,CONTAINS,"'&fmtname'"
|
||||
AND,AND,1,FMTNAME,CONTAINS,placeholder (see line above)
|
||||
;;;;
|
||||
run;
|
||||
%mp_filterstore(
|
||||
|
82
sas/sasjs/services/editors/getxlmaps.sas
Normal file
82
sas/sasjs/services/editors/getxlmaps.sas
Normal file
@ -0,0 +1,82 @@
|
||||
/**
|
||||
@file getxlmaps.sas
|
||||
@brief Returns a list of rules and other info for a specific xlmap_id
|
||||
|
||||
<h4> Service Inputs </h4>
|
||||
|
||||
<h5> getxlmaps_in </h5>
|
||||
|
||||
|XLMAP_ID|
|
||||
|---|
|
||||
|Sample|
|
||||
|
||||
<h4> Service Outputs </h4>
|
||||
|
||||
<h5> xlmaprules </h5>
|
||||
|
||||
Filtered output of the dc.MPE_XLMAP_RULES table
|
||||
|
||||
|XLMAP_ID|XLMAP_RANGE_ID|XLMAP_SHEET|XLMAP_START|XLMAP_FINISH|
|
||||
|---|---|---|---|---|
|
||||
|Sample|Range1|Sheet1|ABSOLUTE A1| |
|
||||
|Sample|Range2|Sheet1|RELATIVE R[2]C[2]|ABSOLUTE H11|
|
||||
|
||||
<h5> xlmapinfo </h5>
|
||||
Extra info for a map id
|
||||
|
||||
|TARGET_DS|
|
||||
|---|
|
||||
|DCXXX.MPE_XLMAP_DATA|
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_abort.sas
|
||||
@li mpeinit.sas
|
||||
|
||||
@version 9.3
|
||||
@author 4GL Apps Ltd
|
||||
@copyright 4GL Apps Ltd. This code may only be used within Data Controller
|
||||
and may not be re-distributed or re-sold without the express permission of
|
||||
4GL Apps Ltd.
|
||||
|
||||
**/
|
||||
|
||||
%mpeinit()
|
||||
|
||||
data _null_;
|
||||
set work.getxlmaps_in;
|
||||
putlog (_all_)(=);
|
||||
call symputx('xlmap_id',xlmap_id);
|
||||
run;
|
||||
|
||||
proc sql noprint;
|
||||
create table work.xlmaprules as
|
||||
select xlmap_id
|
||||
,XLMAP_RANGE_ID
|
||||
,XLMAP_SHEET
|
||||
,XLMAP_START
|
||||
,XLMAP_FINISH
|
||||
from &mpelib..MPE_XLMAP_RULES
|
||||
where &dc_dttmtfmt. lt tx_to and xlmap_id="&xlmap_id"
|
||||
order by xlmap_sheet, xlmap_range_id;
|
||||
|
||||
%global target_ds;
|
||||
select XLMAP_TARGETLIBDS into: target_ds
|
||||
from &mpelib..MPE_XLMAP_INFO
|
||||
where &dc_dttmtfmt. lt tx_to and xlmap_id="&xlmap_id";
|
||||
|
||||
%mp_abort(iftrue= (&syscc ne 0)
|
||||
,mac=&_program..sas
|
||||
,msg=%str(syscc=&syscc)
|
||||
)
|
||||
|
||||
data work.xlmapinfo;
|
||||
target_ds=coalescec("&target_ds","&mpelib..MPE_XLMAP_DATA");
|
||||
output;
|
||||
stop;
|
||||
run;
|
||||
|
||||
%webout(OPEN)
|
||||
%webout(OBJ,xlmaprules)
|
||||
%webout(OBJ,xlmapinfo)
|
||||
%webout(CLOSE)
|
||||
|
58
sas/sasjs/services/editors/getxlmaps.test.sas
Normal file
58
sas/sasjs/services/editors/getxlmaps.test.sas
Normal file
@ -0,0 +1,58 @@
|
||||
/**
|
||||
@file
|
||||
@brief testing getxlmaps service
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_getuniquefileref.sas
|
||||
@li mx_testservice.sas
|
||||
@li mp_assert.sas
|
||||
@li mp_assertdsobs.sas
|
||||
|
||||
|
||||
**/
|
||||
|
||||
%let _program=&appLoc/services/editors/getxlmaps;
|
||||
|
||||
/**
|
||||
* Test 1 - basic send
|
||||
*/
|
||||
|
||||
%let f1=%mf_getuniquefileref();
|
||||
data _null_;
|
||||
file &f1 termstr=crlf;
|
||||
put 'XLMAP_ID:$char12.';
|
||||
put "Sample";
|
||||
run;
|
||||
|
||||
%mx_testservice(&_program,
|
||||
viyacontext=&defaultcontext,
|
||||
inputfiles=&f1:getxlmaps_in,
|
||||
outlib=web1,
|
||||
mdebug=&sasjs_mdebug
|
||||
)
|
||||
|
||||
data work.xlmaprules;
|
||||
set web1.xlmaprules;
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
|
||||
%mp_assertdsobs(work.xlmaprules,
|
||||
test=ATLEAST 2,
|
||||
desc=Checking successful return of at least 2 rules for the Sample map,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
|
||||
/**
|
||||
* Test 2 - info returned
|
||||
*/
|
||||
data work.xlmapinfo;
|
||||
set web1.xlmapinfo;
|
||||
putlog (_all_)(=);
|
||||
call symputx('tgtds',target_ds);
|
||||
run;
|
||||
%mp_assert(
|
||||
iftrue=(&tgtds=&dclib..MPE_XLMAP_DATA),
|
||||
desc=Checking correct target table is returned,
|
||||
outds=work.test_results
|
||||
)
|
@ -24,6 +24,7 @@ proc format lib=DCTEST.DCFMTS cntlout=work.fmtextract;
|
||||
run;
|
||||
data work.jsdata;
|
||||
set work.fmtextract;
|
||||
fmtrow=_n_;
|
||||
if _n_<5 then _____DELETE__THIS__RECORD_____='Yes';
|
||||
else _____DELETE__THIS__RECORD_____='No';
|
||||
if _n_>20 then stop;
|
||||
|
69
sas/sasjs/services/hooks/mpe_xlmap_info_postedit.sas
Normal file
69
sas/sasjs/services/hooks/mpe_xlmap_info_postedit.sas
Normal file
@ -0,0 +1,69 @@
|
||||
/**
|
||||
@file
|
||||
@brief Post Edit Hook script for the MPE_XLMAP_INFO table
|
||||
@details Post edit hooks provide additional backend validation for user
|
||||
provided data. The incoming dataset is named `work.staging_ds` and is
|
||||
provided in mpe_loader.sas.
|
||||
|
||||
Available macro variables:
|
||||
@li DC_LIBREF - The DC control library
|
||||
@li LIBREF - The library of the dataset being edited (is assigned)
|
||||
@li DS - The dataset being edited
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mf_existds.sas
|
||||
@li mf_getvarlist.sas
|
||||
@li mf_wordsinstr1butnotstr2.sas
|
||||
@li dc_assignlib.sas
|
||||
@li mp_validatecol.sas
|
||||
|
||||
**/
|
||||
|
||||
data work.staging_ds;
|
||||
set work.staging_ds;
|
||||
|
||||
/* apply the first excel map to all cells */
|
||||
length tgtds $41;
|
||||
retain tgtds;
|
||||
drop tgtds is_libds;
|
||||
if _n_=1 then do;
|
||||
if missing(XLMAP_TARGETLIBDS) then tgtds="&dc_libref..MPE_XLMAP_DATA";
|
||||
else tgtds=upcase(XLMAP_TARGETLIBDS);
|
||||
%mp_validatecol(XLMAP_TARGETLIBDS,LIBDS,is_libds)
|
||||
call symputx('tgtds',tgtds);
|
||||
call symputx('is_libds',is_libds);
|
||||
end;
|
||||
XLMAP_TARGETLIBDS=tgtds;
|
||||
|
||||
run;
|
||||
|
||||
%mp_abort(iftrue=(&is_libds ne 1)
|
||||
,mac=mpe_xlmap_info_postedit
|
||||
,msg=Invalid target dataset (&tgtds)
|
||||
)
|
||||
|
||||
/**
|
||||
* make sure that the supplied target dataset exists and
|
||||
* has the necessary columns
|
||||
*/
|
||||
%dc_assignlib(READ,%scan(&tgtds,1,.))
|
||||
|
||||
%mp_abort(iftrue=(%mf_existds(libds=&tgtds) ne 1)
|
||||
,mac=mpe_xlmap_info_postedit
|
||||
,msg=Target dataset (&tgtds) could not be opened
|
||||
)
|
||||
|
||||
%let tgtvars=%upcase(%mf_getvarlist(&tgtds));
|
||||
%let srcvars=%upcase(%mf_getvarlist(&dc_libref..MPE_XLMAP_DATA));
|
||||
%let badvars1=%mf_wordsInStr1ButNotStr2(Str1=&srcvars,Str2=&tgtvars);
|
||||
%let badvars2=%mf_wordsInStr1ButNotStr2(Str1=&tgtvars,Str2=&srcvars);
|
||||
|
||||
%mp_abort(iftrue=(%length(&badvars1.X)>1)
|
||||
,mac=mpe_xlmap_info_postedit
|
||||
,msg=%str(Target dataset (&tgtds) has missing vars: &badvars1)
|
||||
)
|
||||
|
||||
%mp_abort(iftrue=(%length(&badvars2.X)>1)
|
||||
,mac=mpe_xlmap_info_postedit
|
||||
,msg=%str(Target dataset (&tgtds) has unrecognised vars: &badvars2)
|
||||
)
|
23
sas/sasjs/services/hooks/mpe_xlmap_rules_postedit.sas
Normal file
23
sas/sasjs/services/hooks/mpe_xlmap_rules_postedit.sas
Normal file
@ -0,0 +1,23 @@
|
||||
/**
|
||||
@file
|
||||
@brief Post Edit Hook script for the MPE_XLMAP_RULES table
|
||||
@details Post edit hooks provide additional backend validation for user
|
||||
provided data. The incoming dataset is named `work.staging_ds` and is
|
||||
provided in mpe_loader.sas.
|
||||
|
||||
Available macro variables:
|
||||
@li DC_LIBREF - The DC control library
|
||||
@li LIBREF - The library of the dataset being edited (is assigned)
|
||||
@li DS - The dataset being edited
|
||||
|
||||
|
||||
**/
|
||||
|
||||
data work.staging_ds;
|
||||
set work.staging_ds;
|
||||
|
||||
/* ensure uppercasing */
|
||||
XLMAP_ID=upcase(XLMAP_ID);
|
||||
|
||||
run;
|
||||
|
@ -129,10 +129,17 @@ create table saslibs as
|
||||
,msg=%str(issue with security validation)
|
||||
)
|
||||
|
||||
proc sql;
|
||||
create table work.xlmaps as
|
||||
select distinct XLMAP_ID
|
||||
from &mpelib..MPE_XLMAP_RULES
|
||||
where &dc_dttmtfmt. lt tx_to;
|
||||
|
||||
%webout(OPEN)
|
||||
%webout(OBJ,sasDatasets)
|
||||
%webout(OBJ,saslibs)
|
||||
%webout(OBJ,globvars)
|
||||
%webout(ARR,xlmaps)
|
||||
%webout(CLOSE)
|
||||
|
||||
%mpeterm()
|
||||
|
@ -16,13 +16,24 @@
|
||||
)
|
||||
|
||||
|
||||
data globvars;
|
||||
data work.globvars;
|
||||
set webout.globvars;
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
|
||||
data work.xlmaps;
|
||||
set webout.xlmaps;
|
||||
putlog (_all_)(=);
|
||||
run;
|
||||
|
||||
%mp_assertdsobs(work.globvars,
|
||||
desc=Fromsas table returned,
|
||||
test=HASOBS,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
%mp_assertdsobs(work.xlmaps,
|
||||
desc=xlmaps table returned,
|
||||
test=HASOBS,
|
||||
outds=work.test_results
|
||||
)
|
Loading…
x
Reference in New Issue
Block a user