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",
|
"name": "dcfrontend",
|
||||||
"version": "6.2.7",
|
"version": "6.3.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "dcfrontend",
|
"name": "dcfrontend",
|
||||||
"version": "6.2.7",
|
"version": "6.3.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@saithodev/semantic-release-gitea": "^2.1.0",
|
"@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 mp_lockanytable.sas
|
||||||
@li mpe_accesscheck.sas
|
@li mpe_accesscheck.sas
|
||||||
@li mpe_alerts.sas
|
@li mpe_alerts.sas
|
||||||
|
@li mpe_xlmapvalidate.sas
|
||||||
@li mpe_loadfail.sas
|
@li mpe_loadfail.sas
|
||||||
@li mpe_runhook.sas
|
@li mpe_runhook.sas
|
||||||
|
|
||||||
@ -450,7 +451,7 @@ run;
|
|||||||
%do i=1 %to %sysfunc(countw(&pk));
|
%do i=1 %to %sysfunc(countw(&pk));
|
||||||
%let iWord=%scan(&pk,&i);
|
%let iWord=%scan(&pk,&i);
|
||||||
call symputx('duplist',symget('duplist')!!
|
call symputx('duplist',symget('duplist')!!
|
||||||
" &iWord="!!trim(&iWord));
|
" &iWord="!!cats(&iWord));
|
||||||
%end;
|
%end;
|
||||||
run;
|
run;
|
||||||
%let msg=This upload contains duplicates on the Primary Key columns %trim(
|
%let msg=This upload contains duplicates on the Primary Key columns %trim(
|
||||||
@ -472,6 +473,10 @@ run;
|
|||||||
%return;
|
%return;
|
||||||
%end;
|
%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)
|
%mpe_runhook(POST_EDIT_HOOK)
|
||||||
|
|
||||||
/* stop if err */
|
/* stop if err */
|
||||||
|
@ -269,6 +269,210 @@ insert into &lib..mpe_datadictionary set
|
|||||||
,DD_SENSITIVITY="Low"
|
,DD_SENSITIVITY="Low"
|
||||||
,tx_to='31DEC5999:23:59:59'dt;
|
,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
|
* MPE_GROUPS
|
||||||
*/
|
*/
|
||||||
@ -981,6 +1185,42 @@ insert into &lib..mpe_selectbox set
|
|||||||
,notes='Docs: https://docs.datacontroller.io/column-level-security'
|
,notes='Docs: https://docs.datacontroller.io/column-level-security'
|
||||||
,post_edit_hook='services/hooks/mpe_column_level_security_postedit'
|
,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
|
insert into &lib..mpe_tables
|
||||||
set tx_from=0
|
set tx_from=0
|
||||||
,tx_to='31DEC5999:23:59:59'dt
|
,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_value="services/validations/mpe_alerts.alert_lib"
|
||||||
,rule_active=1
|
,rule_active=1
|
||||||
,tx_to='31DEC5999:23:59:59'dt;
|
,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
|
insert into &lib..MPE_VALIDATIONS set
|
||||||
tx_from=0
|
tx_from=0
|
||||||
,base_lib="&lib"
|
,base_lib="&lib"
|
||||||
|
@ -268,6 +268,56 @@ proc datasets lib=&lib noprint;
|
|||||||
pk_mpe_excel_config=(tx_to xl_libref xl_table xl_column)
|
pk_mpe_excel_config=(tx_to xl_libref xl_table xl_column)
|
||||||
/nomiss unique;
|
/nomiss unique;
|
||||||
quit;
|
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;
|
proc sql;
|
||||||
create table &lib..mpe_filteranytable(
|
create table &lib..mpe_filteranytable(
|
||||||
filter_rk num ¬null,
|
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",
|
"name": "4gl",
|
||||||
"serverUrl": "https://sas9.4gl.io",
|
"serverUrl": "https://sas.4gl.io",
|
||||||
"serverType": "SASJS",
|
"serverType": "SASJS",
|
||||||
"httpsAgentOptions": {
|
"httpsAgentOptions": {
|
||||||
"allowInsecureRequests": false
|
"allowInsecureRequests": false
|
||||||
|
@ -34,7 +34,8 @@ run;
|
|||||||
%mp_testservice(&_program,
|
%mp_testservice(&_program,
|
||||||
viyacontext=&defaultcontext,
|
viyacontext=&defaultcontext,
|
||||||
inputdatasets=work.sascontroltable work.jsdata,
|
inputdatasets=work.sascontroltable work.jsdata,
|
||||||
outlib=web1
|
outlib=web1,
|
||||||
|
mdebug=&sasjs_mdebug
|
||||||
)
|
)
|
||||||
|
|
||||||
%let status=0;
|
%let status=0;
|
||||||
|
@ -14,8 +14,9 @@
|
|||||||
<h5> sasdata </h5>
|
<h5> sasdata </h5>
|
||||||
<h5> sasparams </h5>
|
<h5> sasparams </h5>
|
||||||
Contains info on the request. One row is returned.
|
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)
|
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> approvers </h5>
|
||||||
<h5> dqrules </h5>
|
<h5> dqrules </h5>
|
||||||
@ -534,6 +535,11 @@ data _null_;
|
|||||||
run;
|
run;
|
||||||
|
|
||||||
%put params;
|
%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;
|
data sasparams;
|
||||||
length colHeaders $20000 filter_text $32767;
|
length colHeaders $20000 filter_text $32767;
|
||||||
colHeaders=cats(upcase("%mf_getvarlist(sasdata1,dlm=%str(,))"));
|
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;
|
if %mf_nobs(work.cls_rules)=0 then cls_flag=0;
|
||||||
else cls_flag=1;
|
else cls_flag=1;
|
||||||
put (_all_)(=);
|
put (_all_)(=);
|
||||||
|
if "&orig_libds"="&mpelib..MPE_XLMAP_DATA" or &ismap ne 0 then ismap=1;
|
||||||
|
else ismap=0;
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
|
||||||
/* Extract validation DQ Rules */
|
/* Extract validation DQ Rules */
|
||||||
proc sort data=&mpelib..mpe_validations
|
proc sort data=&mpelib..mpe_validations
|
||||||
(where=(&dc_dttmtfmt. le TX_TO
|
(where=(&dc_dttmtfmt. le TX_TO
|
||||||
|
@ -141,13 +141,15 @@ run;
|
|||||||
data work.fmts;
|
data work.fmts;
|
||||||
length fmtname $32;
|
length fmtname $32;
|
||||||
fmtname="&fmtname";
|
fmtname="&fmtname";
|
||||||
|
type='N';
|
||||||
do start=1 to 10;
|
do start=1 to 10;
|
||||||
label= cats("&fmtname",start);
|
label= cats("&fmtname",start);
|
||||||
|
end=start;
|
||||||
output;
|
output;
|
||||||
end;
|
end;
|
||||||
run;
|
run;
|
||||||
proc sort data=work.fmts nodupkey;
|
proc sort data=work.fmts nodupkey;
|
||||||
by fmtname;
|
by fmtname type start;
|
||||||
run;
|
run;
|
||||||
proc format cntlin=work.fmts library=dctest.dcfmts;
|
proc format cntlin=work.fmts library=dctest.dcfmts;
|
||||||
run;
|
run;
|
||||||
@ -157,8 +159,9 @@ data work.inquery3;
|
|||||||
infile datalines4 dsd;
|
infile datalines4 dsd;
|
||||||
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
|
||||||
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
OPERATOR_NM:$10. RAW_VALUE:$4000.;
|
||||||
|
RAW_VALUE="'&fmtname'";
|
||||||
datalines4;
|
datalines4;
|
||||||
AND,AND,1,FMTNAME,CONTAINS,"'&fmtname'"
|
AND,AND,1,FMTNAME,CONTAINS,placeholder (see line above)
|
||||||
;;;;
|
;;;;
|
||||||
run;
|
run;
|
||||||
%mp_filterstore(
|
%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;
|
run;
|
||||||
data work.jsdata;
|
data work.jsdata;
|
||||||
set work.fmtextract;
|
set work.fmtextract;
|
||||||
|
fmtrow=_n_;
|
||||||
if _n_<5 then _____DELETE__THIS__RECORD_____='Yes';
|
if _n_<5 then _____DELETE__THIS__RECORD_____='Yes';
|
||||||
else _____DELETE__THIS__RECORD_____='No';
|
else _____DELETE__THIS__RECORD_____='No';
|
||||||
if _n_>20 then stop;
|
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)
|
,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(OPEN)
|
||||||
%webout(OBJ,sasDatasets)
|
%webout(OBJ,sasDatasets)
|
||||||
%webout(OBJ,saslibs)
|
%webout(OBJ,saslibs)
|
||||||
%webout(OBJ,globvars)
|
%webout(OBJ,globvars)
|
||||||
|
%webout(ARR,xlmaps)
|
||||||
%webout(CLOSE)
|
%webout(CLOSE)
|
||||||
|
|
||||||
%mpeterm()
|
%mpeterm()
|
||||||
|
@ -16,13 +16,24 @@
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
data globvars;
|
data work.globvars;
|
||||||
set webout.globvars;
|
set webout.globvars;
|
||||||
putlog (_all_)(=);
|
putlog (_all_)(=);
|
||||||
run;
|
run;
|
||||||
|
|
||||||
|
data work.xlmaps;
|
||||||
|
set webout.xlmaps;
|
||||||
|
putlog (_all_)(=);
|
||||||
|
run;
|
||||||
|
|
||||||
%mp_assertdsobs(work.globvars,
|
%mp_assertdsobs(work.globvars,
|
||||||
desc=Fromsas table returned,
|
desc=Fromsas table returned,
|
||||||
test=HASOBS,
|
test=HASOBS,
|
||||||
outds=work.test_results
|
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