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
@ -18,4 +18,4 @@ In any case, you must not make any such use of this software as to develop softw
|
||||
UNLESS EXPRESSLY AGREED OTHERWISE, 4GL APPS PROVIDES THIS SOFTWARE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, AND IN NO EVENT AND UNDER NO LEGAL THEORY, SHALL 4GL APPS BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM USE OR INABILITY TO USE THIS SOFTWARE.
|
||||
|
||||
|
||||
`
|
||||
`
|
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…
Reference in New Issue
Block a user