mirror of
https://github.com/sasjs/core.git
synced 2025-12-28 05:20:06 +00:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3b6f06b3a | ||
|
|
8046d5a0b1 | ||
|
|
aed07f2943 | ||
|
|
5bf87a78b8 | ||
|
|
0851523d18 | ||
|
|
9e2de81dae | ||
|
|
4887f355c8 | ||
|
|
9b32e6e3f2 | ||
|
|
74790ec80e | ||
|
|
afd8a754b4 | ||
|
|
bc1f7b3baa | ||
|
|
51690e68dc | ||
|
|
0fa076cb73 | ||
|
|
6506993704 |
17
.gitpod.yml
17
.gitpod.yml
@@ -6,3 +6,20 @@ image:
|
||||
vscode:
|
||||
extensions:
|
||||
- sasjs.sasjs-for-vscode
|
||||
|
||||
github:
|
||||
prebuilds:
|
||||
# enable for the master/default branch (defaults to true)
|
||||
master: true
|
||||
# enable for all branches in this repo (defaults to false)
|
||||
branches: false
|
||||
# enable for pull requests coming from this repo (defaults to true)
|
||||
pullRequests: true
|
||||
# enable for pull requests coming from forks (defaults to false)
|
||||
pullRequestsFromForks: true
|
||||
# add a "Review in Gitpod" button as a comment to pull requests (defaults to true)
|
||||
addComment: true
|
||||
# add a "Review in Gitpod" button to pull requests (defaults to false)
|
||||
addBadge: true
|
||||
# add a label once the prebuild is ready to pull requests (defaults to false)
|
||||
addLabel: prebuilt-in-gitpod
|
||||
118
all.sas
118
all.sas
@@ -975,7 +975,8 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex
|
||||
%end;
|
||||
%end;
|
||||
%else %do;
|
||||
%put dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
@@ -1037,7 +1038,11 @@ https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md#functionex
|
||||
%let vlen = %str( );
|
||||
%end;
|
||||
%end;
|
||||
%else %put dataset &libds not opened! (rc=&dsid);
|
||||
%else %do;
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* Close dataset */
|
||||
%let rc = %sysfunc(close(&dsid));
|
||||
@@ -1161,7 +1166,11 @@ returns:
|
||||
%let vnum = %str( );
|
||||
%end;
|
||||
%end;
|
||||
%else %put dataset &ds not opened! (rc=&dsid);
|
||||
%else %do;
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* Close dataset */
|
||||
%let rc = %sysfunc(close(&dsid));
|
||||
@@ -1210,7 +1219,11 @@ Usage:
|
||||
%let vtype = %str( );
|
||||
%end;
|
||||
%end;
|
||||
%else %put dataset &libds not opened! (rc=&dsid);
|
||||
%else %do;
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* Close dataset */
|
||||
%let rc = %sysfunc(close(&dsid));
|
||||
@@ -3315,12 +3328,21 @@ run;
|
||||
@file
|
||||
@brief Create a CARDS file from a SAS dataset.
|
||||
@details Uses dataset attributes to convert all data into datalines.
|
||||
Running the generated file will rebuild the original dataset.
|
||||
Running the generated file will rebuild the original dataset. Includes
|
||||
support for large decimals, binary data, PROCESSED_DTTM columns, and
|
||||
alternative encoding. If the input dataset is empty, the cards file will
|
||||
still be created.
|
||||
|
||||
Additional support to generate a random sample and max rows.
|
||||
|
||||
Usage:
|
||||
|
||||
%mp_ds2cards(base_ds=sashelp.class
|
||||
, tgt_ds=work.class
|
||||
, cards_file= "C:\temp\class.sas"
|
||||
, maxobs=5)
|
||||
, showlog=NO
|
||||
, maxobs=5
|
||||
)
|
||||
|
||||
TODO:
|
||||
- labelling the dataset
|
||||
@@ -3331,15 +3353,24 @@ run;
|
||||
that is converted to a cards file.
|
||||
@param [in] tgt_ds= Table that the generated cards file would create.
|
||||
Optional - if omitted, will be same as BASE_DS.
|
||||
@param [out] cards_file= Location in which to write the (.sas) cards file
|
||||
@param [in] maxobs= to limit output to the first <code>maxobs</code>
|
||||
observations
|
||||
@param [in] showlog= whether to show generated cards file in the SAS log
|
||||
(YES/NO)
|
||||
@param [in] outencoding= provide encoding value for file statement (eg utf-8)
|
||||
@param [in] append= If NO then will rebuild the cards file if it already
|
||||
@param [out] cards_file= ("%sysfunc(pathname(work))/cardgen.sas") Location in
|
||||
which to write the (.sas) cards file
|
||||
@param [in] maxobs= (max) To limit output to the first <code>maxobs</code>
|
||||
observations, enter an integer here.
|
||||
@param [in] random_sample= (NO) Set to YES to generate a random sample of
|
||||
data. Can be quite slow.
|
||||
@param [in] showlog= (YES) Whether to show generated cards file in the SAS
|
||||
log. Valid values:
|
||||
@li YES
|
||||
@li NO
|
||||
@param [in] outencoding= Provide encoding value for file statement (eg utf-8)
|
||||
@param [in] append= (NO) If NO then will rebuild the cards file if it already
|
||||
exists, otherwise will append to it. Used by the mp_lib2cards.sas macro.
|
||||
|
||||
<h4> Related Macros </h4>
|
||||
@li mp_lib2cards.sas
|
||||
@li mp_ds2inserts.sas
|
||||
@li mp_mdtablewrite.sas
|
||||
|
||||
@version 9.2
|
||||
@author Allan Bowe
|
||||
@@ -3364,15 +3395,15 @@ run;
|
||||
%if (&tgt_ds = ) %then %let tgt_ds=&base_ds;
|
||||
%if %index(&tgt_ds,.)=0 %then %let tgt_ds=WORK.%scan(&base_ds,2,.);
|
||||
%if ("&outencoding" ne "") %then %let outencoding=encoding="&outencoding";
|
||||
%if ("&append" = "") %then %let append=;
|
||||
%if ("&append" = "" or "&append" = "NO") %then %let append=;
|
||||
%else %let append=mod;
|
||||
|
||||
/* get varcount */
|
||||
%let nvars=0;
|
||||
proc sql noprint;
|
||||
select count(*) into: nvars from dictionary.columns
|
||||
where libname="%scan(%upcase(&base_ds),1)"
|
||||
and memname="%scan(%upcase(&base_ds),2)";
|
||||
where upcase(libname)="%scan(%upcase(&base_ds),1)"
|
||||
and upcase(memname)="%scan(%upcase(&base_ds),2)";
|
||||
%if &nvars=0 %then %do;
|
||||
%put %str(WARN)ING: Dataset &base_ds has no variables, will not be converted.;
|
||||
%return;
|
||||
@@ -3428,8 +3459,8 @@ proc sql
|
||||
reset outobs=max;
|
||||
create table datalines1 as
|
||||
select name,type,length,varnum,format,label from dictionary.columns
|
||||
where libname="%upcase(%scan(&base_ds,1))"
|
||||
and memname="%upcase(%scan(&base_ds,2))";
|
||||
where upcase(libname)="%upcase(%scan(&base_ds,1))"
|
||||
and upcase(memname)="%upcase(%scan(&base_ds,2))";
|
||||
|
||||
/**
|
||||
Due to long decimals cannot use best. format
|
||||
@@ -3450,7 +3481,18 @@ data datalines_2;
|
||||
,put(',name,',best32.-l)
|
||||
,substrn(put(',name,',bestd32.-l),1
|
||||
,findc(put(',name,',bestd32.-l),"0","TBK")))');
|
||||
else dataline=name;
|
||||
/**
|
||||
* binary data must be converted, to store in text format. It is identified
|
||||
* by the presence of the $HEX keyword in the format.
|
||||
*/
|
||||
else if upcase(format)=:'$HEX' then
|
||||
dataline=cats('put(trim(',name,'),',format,')');
|
||||
/**
|
||||
* There is no easy way to store line breaks in a cards file.
|
||||
* To discuss this, use: https://github.com/sasjs/core/issues/80
|
||||
* Removing all nonprintables with kw (keep writeable)
|
||||
*/
|
||||
else dataline=cats('compress(',name,', ,"kw")');
|
||||
run;
|
||||
|
||||
proc sql noprint;
|
||||
@@ -3475,7 +3517,8 @@ data _null_;
|
||||
|
||||
|
||||
/* Build input statement */
|
||||
if type='char' then type3=':$char.';
|
||||
if upcase(format)=:'$HEX' then type3=':'!!format;
|
||||
else if type='char' then type3=':$char.';
|
||||
str2=put(name,$33.)||type3;
|
||||
|
||||
|
||||
@@ -3497,11 +3540,12 @@ data _null_;
|
||||
file &cards_file. &outencoding lrecl=32767 termstr=nl &append;
|
||||
length __attrib $32767;
|
||||
if _n_=1 then do;
|
||||
put '/*******************************************************************';
|
||||
put " Datalines for %upcase(%scan(&base_ds,2)) dataset ";
|
||||
put " Generated by %nrstr(%%)mp_ds2cards()";
|
||||
put " Available on github.com/sasjs/core";
|
||||
put '********************************************************************/';
|
||||
put '/**';
|
||||
put ' @file';
|
||||
put " @brief Datalines for %upcase(%scan(&base_ds,2)) dataset";
|
||||
put " @details Generated by %nrstr(%%)mp_ds2cards()";
|
||||
put " Available on github.com/sasjs/core";
|
||||
put '**/';
|
||||
put "data &tgt_ds &indexes;";
|
||||
put "attrib ";
|
||||
%do i = 1 %to &nvars;
|
||||
@@ -3525,11 +3569,11 @@ data _null_;
|
||||
put 'run;';
|
||||
end;
|
||||
else do;
|
||||
put "infile cards dsd delimiter=',';";
|
||||
put "infile cards dsd;";
|
||||
put "input ";
|
||||
%do i = 1 %to &nvars.;
|
||||
%if(%length(&&input_stmt_&i..)) %then
|
||||
put " &&input_stmt_&i..";
|
||||
put " &&input_stmt_&i..";
|
||||
;
|
||||
%end;
|
||||
put ";";
|
||||
@@ -4412,21 +4456,21 @@ run;
|
||||
/* must use SQL as proc datasets does not support length changes */
|
||||
proc sql noprint;
|
||||
create table &outds as
|
||||
select a.TABLE_CATALOG as libref
|
||||
,a.TABLE_NAME
|
||||
select upcase(a.TABLE_CATALOG) as libref
|
||||
,upcase(a.TABLE_NAME) as TABLE_NAME
|
||||
,a.constraint_type
|
||||
,a.constraint_name
|
||||
,b.column_name
|
||||
from dictionary.TABLE_CONSTRAINTS a
|
||||
left join dictionary.constraint_column_usage b
|
||||
on a.TABLE_CATALOG=b.TABLE_CATALOG
|
||||
and a.TABLE_NAME=b.TABLE_NAME
|
||||
on upcase(a.TABLE_CATALOG)=upcase(b.TABLE_CATALOG)
|
||||
and upcase(a.TABLE_NAME)=upcase(b.TABLE_NAME)
|
||||
and a.constraint_name=b.constraint_name
|
||||
where a.TABLE_CATALOG="&lib"
|
||||
and b.TABLE_CATALOG="&lib"
|
||||
where upcase(a.TABLE_CATALOG)="&lib"
|
||||
and upcase(b.TABLE_CATALOG)="&lib"
|
||||
%if "&ds" ne "" %then %do;
|
||||
and a.TABLE_NAME="&ds"
|
||||
and b.TABLE_NAME="&ds"
|
||||
and upcase(a.TABLE_NAME)="&ds"
|
||||
and upcase(b.TABLE_NAME)="&ds"
|
||||
%end;
|
||||
;
|
||||
|
||||
@@ -4977,7 +5021,7 @@ run;
|
||||
proc sql noprint;
|
||||
select sysvalue into: schemaactual
|
||||
from dictionary.libnames
|
||||
where libname="&libref" and engine='SQLSVR';
|
||||
where upcase(libname)="&libref" and engine='SQLSVR';
|
||||
%let schema=%sysfunc(coalescec(&schemaactual,&schema,&libref));
|
||||
|
||||
%do x=1 %to %sysfunc(countw(&dsnlist));
|
||||
@@ -5070,7 +5114,7 @@ run;
|
||||
proc sql noprint;
|
||||
select sysvalue into: schemaactual
|
||||
from dictionary.libnames
|
||||
where libname="&libref" and engine='POSTGRES';
|
||||
where upcase(libname)="&libref" and engine='POSTGRES';
|
||||
%let schema=%sysfunc(coalescec(&schemaactual,&schema,&libref));
|
||||
data _null_;
|
||||
file &fref mod;
|
||||
|
||||
@@ -51,7 +51,8 @@
|
||||
%end;
|
||||
%end;
|
||||
%else %do;
|
||||
%put dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
|
||||
@@ -43,7 +43,11 @@
|
||||
%let vlen = %str( );
|
||||
%end;
|
||||
%end;
|
||||
%else %put dataset &libds not opened! (rc=&dsid);
|
||||
%else %do;
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* Close dataset */
|
||||
%let rc = %sysfunc(close(&dsid));
|
||||
|
||||
@@ -43,7 +43,11 @@ returns:
|
||||
%let vnum = %str( );
|
||||
%end;
|
||||
%end;
|
||||
%else %put dataset &ds not opened! (rc=&dsid);
|
||||
%else %do;
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* Close dataset */
|
||||
%let rc = %sysfunc(close(&dsid));
|
||||
|
||||
@@ -39,7 +39,11 @@ Usage:
|
||||
%let vtype = %str( );
|
||||
%end;
|
||||
%end;
|
||||
%else %put dataset &libds not opened! (rc=&dsid);
|
||||
%else %do;
|
||||
%put &sysmacroname: dataset &libds not opened! (rc=&dsid);
|
||||
%put &sysmacroname: %sysfunc(sysmsg());
|
||||
%return;
|
||||
%end;
|
||||
|
||||
/* Close dataset */
|
||||
%let rc = %sysfunc(close(&dsid));
|
||||
|
||||
@@ -2,12 +2,21 @@
|
||||
@file
|
||||
@brief Create a CARDS file from a SAS dataset.
|
||||
@details Uses dataset attributes to convert all data into datalines.
|
||||
Running the generated file will rebuild the original dataset.
|
||||
Running the generated file will rebuild the original dataset. Includes
|
||||
support for large decimals, binary data, PROCESSED_DTTM columns, and
|
||||
alternative encoding. If the input dataset is empty, the cards file will
|
||||
still be created.
|
||||
|
||||
Additional support to generate a random sample and max rows.
|
||||
|
||||
Usage:
|
||||
|
||||
%mp_ds2cards(base_ds=sashelp.class
|
||||
, tgt_ds=work.class
|
||||
, cards_file= "C:\temp\class.sas"
|
||||
, maxobs=5)
|
||||
, showlog=NO
|
||||
, maxobs=5
|
||||
)
|
||||
|
||||
TODO:
|
||||
- labelling the dataset
|
||||
@@ -18,15 +27,24 @@
|
||||
that is converted to a cards file.
|
||||
@param [in] tgt_ds= Table that the generated cards file would create.
|
||||
Optional - if omitted, will be same as BASE_DS.
|
||||
@param [out] cards_file= Location in which to write the (.sas) cards file
|
||||
@param [in] maxobs= to limit output to the first <code>maxobs</code>
|
||||
observations
|
||||
@param [in] showlog= whether to show generated cards file in the SAS log
|
||||
(YES/NO)
|
||||
@param [in] outencoding= provide encoding value for file statement (eg utf-8)
|
||||
@param [in] append= If NO then will rebuild the cards file if it already
|
||||
@param [out] cards_file= ("%sysfunc(pathname(work))/cardgen.sas") Location in
|
||||
which to write the (.sas) cards file
|
||||
@param [in] maxobs= (max) To limit output to the first <code>maxobs</code>
|
||||
observations, enter an integer here.
|
||||
@param [in] random_sample= (NO) Set to YES to generate a random sample of
|
||||
data. Can be quite slow.
|
||||
@param [in] showlog= (YES) Whether to show generated cards file in the SAS
|
||||
log. Valid values:
|
||||
@li YES
|
||||
@li NO
|
||||
@param [in] outencoding= Provide encoding value for file statement (eg utf-8)
|
||||
@param [in] append= (NO) If NO then will rebuild the cards file if it already
|
||||
exists, otherwise will append to it. Used by the mp_lib2cards.sas macro.
|
||||
|
||||
<h4> Related Macros </h4>
|
||||
@li mp_lib2cards.sas
|
||||
@li mp_ds2inserts.sas
|
||||
@li mp_mdtablewrite.sas
|
||||
|
||||
@version 9.2
|
||||
@author Allan Bowe
|
||||
@@ -51,15 +69,15 @@
|
||||
%if (&tgt_ds = ) %then %let tgt_ds=&base_ds;
|
||||
%if %index(&tgt_ds,.)=0 %then %let tgt_ds=WORK.%scan(&base_ds,2,.);
|
||||
%if ("&outencoding" ne "") %then %let outencoding=encoding="&outencoding";
|
||||
%if ("&append" = "") %then %let append=;
|
||||
%if ("&append" = "" or "&append" = "NO") %then %let append=;
|
||||
%else %let append=mod;
|
||||
|
||||
/* get varcount */
|
||||
%let nvars=0;
|
||||
proc sql noprint;
|
||||
select count(*) into: nvars from dictionary.columns
|
||||
where libname="%scan(%upcase(&base_ds),1)"
|
||||
and memname="%scan(%upcase(&base_ds),2)";
|
||||
where upcase(libname)="%scan(%upcase(&base_ds),1)"
|
||||
and upcase(memname)="%scan(%upcase(&base_ds),2)";
|
||||
%if &nvars=0 %then %do;
|
||||
%put %str(WARN)ING: Dataset &base_ds has no variables, will not be converted.;
|
||||
%return;
|
||||
@@ -115,8 +133,8 @@ proc sql
|
||||
reset outobs=max;
|
||||
create table datalines1 as
|
||||
select name,type,length,varnum,format,label from dictionary.columns
|
||||
where libname="%upcase(%scan(&base_ds,1))"
|
||||
and memname="%upcase(%scan(&base_ds,2))";
|
||||
where upcase(libname)="%upcase(%scan(&base_ds,1))"
|
||||
and upcase(memname)="%upcase(%scan(&base_ds,2))";
|
||||
|
||||
/**
|
||||
Due to long decimals cannot use best. format
|
||||
@@ -137,7 +155,18 @@ data datalines_2;
|
||||
,put(',name,',best32.-l)
|
||||
,substrn(put(',name,',bestd32.-l),1
|
||||
,findc(put(',name,',bestd32.-l),"0","TBK")))');
|
||||
else dataline=name;
|
||||
/**
|
||||
* binary data must be converted, to store in text format. It is identified
|
||||
* by the presence of the $HEX keyword in the format.
|
||||
*/
|
||||
else if upcase(format)=:'$HEX' then
|
||||
dataline=cats('put(trim(',name,'),',format,')');
|
||||
/**
|
||||
* There is no easy way to store line breaks in a cards file.
|
||||
* To discuss this, use: https://github.com/sasjs/core/issues/80
|
||||
* Removing all nonprintables with kw (keep writeable)
|
||||
*/
|
||||
else dataline=cats('compress(',name,', ,"kw")');
|
||||
run;
|
||||
|
||||
proc sql noprint;
|
||||
@@ -162,7 +191,8 @@ data _null_;
|
||||
|
||||
|
||||
/* Build input statement */
|
||||
if type='char' then type3=':$char.';
|
||||
if upcase(format)=:'$HEX' then type3=':'!!format;
|
||||
else if type='char' then type3=':$char.';
|
||||
str2=put(name,$33.)||type3;
|
||||
|
||||
|
||||
@@ -184,11 +214,12 @@ data _null_;
|
||||
file &cards_file. &outencoding lrecl=32767 termstr=nl &append;
|
||||
length __attrib $32767;
|
||||
if _n_=1 then do;
|
||||
put '/*******************************************************************';
|
||||
put " Datalines for %upcase(%scan(&base_ds,2)) dataset ";
|
||||
put " Generated by %nrstr(%%)mp_ds2cards()";
|
||||
put " Available on github.com/sasjs/core";
|
||||
put '********************************************************************/';
|
||||
put '/**';
|
||||
put ' @file';
|
||||
put " @brief Datalines for %upcase(%scan(&base_ds,2)) dataset";
|
||||
put " @details Generated by %nrstr(%%)mp_ds2cards()";
|
||||
put " Available on github.com/sasjs/core";
|
||||
put '**/';
|
||||
put "data &tgt_ds &indexes;";
|
||||
put "attrib ";
|
||||
%do i = 1 %to &nvars;
|
||||
@@ -212,11 +243,11 @@ data _null_;
|
||||
put 'run;';
|
||||
end;
|
||||
else do;
|
||||
put "infile cards dsd delimiter=',';";
|
||||
put "infile cards dsd;";
|
||||
put "input ";
|
||||
%do i = 1 %to &nvars.;
|
||||
%if(%length(&&input_stmt_&i..)) %then
|
||||
put " &&input_stmt_&i..";
|
||||
put " &&input_stmt_&i..";
|
||||
;
|
||||
%end;
|
||||
put ";";
|
||||
|
||||
@@ -39,21 +39,21 @@
|
||||
/* must use SQL as proc datasets does not support length changes */
|
||||
proc sql noprint;
|
||||
create table &outds as
|
||||
select a.TABLE_CATALOG as libref
|
||||
,a.TABLE_NAME
|
||||
select upcase(a.TABLE_CATALOG) as libref
|
||||
,upcase(a.TABLE_NAME) as TABLE_NAME
|
||||
,a.constraint_type
|
||||
,a.constraint_name
|
||||
,b.column_name
|
||||
from dictionary.TABLE_CONSTRAINTS a
|
||||
left join dictionary.constraint_column_usage b
|
||||
on a.TABLE_CATALOG=b.TABLE_CATALOG
|
||||
and a.TABLE_NAME=b.TABLE_NAME
|
||||
on upcase(a.TABLE_CATALOG)=upcase(b.TABLE_CATALOG)
|
||||
and upcase(a.TABLE_NAME)=upcase(b.TABLE_NAME)
|
||||
and a.constraint_name=b.constraint_name
|
||||
where a.TABLE_CATALOG="&lib"
|
||||
and b.TABLE_CATALOG="&lib"
|
||||
where upcase(a.TABLE_CATALOG)="&lib"
|
||||
and upcase(b.TABLE_CATALOG)="&lib"
|
||||
%if "&ds" ne "" %then %do;
|
||||
and a.TABLE_NAME="&ds"
|
||||
and b.TABLE_NAME="&ds"
|
||||
and upcase(a.TABLE_NAME)="&ds"
|
||||
and upcase(b.TABLE_NAME)="&ds"
|
||||
%end;
|
||||
;
|
||||
|
||||
|
||||
@@ -211,7 +211,7 @@ run;
|
||||
proc sql noprint;
|
||||
select sysvalue into: schemaactual
|
||||
from dictionary.libnames
|
||||
where libname="&libref" and engine='SQLSVR';
|
||||
where upcase(libname)="&libref" and engine='SQLSVR';
|
||||
%let schema=%sysfunc(coalescec(&schemaactual,&schema,&libref));
|
||||
|
||||
%do x=1 %to %sysfunc(countw(&dsnlist));
|
||||
@@ -304,7 +304,7 @@ run;
|
||||
proc sql noprint;
|
||||
select sysvalue into: schemaactual
|
||||
from dictionary.libnames
|
||||
where libname="&libref" and engine='POSTGRES';
|
||||
where upcase(libname)="&libref" and engine='POSTGRES';
|
||||
%let schema=%sysfunc(coalescec(&schemaactual,&schema,&libref));
|
||||
data _null_;
|
||||
file &fref mod;
|
||||
|
||||
1256
package-lock.json
generated
1256
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -33,6 +33,6 @@
|
||||
"prepare": "git rev-parse --git-dir && git config core.hooksPath ./.git-hooks || true"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@sasjs/cli": "^2.37.8"
|
||||
"@sasjs/cli": "^2.38.8"
|
||||
}
|
||||
}
|
||||
|
||||
60
tests/crossplatform/mp_ds2cards.test.sas
Normal file
60
tests/crossplatform/mp_ds2cards.test.sas
Normal file
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
@file
|
||||
@brief Testing mp_ds2cards.sas macro
|
||||
|
||||
<h4> SAS Macros </h4>
|
||||
@li mp_ds2cards.sas
|
||||
@li mp_assert.sas
|
||||
|
||||
**/
|
||||
|
||||
/**
|
||||
* test 1 - rebuild an existing dataset
|
||||
* Cars is a great dataset - it contains leading spaces, and formatted numerics
|
||||
*/
|
||||
|
||||
%mp_ds2cards(base_ds=sashelp.cars
|
||||
, tgt_ds=work.test
|
||||
, cards_file= "%sysfunc(pathname(work))/cars.sas"
|
||||
, showlog=NO
|
||||
)
|
||||
%inc "%sysfunc(pathname(work))/cars.sas"/source2;
|
||||
|
||||
proc compare base=sashelp.cars compare=work.test;
|
||||
quit;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo=1),
|
||||
desc=sashelp.cars is identical except for ds label,
|
||||
outds=work.test_results
|
||||
)
|
||||
|
||||
/**
|
||||
* test 2 - binary data compare
|
||||
*/
|
||||
data work.binarybase;
|
||||
format bin $hex500. z $hex.;
|
||||
do x=1 to 250;
|
||||
z=byte(x);
|
||||
bin=trim(bin)!!z;
|
||||
output;
|
||||
end;
|
||||
run;
|
||||
|
||||
%mp_ds2cards(base_ds=work.binarybase
|
||||
, showlog=YES
|
||||
, cards_file="%sysfunc(pathname(work))/c2.sas"
|
||||
, tgt_ds=work.binarycompare
|
||||
, append=
|
||||
)
|
||||
|
||||
%inc "%sysfunc(pathname(work))/c2.sas"/source2;
|
||||
|
||||
proc compare base=work.binarybase compare=work.binarycompare;
|
||||
run;
|
||||
|
||||
%mp_assert(
|
||||
iftrue=(&sysinfo=0),
|
||||
desc=work.binarybase dataset is identical,
|
||||
outds=work.test_results
|
||||
)
|
||||
Reference in New Issue
Block a user