%macro newdtype(DTTMFMT=DATETIME21. , DIM_TYPE_CD=&dimtype , DIM_TYPE_NM=&dimtype Dimension Type , DIM_TYPE_DESC=&dimtype Dimension Type , LANGUAGE_CD=&languageCd , TABLE_NM=&dimtype , ASSOC_TABLE_NM=&dimtype._ASSOC , ASSOC_TYPE_TABLE_NM=&dimtype._ASSOC_TYPE , NLS_TABLE_NM=&dimtype._NLS , BUSINESS_ID_COLUMN_NM=&dimtype._ID , BASE_FACT_COLUMN_NM=&dimtype._RK , KEY_COLUMN_NM=&dimtype._RK , SOURCE_LIBREF=&sourceLibref , SOURCE_TREE=&sourceTree , ADD_TO_FACT_TABLE=&addToFactTable ); %global soletl_error; %global soletl_errormsg; %global soletl_statusID; %let soletl_error = ; %let soletl_errormsg = ; %let soletl_statusID = 1; /* Will be changed to 0 if program runs successful */ %let entry = newdtype; %let putlog = Y; %let stopflag=0; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgPutlog=N); %macro _wrong(_col=, _var=, _varl=32); %let l=%sysfunc(klength(&_var)); %if &l>&_varl %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=3 , msgTxt1=<&_var>, msgTxt2=<&_varl>, msgPutlog=&putlog); %let stopflag=1; %end; %let _index=%sysfunc( kscan( %sysfunc( ksubstr(&_var, 2)), 1, " ")); %let _wrong=%sysfunc( kcompress( %sysfunc( ksubstr(&_var, 1, 1)) , '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')); %let _wrongrest=%sysfunc( kcompress( %sysfunc( ksubstr(&_var, 2)) , '0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')); %if &_index ^= %sysfunc( ksubstr(&_var, 2)) or &_wrong ^= %str() or &_wrongrest ^= %str() %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=2 , msgTxt1=<&_var>, msgTxt2=column <&_col>, msgPutlog=&putlog); %let stopflag=1; %end; %mend; %macro _colfound(_col=, _var=); %let _colFound = 0; proc sql noprint; select 1 into :_colFound from SASHELP.SAS_DIMENSION_TYPE where &_col eq "&_var" ; quit; %if %sysfunc( exist(&sourceLibref..SOURCE_DIMENSION_TYPE) ) and &_colFound eq 0 %then %do; proc sql noprint; select 1 into :_colFound from &sourceLibref..SOURCE_DIMENSION_TYPE where &_col eq "&_var" ; quit; %end; %if &_colFound ne 0 %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=4 , msgTxt1=<&_var>, msgTxt2=column <&_col>, msgPutlog=&putlog); %let stopflag=1; %end; %mend; %let iomserver=&sesetl_serverContext; %if &DIM_TYPE_CD eq %str() or &LANGUAGE_CD eq %str() or &TABLE_NM eq %str() or &DIM_TYPE_NM eq %str() or &DIM_TYPE_DESC eq %str() or &ASSOC_TABLE_NM eq %str() or &ASSOC_TYPE_TABLE_NM eq %str() or &KEY_COLUMN_NM eq %str() or &NLS_TABLE_NM eq %str() or &SOURCE_LIBREF eq %str() or &SOURCE_TREE eq %str() or &ADD_TO_FACT_TABLE eq %str() %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=1, msgPutlog=&putlog); %goto exit ; %end; %if "&ADD_TO_FACT_TABLE" eq "Yes" and ( &BASE_FACT_COLUMN_NM eq %str() or &BUSINESS_ID_COLUMN_NM eq %str() ) %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=1, msgPutlog=&putlog); %goto exit ; %end; /* Upcase table and column names */ %LET TABLE_NM=%sysfunc(upcase(%sysfunc(ktrim(&TABLE_NM)))); %LET ASSOC_TABLE_NM=%sysfunc(upcase(%sysfunc(ktrim(&ASSOC_TABLE_NM)))); %LET ASSOC_TYPE_TABLE_NM=%sysfunc(upcase(%sysfunc(ktrim(&ASSOC_TYPE_TABLE_NM)))); %LET NLS_TABLE_NM=%sysfunc(upcase(%sysfunc(ktrim(&NLS_TABLE_NM)))); %LET KEY_COLUMN_NM=MEMBER_RK; %if "&ADD_TO_FACT_TABLE" eq "Yes" %then %do; %LET BASE_FACT_COLUMN_NM=%sysfunc(upcase(%sysfunc(ktrim(&BASE_FACT_COLUMN_NM)))); %LET BUSINESS_ID_COLUMN_NM=%sysfunc(upcase(%sysfunc(ktrim(&BUSINESS_ID_COLUMN_NM)))); %_wrong(_col=BUSINESS_ID_COLUMN_NM, _var=&BUSINESS_ID_COLUMN_NM); %if &stopflag=1 %then %goto exit; %_wrong(_col=BASE_FACT_COLUMN_NM, _var=&BASE_FACT_COLUMN_NM); %if &stopflag=1 %then %goto exit; %end; %else %do; %LET BASE_FACT_COLUMN_NM=; %LET BUSINESS_ID_COLUMN_NM=; %end; %_wrong(_col=TABLE_NM, _var=&TABLE_NM); %if &stopflag=1 %then %goto exit; %_wrong(_col=ASSOC_TABLE_NM, _var=&ASSOC_TABLE_NM); %if &stopflag=1 %then %goto exit; %_wrong(_col=ASSOC_TYPE_TABLE_NM, _var=&ASSOC_TYPE_TABLE_NM); %if &stopflag=1 %then %goto exit; %_wrong(_col=NLS_TABLE_NM, _var=&NLS_TABLE_NM); %if &stopflag=1 %then %goto exit; %_wrong(_col=KEY_COLUMN_NM, _var=&KEY_COLUMN_NM); %if &stopflag=1 %then %goto exit; %_wrong(_col=SOURCE_LIBREF, _var=&SOURCE_LIBREF, _varl=8); %if &stopflag=1 %then %goto exit; options metarepository="&ddsrepos"; %let _stageDDSLib=STAGEDDS; %let _DDSLib=DDS; %bldLibNm(sesetl_sasLibref=&source_Libref, sesetl_ChkDepRepos=Y, sesetl_useMLE=N ) ; %if &sysrc ne 0 %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=&sysrc , msgTxt1=<&source_Libref>, msgPutlog=&putlog); %goto exit ; %end; %bldLibNm(sesetl_sasLibref=&_stageDDSLib, sesetl_ChkDepRepos=Y, sesetl_useMLE=N ) ; %if &sysrc ne 0 %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=&sysrc , msgTxt1=<&_stageDDSLib>, msgPutlog=&putlog); %goto exit ; %end; %bldLibNm(sesetl_sasLibRef=&_DDSLib, sesetl_ChkDepRepos=Y, sesetl_useMLE=N ) ; %if &sysrc ne 0 %then %do; %sesgmsg( msgDsn=SASHELP.SOLMSGS, msgEntry=&entry, msgCode=&sysrc , msgTxt1=<&_DDSLib>, msgPutlog=&putlog); %goto exit ; %end; /* ddl for stage */ %LET LIBREF=&_stageDDSLib; %let _DATETIME=%sysfunc( datetime() ); %_colfound(_col=DIMENSION_TYPE_CD, _var=&DIM_TYPE_CD); %if &stopflag=1 %then %goto exit; %_colfound(_col=TABLE_NM, _var=&TABLE_NM); %if &stopflag=1 %then %goto exit; %_colfound(_col=ASSOC_TABLE_NM, _var=&ASSOC_TABLE_NM); %if &stopflag=1 %then %goto exit; %_colfound(_col=ASSOC_TYPE_TABLE_NM, _var=&ASSOC_TYPE_TABLE_NM); %if &stopflag=1 %then %goto exit; %_colfound(_col=NLS_TABLE_NM, _var=&NLS_TABLE_NM); %if &stopflag=1 %then %goto exit; %if "&ADD_TO_FACT_TABLE" eq "Yes" %then %do; %_colfound(_col=BUSINESS_ID_COLUMN_NM, _var=&BUSINESS_ID_COLUMN_NM); %if &stopflag=1 %then %goto exit; %_colfound(_col=BASE_FACT_COLUMN_NM, _var=&BASE_FACT_COLUMN_NM); %if &stopflag=1 %then %goto exit; %end; %if %sysfunc( exist(&sourceLibref..SOURCE_DIMENSION_TYPE) ) eq 0 %then %do; /* Create physical table and register in metadata */ PROC SQL; create table &sourceLibref..SOURCE_DIMENSION_TYPE like &LIBREF..DIMENSION_TYPE ; CREATE INDEX TBL_INDX ON &sourceLibref..SOURCE_DIMENSION_TYPE (DIMENSION_TYPE_CD, LANGUAGE_CD, VALID_FROM_DTTM); QUIT; %let stgprefix=; %let sesetl_sasLibrary = &sourceLibref ; %let sesetl_registerTables = work._registerTables ; %let sesetl_version = ; %let sesetl_treeName = &source_Tree; %let sesetl_validTreeTypes = D:Dimension Tables @ R:Reference Tables @ F:Fact Tables ; %let sesetl_altEtlStudioTreeNm = SAS Data Integration Studio Custom Tree; %let sesetl_altEtlStudioGroupNm=Data Integration Studio Groups; %let sesetl_security = Y ; data &sesetl_registerTables ; length sasTableName $255 ; length omrObjTableName $255 ; length treeType $10 ; sasTableName = "SOURCE_DIMENSION_TYPE"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "R" ; output ; run; proc display c=sashelp.regdata.RegisterSASDataSets.scl; run; %end; %if &stopflag=1 %then %goto exit; proc sql noprint; insert into &sourceLibref..SOURCE_DIMENSION_TYPE ( LANGUAGE_CD , VALID_FROM_DTTM, VALID_TO_DTTM, DIMENSION_TYPE_CD, TABLE_NM, DIMENSION_TYPE_NM, DIMENSION_TYPE_DESC, BASE_FACT_COLUMN_NM, BUSINESS_ID_COLUMN_NM, ASSOC_TABLE_NM, ASSOC_TYPE_TABLE_NM, KEY_COLUMN_NM, NLS_TABLE_NM) values ("&LANGUAGE_CD", &_DATETIME, ., "&DIM_TYPE_CD", "&TABLE_NM", "&DIM_TYPE_NM", "&DIM_TYPE_DESC", "&BASE_FACT_COLUMN_NM", "&BUSINESS_ID_COLUMN_NM", "&ASSOC_TABLE_NM", "&ASSOC_TYPE_TABLE_NM", "&KEY_COLUMN_NM", "&NLS_TABLE_NM") ; quit; PROC SQL; CREATE TABLE &LIBREF..&TABLE_NM ( MEMBER_ID VARCHAR(32) label="Member ID", VALID_FROM_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', SOURCE_SYSTEM_CD VARCHAR(3) label='Source System Code', MEMBER_NM VARCHAR(50) label="Member Name", MEMBER_DESC VARCHAR(255) label="Member Description", MEMBER_ADK VARCHAR(32) label="Member ADK", ROLL_UP_TO_PARENT_FLG VARCHAR(1) label='Roll Up To Parent Flag' ); CREATE INDEX %sysfunc(ksubstr(&TABLE_NM._INDX, 1, 32)) ON &LIBREF..&TABLE_NM (MEMBER_ID, VALID_FROM_DTTM); CREATE TABLE &LIBREF..&ASSOC_TABLE_NM ( MEMBER_ID VARCHAR(32) label="Member ID", PARENT_MEMBER_ID VARCHAR(32) label="Parent Member ID", MEMBER_ASSOC_TYPE_CD VARCHAR(32) label="Member Association Type Code", VALID_FROM_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', ORDER_NO NUMERIC(10) label='Order Number', MEMBER_ADK VARCHAR(32) label="Member ADK" ); CREATE INDEX %sysfunc(ksubstr(&ASSOC_TABLE_NM._INDX, 1, 32)) ON &LIBREF..&ASSOC_TABLE_NM (MEMBER_ID, PARENT_MEMBER_ID, MEMBER_ASSOC_TYPE_CD, VALID_FROM_DTTM); CREATE TABLE &LIBREF..&ASSOC_TYPE_TABLE_NM ( MEMBER_ASSOC_TYPE_CD VARCHAR(32) label="Member Association Type Code", LANGUAGE_CD VARCHAR(3) label='Language Code', VALID_FROM_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', MEMBER_ASSOC_TYPE_DESC VARCHAR(255) label="Member Association Type Description", MEMBER_ADK VARCHAR(32) label="Member ADK", DEFAULT_MEMBER_ID VARCHAR(32) label="Default Member ID" ); CREATE INDEX %sysfunc(ksubstr(&ASSOC_TYPE_TABLE_NM._INDX, 1, 32)) ON &LIBREF..&ASSOC_TYPE_TABLE_NM (MEMBER_ASSOC_TYPE_CD, LANGUAGE_CD, VALID_FROM_DTTM); CREATE TABLE &LIBREF..&NLS_TABLE_NM ( MEMBER_ID VARCHAR(32) label="Member ID", LANGUAGE_CD VARCHAR(3) label='Language Code', VALID_FROM_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', MEMBER_NM VARCHAR(50) label="Member Name", MEMBER_DESC VARCHAR(255) label='Member Description' ); CREATE INDEX %sysfunc(ksubstr(&NLS_TABLE_NM._INDX, 1, 32)) ON &LIBREF..&NLS_TABLE_NM (MEMBER_ID, LANGUAGE_CD, VALID_FROM_DTTM); QUIT; %if "&ADD_TO_FACT_TABLE" eq "Yes" %then %do; PROC SQL; ALTER TABLE &LIBREF..GL_TRANSACTION_SUM ADD &BUSINESS_ID_COLUMN_NM VARCHAR(32) label="&DIM_TYPE_CD ID" ; ALTER TABLE &LIBREF..GL_JRNL_DETAILS ADD &BUSINESS_ID_COLUMN_NM VARCHAR(32) label="&DIM_TYPE_CD ID" ; QUIT; %end; /* ddl for dds */ %LET LIBREF=&_DDSLib; PROC SQL; CREATE TABLE &LIBREF..&TABLE_NM ( MEMBER_RK NUMERIC(10) label="Member Key", VALID_FROM_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', MEMBER_ID VARCHAR(32) label="Member ID", SOURCE_SYSTEM_CD VARCHAR(3) label='Source System Code', MEMBER_NM VARCHAR(50) label="Member Name", MEMBER_DESC VARCHAR(255) label="Member Description", MEMBER_ADK VARCHAR(32) label="Member ADK", ROLL_UP_TO_PARENT_FLG VARCHAR(1) label='Roll Up To Parent Flag', PROCESSED_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Datetime Processed by ETL', CONSTRAINT PRIM_KEY PRIMARY KEY (MEMBER_RK, VALID_FROM_DTTM) ); CREATE TABLE &LIBREF..&ASSOC_TABLE_NM ( MEMBER_RK NUMERIC(10) label="Member Key", PARENT_MEMBER_RK NUMERIC(10) label="Parent Member Key", MEMBER_ASSOC_TYPE_CD VARCHAR(32) label="Member Association Type Code", VALID_FROM_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', ORDER_NO NUMERIC(10) label='Order Number', MEMBER_ADK VARCHAR(32) label="Member ADK", PROCESSED_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Datetime Processed by ETL', CONSTRAINT PRIM_KEY PRIMARY KEY (MEMBER_RK, PARENT_MEMBER_RK, MEMBER_ASSOC_TYPE_CD, VALID_FROM_DTTM) ); CREATE TABLE &LIBREF..&ASSOC_TYPE_TABLE_NM ( MEMBER_ASSOC_TYPE_CD VARCHAR(32) label="Member Association Type Code", LANGUAGE_CD VARCHAR(3) label='Language Code', VALID_FROM_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', MEMBER_ASSOC_TYPE_DESC VARCHAR(255) label="Member Association Type Description", MEMBER_ADK VARCHAR(32) label="Member ADK", DEFAULT_MEMBER_RK NUMERIC(10) label="Default Member Key", PROCESSED_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Datetime Processed by ETL', CONSTRAINT PRIM_KEY PRIMARY KEY (MEMBER_ASSOC_TYPE_CD, LANGUAGE_CD, VALID_FROM_DTTM) ); CREATE TABLE &LIBREF..&NLS_TABLE_NM ( MEMBER_RK NUMERIC(10) label="Member Key", LANGUAGE_CD VARCHAR(3) label='Language Code', VALID_FROM_DTTM DATE FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid From Datetime', VALID_TO_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Valid To Datetime', MEMBER_NM VARCHAR(50) label="Member Name", MEMBER_DESC VARCHAR(255) label='Member Description', PROCESSED_DTTM DATE NOT NULL FORMAT=&DTTMFMT INFORMAT=&DTTMFMT label='Processed Datetime', CONSTRAINT PRIM_KEY PRIMARY KEY (MEMBER_RK, LANGUAGE_CD, VALID_FROM_DTTM) ); QUIT; %if "&ADD_TO_FACT_TABLE" eq "Yes" %then %do; PROC SQL; ALTER TABLE &LIBREF..GL_TRANSACTION_SUM ADD &BASE_FACT_COLUMN_NM NUMERIC(10) label="&DIM_TYPE_CD Key" ; ALTER TABLE &LIBREF..GL_JRNL_DETAILS ADD &BASE_FACT_COLUMN_NM NUMERIC(10) label="&DIM_TYPE_CD Key" ; QUIT; %end; /* REGISTER NEW_DIMENSION DDS Tables */ %let libname=&_DDSLib; %let stgprefix=; %let sesetl_sasLibrary = &libname ; %let sesetl_registerTables = work._registerTables ; %let sesetl_version = ; %let sesetl_treeName = Detail Data Store (DDS); %let sesetl_validTreeTypes = D:Dimension Tables @ R:Reference Tables @ F:Fact Tables ; %let sesetl_altEtlStudioTreeNm = SAS Data Integration Studio Custom Tree; %let sesetl_altEtlStudioGroupNm=Data Integration Studio Groups; %let sesetl_security = Y ; data &sesetl_registerTables ; length sasTableName $255 ; length omrObjTableName $255 ; length treeType $10 ; sasTableName = "&TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; sasTableName = "&ASSOC_TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; sasTableName = "&ASSOC_TYPE_TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; sasTableName = "&NLS_TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; run; proc display c=sashelp.regdata.RegisterSASDataSets.scl; run; %if "&ADD_TO_FACT_TABLE" eq "Yes" %then %do; proc metalib; omr (library="&libname"); update_rule (noadd); select (GL_TRANSACTION_SUM GL_JRNL_DETAILS); run; %end; /* REGISTER NEW_DIMENSION StageDDS Tables */ %let libname=&_stageDDSLib; %let stgprefix=STAGE_; %let sesetl_sasLibrary = &libname ; %let sesetl_registerTables = work._registerTables ; %let sesetl_version = ; %let sesetl_treeName = Staging Tables; %let sesetl_validTreeTypes = D:Dimension Tables @ R:Reference Tables @ F:Fact Tables ; %let sesetl_altEtlStudioTreeNm = SAS Data Integration Studio Custom Tree; %let sesetl_altEtlStudioGroupNm=Data Integration Studio Groups; %let sesetl_security = Y ; data &sesetl_registerTables ; length sasTableName $255 ; length omrObjTableName $255 ; length treeType $10 ; sasTableName = "&TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; sasTableName = "&ASSOC_TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; sasTableName = "&ASSOC_TYPE_TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; sasTableName = "&NLS_TABLE_NM"; omrObjTableName = strip("&stgprefix." || sasTableName) ; treeType = "D" ; output ; run; proc display c=sashelp.regdata.RegisterSASDataSets.scl; run; %if "&ADD_TO_FACT_TABLE" eq "Yes" %then %do; proc metalib; omr (library="&libname"); update_rule (noadd); select (GL_TRANSACTION_SUM GL_JRNL_DETAILS); run; %end; %let soletl_statusID = 0; /* Program ran successful */ %exit: %if &soletl_statusID ne 0 %then %do; %let soletl_error = &sesgmsg_msgCodeReturn; %let soletl_errormsg = &sesgmsg_msgReturn; %end; %mend;