1
0
mirror of https://github.com/sasjs/core.git synced 2025-12-12 15:04:36 +00:00

Compare commits

...

27 Commits

Author SHA1 Message Date
vrh
8d9b84037c fix: base_uri missing 2020-09-03 16:06:47 +02:00
vrh
029c1a29ed feat: xlsx support in mp_streamfile 2020-08-18 23:09:13 +02:00
vrh
c4dbd5971f docs: formatting 2020-08-08 15:26:02 +02:00
vrh
40ac3bba9a merge 2020-08-08 14:32:12 +02:00
vrh
21946e74f1 feat: mm_gettableid macro 2020-08-08 14:29:55 +02:00
Allan Bowe
6443e2d2ef Merge pull request #3 from sasjs/mp_rafal
Fix: Unique Indexes Added
2020-08-05 13:57:00 +02:00
rafgag
17f03b7507 Fix: previous changes restored 2020-08-05 13:48:16 +02:00
rafgag
c6a18a4168 Fix: Unique Indexes Added 2020-08-05 12:42:27 +02:00
vrh
dd18d1d5a8 fix: adding schema to pg output 2020-08-04 21:19:00 +02:00
vrh
fc8a39bbca fix: quoting reserved words 2020-08-04 18:45:00 +02:00
vrh
8beec7dc19 fix: quoting for instances of reserved words in pgsql 2020-08-04 18:13:22 +02:00
vrh
e3f6cb7b45 chore: editor config file 2020-08-04 14:45:54 +02:00
Allan Bowe
041aff9bc0 Merge pull request #2 from rafgag/mp_rafal
FEAT: adding Primary Key constraints
2020-08-04 12:00:28 +02:00
rafgag
1986732573 Update mp_getddl.sas 2020-08-04 12:00:05 +02:00
rafgag
958f509894 Update mp_getddl.sas 2020-08-04 11:34:19 +02:00
rafgag
1373957031 Update mp_getddl.sas 2020-08-04 11:30:12 +02:00
rafgag
8466acc7a7 Update mp_getddl.sas 2020-08-04 11:25:59 +02:00
rafgag
45e646565f FEAT: adding Primary Key constraints 2020-08-03 16:51:14 +02:00
Allan Bowe
9d9a72220f fix: syscc value (not length) assertion 2020-07-30 02:42:13 +02:00
Allan Bowe
53865a3909 feat: Postgres support for getddl macro 2020-07-29 12:32:54 +02:00
Allan Bowe
98a0d185ff fix: compatibility with compute sessions 2020-07-15 09:58:48 +02:00
Allan Bowe
888e07468c fix: pretty option always in proc json 2020-07-11 11:57:56 +02:00
Allan Bowe
f491fa3ef5 fix: file based upload with sasjs_tables for testing 2020-07-11 11:18:17 +02:00
Allan Bowe
6b1ea7323c fix: updating ref to main (not master) 2020-07-09 09:38:29 +02:00
Krishna Acondy
5f1eaefa11 Merge pull request #1 from sasjs/ci-update
fix(ci): update default branch to main
2020-07-09 08:21:59 +01:00
Krishna Acondy
77aec4a9da fix(ci): update default branch to main 2020-07-09 08:20:27 +01:00
Allan Bowe
a9e9f28e05 docs: revamp with new repo location 2020-07-07 23:09:33 +02:00
51 changed files with 747 additions and 289 deletions

12
.editorconfig Normal file
View File

@@ -0,0 +1,12 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = false
trim_trailing_whitespace = true

View File

@@ -6,7 +6,7 @@ name: SASjs Core Publish
on: on:
push: push:
branches: branches:
- master - main
jobs: jobs:
release: release:

1
.gitignore vendored
View File

@@ -1 +1,2 @@
node_modules node_modules
.DS_Store

View File

@@ -1,11 +1,11 @@
# Macro Core # Macro Core
Much quality. Many standards. The **Macro Core** library exists to save time and development effort! Herein ye shall find a veritable host of MIT-licenced, production quality SAS macros. These are a mix of tools, utilities, functions and code generators that are useful in the context of Application Development on the SAS platform (eg https://datacontroller.io). [Contributions](https://github.com/sasjs/core/blob/master/CONTRIBUTING.md) are welcomed. Much quality. Many standards. The **Macro Core** library exists to save time and development effort! Herein ye shall find a veritable host of MIT-licenced, production quality SAS macros. These are a mix of tools, utilities, functions and code generators that are useful in the context of Application Development on the SAS platform (eg https://datacontroller.io). [Contributions](https://github.com/sasjs/core/blob/main/CONTRIBUTING.md) are welcomed.
You can download and compile them all in just two lines of SAS code: You can download and compile them all in just two lines of SAS code:
```sas ```sas
filename mc url "https://raw.githubusercontent.com/sasjs/core/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
``` ```
@@ -54,7 +54,7 @@ The above can be done directly in your sas program, via an autoexec, or an initi
Alternatively - for quick access - simply run the following! This file contains all the macros. Alternatively - for quick access - simply run the following! This file contains all the macros.
```sas ```sas
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
``` ```

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
/** /**
@file mf_getplatform @file mf_getplatform.sas
@brief Returns platform specific variables @brief Returns platform specific variables
@details Enables platform specific variables to be returned @details Enables platform specific variables to be returned

View File

@@ -7,7 +7,7 @@
Usage: Usage:
%* compile macros ; %* compile macros ;
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%* write some code; %* write some code;

View File

@@ -179,7 +179,7 @@ data _null_;
put '/*******************************************************************'; put '/*******************************************************************';
put " Datalines for %upcase(%scan(&base_ds,2)) dataset "; put " Datalines for %upcase(%scan(&base_ds,2)) dataset ";
put " Generated by %nrstr(%%)mp_ds2cards()"; put " Generated by %nrstr(%%)mp_ds2cards()";
put " Available on github.com/macropeople/macrocore"; put " Available on github.com/sasjs/core";
put '********************************************************************/'; put '********************************************************************/';
put "data &tgt_ds &indexes;"; put "data &tgt_ds &indexes;";
put "attrib "; put "attrib ";

View File

@@ -13,11 +13,13 @@
label x='blah'; label x='blah';
run; run;
proc sql; describe table &syslast; proc sql; describe table &syslast;
%mp_getddl(work,test,flavour=tsql,showlog=YES) %mp_getddl(work,test,flavour=tsql,showlog=YES)
<h4> Dependencies </h4>
@li mp_getconstraints.sas
@param lib libref of the library to create DDL for. Should be assigned. @param lib libref of the library to create DDL for. Should be assigned.
@param ds dataset to create ddl for @param ds dataset to create ddl for (optional)
@param fref= the fileref to which to write the DDL. If not preassigned, will @param fref= the fileref to which to write the DDL. If not preassigned, will
be assigned to TEMP. be assigned to TEMP.
@param flavour= The type of DDL to create (default=SAS). Supported=TSQL @param flavour= The type of DDL to create (default=SAS). Supported=TSQL
@@ -26,11 +28,9 @@
,else libref) ,else libref)
@param applydttm= for non SAS DDL, choose if columns are created with native @param applydttm= for non SAS DDL, choose if columns are created with native
datetime2 format or regular decimal type datetime2 format or regular decimal type
@version 9.3 @version 9.3
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/
%macro mp_getddl(libref,ds,fref=getddl,flavour=SAS,showlog=NO,schema= %macro mp_getddl(libref,ds,fref=getddl,flavour=SAS,showlog=NO,schema=
@@ -54,6 +54,21 @@ create table _data_ as
; ;
%local tabinfo; %let tabinfo=&syslast; %local tabinfo; %let tabinfo=&syslast;
create table _data_ as
select * from dictionary.columns
where upcase(libname)="%upcase(&libref)"
%if %length(&ds)>0 %then %do;
and upcase(memname)="%upcase(&ds)"
%end;
;
%local colinfo; %let colinfo=&syslast;
%local dsnlist;
select distinct upcase(memname) into: dsnlist
separated by ' '
from &syslast
;
create table _data_ as create table _data_ as
select * from dictionary.indexes select * from dictionary.indexes
where upcase(libname)="%upcase(&libref)" where upcase(libname)="%upcase(&libref)"
@@ -64,18 +79,43 @@ create table _data_ as
; ;
%local idxinfo; %let idxinfo=&syslast; %local idxinfo; %let idxinfo=&syslast;
create table _data_ as /* Extract all Primary Key and Unique data constraints */
select * from dictionary.columns %mp_getconstraints(lib=%upcase(&libref),ds=%upcase(&ds),outds=_data_)
where upcase(libname)="%upcase(&libref)" %local colconst; %let colconst=&syslast;
%if %length(&ds)>0 %then %do;
and upcase(memname)="%upcase(&ds)" %macro addConst();
%end; %global constraints_used;
; data _null_;
%local colinfo; %let colinfo=&syslast; length ctype $11 constraint_name_orig $256 constraints_used $5000;
%local dsnlist; set &colconst (where=(table_name="&curds" and constraint_type in ('PRIMARY','UNIQUE'))) end=last;
select distinct upcase(memname) into: dsnlist file &fref mod;
separated by ' ' by constraint_type constraint_name;
from &syslast; retain constraints_used;
constraint_name_orig=constraint_name;
if upcase(strip(constraint_type)) = 'PRIMARY' then ctype='PRIMARY KEY';
else ctype=strip(constraint_type);
%if &flavour=TSQL %then %do;
column_name=catt('[',column_name,']');
constraint_name=catt('[',constraint_name,']');
%end;
%else %if &flavour=PGSQL %then %do;
column_name=catt('"',column_name,'"');
constraint_name=catt('"',constraint_name,'"');
%end;
if first.constraint_name then do;
constraints_used = catx(' ', constraints_used, constraint_name_orig);
put " ,CONSTRAINT " constraint_name ctype "(" ;
put ' ' column_name;
end;
else put ' ,' column_name;
if last.constraint_name then do;
put " )";
call symput('constraints_used',strip(constraints_used));
end;
run;
%put &=constraints_used;
%mend;
data _null_; data _null_;
file &fref; file &fref;
put "/* DDL generated by &sysuserid on %sysfunc(datetime(),datetime19.) */"; put "/* DDL generated by &sysuserid on %sysfunc(datetime(),datetime19.) */";
@@ -84,7 +124,8 @@ run;
%local x curds; %local x curds;
%if &flavour=SAS %then %do; %if &flavour=SAS %then %do;
data _null_; data _null_;
file &fref; file &fref mod;
put "/* SAS Flavour DDL for %upcase(&libref).&curds */";
put "proc sql;"; put "proc sql;";
run; run;
%do x=1 %to %sysfunc(countw(&dsnlist)); %do x=1 %to %sysfunc(countw(&dsnlist));
@@ -109,23 +150,34 @@ run;
lab=" label="!!quote(trim(label)); lab=" label="!!quote(trim(label));
if notnull='yes' then notnul=' not null'; if notnull='yes' then notnul=' not null';
put name type len fmt notnul lab; put name type len fmt notnul lab;
if last then put ');';
run; run;
/* Extra step for data constraints */
%addConst()
data _null_; data _null_;
length ds $128; file &fref mod;
set &idxinfo (where=(memname="&curds")) end=last; put ');';
run;
/* Create Unique Indexes, but only if they were not already defined within the Constraints section. */
data _null_;
*length ds $128;
set &idxinfo (where=(memname="&curds" and unique='yes' and indxname not in (%sysfunc(tranwrd("&constraints_used",%str( ),%str(","))))));
file &fref mod; file &fref mod;
by idxusage indxname; by idxusage indxname;
if unique='yes' then uniq=' unique'; /* ds=cats(libname,'.',memname); */
ds=cats(libname,'.',memname);
if first.indxname then do; if first.indxname then do;
put 'create ' uniq ' index ' indxname; put 'CREATE UNIQUE INDEX ' indxname "ON &libref..&curds (" ;
put ' on ' ds '(' name @@; put ' ' name ;
end;
else put ' ,' name ;
*else put ' ,' name ;
if last.indxname then do;
put ');';
end; end;
else put ',' name @@;
if last.indxname then put ');';
run; run;
/* /*
ods output IntegrityConstraints=ic; ods output IntegrityConstraints=ic;
proc contents data=testali out2=info; proc contents data=testali out2=info;
@@ -146,7 +198,7 @@ run;
%let curds=%scan(&dsnlist,&x); %let curds=%scan(&dsnlist,&x);
data _null_; data _null_;
file &fref mod; file &fref mod;
put "/* DDL for &schema..&curds */"; put "/* TSQL Flavour DDL for &schema..&curds */";
data _null_; data _null_;
file &fref mod; file &fref mod;
set &colinfo (where=(upcase(memname)="&curds")) end=last; set &colinfo (where=(upcase(memname)="&curds")) end=last;
@@ -169,31 +221,30 @@ run;
else if length le 8000 then fmt='[varchar]('!!cats(length)!!')'; else if length le 8000 then fmt='[varchar]('!!cats(length)!!')';
else fmt=cats('[varchar](max)'); else fmt=cats('[varchar](max)');
if notnull='yes' then notnul=' NOT NULL'; if notnull='yes' then notnul=' NOT NULL';
put name fmt notnul; put "[" name +(-1) "]" fmt notnul;
run; run;
/* Extra step for data constraints */
%addConst()
/* Create Unique Indexes, but only if they were not already defined within the Constraints section. */
data _null_; data _null_;
length ds $128; *length ds $128;
set &idxinfo (where=(memname="&curds")); set &idxinfo (where=(memname="&curds" and unique='yes' and indxname not in (%sysfunc(tranwrd("&constraints_used",%str( ),%str(","))))));
file &fref mod; file &fref mod;
by idxusage indxname; by idxusage indxname;
if unique='yes' then uniq=' unique'; *ds=cats(libname,'.',memname);
ds=cats(libname,'.',memname);
if first.indxname then do; if first.indxname then do;
if unique='yes' and nomiss='yes' then do; /* add nonclustered in case of multiple unique indexes */
put ' ,constraint [' indxname '] PRIMARY KEY'; put ' ,index [' indxname +(-1) '] UNIQUE NONCLUSTERED (';
end; put ' [' name +(-1) ']';
else if unique='yes' then do;
/* add nonclustered in case of multiple unique indexes */
put ' ,index [' indxname '] UNIQUE NONCLUSTERED';
end;
put ' (';
put ' [' name ']';
end; end;
else put ' ,[' name ']'; else put ' ,[' name +(-1) ']';
if last.indxname then do; if last.indxname then do;
put ' )'; put ' )';
end; end;
run; run;
data _null_; data _null_;
file &fref mod; file &fref mod;
put ')'; put ')';
@@ -217,7 +268,77 @@ run;
run; run;
%end; %end;
%end; %end;
%else %if &flavour=PGSQL %then %do;
/* if schema does not exist, set to be same as libref */
%local schemaactual;
proc sql noprint;
select sysvalue into: schemaactual
from dictionary.libnames
where libname="&libref" and engine='POSTGRES';
%let schema=%sysfunc(coalescec(&schemaactual,&schema,&libref));
data _null_;
file &fref mod;
put "CREATE SCHEMA &schema;";
%do x=1 %to %sysfunc(countw(&dsnlist));
%let curds=%scan(&dsnlist,&x);
data _null_;
file &fref mod;
put "/* Postgres Flavour DDL for &schema..&curds */";
data _null_;
file &fref mod;
set &colinfo (where=(upcase(memname)="&curds")) end=last;
length fmt $32;
if _n_=1 then do;
if memtype='DATA' then do;
put "CREATE TABLE &schema..&curds (";
end;
else do;
put "CREATE VIEW &schema..&curds (";
end;
put " "@@;
end;
else put " ,"@@;
format=upcase(format);
if 1=0 then; /* dummy if */
%if &applydttm=YES %then %do;
else if format=:'DATETIME' then fmt=' TIMESTAMP ';
%end;
else if type='num' then fmt=' DOUBLE PRECISION';
else fmt='VARCHAR('!!cats(length)!!')';
if notnull='yes' then notnul=' NOT NULL';
/* quote column names in case they represent reserved words */
name2=quote(trim(name));
put name2 fmt notnul;
run;
/* Extra step for data constraints */
%addConst()
data _null_;
file &fref mod;
put ');';
run;
/* Create Unique Indexes, but only if they were not already defined within the Constraints section. */
data _null_;
*length ds $128;
set &idxinfo (where=(memname="&curds" and unique='yes' and indxname not in (%sysfunc(tranwrd("&constraints_used",%str( ),%str(","))))));
file &fref mod;
by idxusage indxname;
/* ds=cats(libname,'.',memname); */
if first.indxname then do;
put 'CREATE UNIQUE INDEX "' indxname +(-1) '" ' "ON &schema..&curds (" ;
put ' "' name +(-1) '"' ;
end;
else put ' ,"' name +(-1) '"';
*else put ' ,' name ;
if last.indxname then do;
put ');';
end;
run;
%end;
%end;
%if &showlog=YES %then %do; %if &showlog=YES %then %do;
options ps=max; options ps=max;
data _null_; data _null_;
@@ -227,4 +348,4 @@ run;
run; run;
%end; %end;
%mend; %mend;

View File

@@ -11,7 +11,7 @@
Usage: Usage:
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%mp_guesspk(sashelp.class,outds=classpks) %mp_guesspk(sashelp.class,outds=classpks)

View File

@@ -22,7 +22,8 @@
run; run;
If you are building web apps with SAS then you are strongly encouraged to use If you are building web apps with SAS then you are strongly encouraged to use
the mX_createwebservice macros in combination with [sasjs](https://github.com/macropeople/sasjs). the mX_createwebservice macros in combination with the
[sasjs adapter](https://github.com/sasjs/adapter).
For more information see https://sasjs.io For more information see https://sasjs.io
@param action Valid values: @param action Valid values:
@@ -39,11 +40,13 @@
* PROCJSON (default) * PROCJSON (default)
* DATASTEP * DATASTEP
@param dbg= Typically used with an _debug (numeric) option @param dbg= DEPRECATED - was used to conditionally add PRETTY to
proc json but this can cause line truncation in large files.
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/
@@ -65,9 +68,8 @@
proc sql;drop table &tempds; proc sql;drop table &tempds;
data &tempds /view=&tempds;set &ds; data &tempds /view=&tempds;set &ds;
%if &fmt=N %then format _numeric_ best32.;; %if &fmt=N %then format _numeric_ best32.;;
proc json out=&jref proc json out=&jref pretty
%if &action=ARR %then nokeys ; %if &action=ARR %then nokeys ;
%if &dbg ge 131 %then pretty ;
;export &tempds / nosastags fmtnumeric; ;export &tempds / nosastags fmtnumeric;
run; run;
proc sql;drop view &tempds; proc sql;drop view &tempds;

View File

@@ -16,7 +16,7 @@
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/

View File

@@ -37,7 +37,7 @@
@version 9.3 @version 9.3
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/

View File

@@ -17,7 +17,7 @@
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/

View File

@@ -28,7 +28,7 @@
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/

View File

@@ -6,7 +6,7 @@
Usage: Usage:
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%mp_streamfile(contenttype=csv,inloc=/some/where.txt,outname=myfile.txt) %mp_streamfile(contenttype=csv,inloc=/some/where.txt,outname=myfile.txt)
@@ -20,7 +20,7 @@
@param outname= the name of the file, as downloaded by the browser @param outname= the name of the file, as downloaded by the browser
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/
@@ -47,6 +47,7 @@
%end; %end;
%end; %end;
%else %if &contentype=EXCEL %then %do; %else %if &contentype=EXCEL %then %do;
/* suitable for XLS format */
%if &platform=SASMETA %then %do; %if &platform=SASMETA %then %do;
data _null_; data _null_;
rc=stpsrv_header('Content-type','application/vnd.ms-excel'); rc=stpsrv_header('Content-type','application/vnd.ms-excel');
@@ -59,6 +60,19 @@
contentdisp="attachment; filename=&outname"; contentdisp="attachment; filename=&outname";
%end; %end;
%end; %end;
%else %if &contentype=XLSX %then %do;
%if &platform=SASMETA %then %do;
data _null_;
rc=stpsrv_header('Content-type','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
rc=stpsrv_header('Content-disposition',"attachment; filename=&outname");
run;
%end;
%else %if &platform=SASVIYA %then %do;
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" name='_webout.xls'
contenttype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
contentdisp="attachment; filename=&outname";
%end;
%end;
%else %if &contentype=TEXT %then %do; %else %if &contentype=TEXT %then %do;
%if &platform=SASMETA %then %do; %if &platform=SASMETA %then %do;
data _null_; data _null_;

View File

@@ -7,7 +7,7 @@
Usage: Usage:
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%mp_unzip(ziploc="/some/file.zip",outdir=/some/folder) %mp_unzip(ziploc="/some/file.zip",outdir=/some/folder)
@@ -21,7 +21,7 @@
@version 9.4 @version 9.4
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/

View File

@@ -23,7 +23,7 @@
@version 9.2 @version 9.2
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/

View File

@@ -69,17 +69,17 @@ header="""
'included' in SAS with just 2 lines of code: 'included' in SAS with just 2 lines of code:
filename mc url filename mc url
"https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
The `build.py` file in the https://github.com/macropeople/macrocore repo The `build.py` file in the https://github.com/sasjs/core repo
is used to create this file. is used to create this file.
@author Allan Bowe @author Allan Bowe
**/ **/
options noquotelenmax; options noquotelenmax;
""" """
f = open('mc_all.sas', "w") # r / r+ / rb / rb+ / w / wb f = open('all.sas', "w") # r / r+ / rb / rb+ / w / wb
f.write(header) f.write(header)
folders=['base','meta','metax','viya','lua'] folders=['base','meta','metax','viya','lua']
for folder in folders: for folder in folders:

View File

@@ -28,13 +28,13 @@ echo "INPUT+=main.dox" >> $BUILD_FOLDER/Doxyfile
doxygen Doxyfile doxygen Doxyfile
# refresh github pages site # refresh github pages site
git clone git@github.com:macropeople/macrocore.github.io.git git clone git@github.com:sasjs/core.github.io.git
cd macrocore.github.io cd core.github.io
git rm -r * rm -r *
mv $BUILD_FOLDER/out/doxy/* . mv $BUILD_FOLDER/out/doxy/* .
echo 'core.sasjs.io' > CNAME echo 'core.sasjs.io' > CNAME
git add * git add *
git commit -m "build.sh build on $(date +%F:%H:%M:%S)" git commit -m "build.sh build on $(date +%F:%H:%M:%S)"
git push git push
echo "check it out: https://macropeople.github.io/macrocore.github.io/files.html" echo "check it out: https://sasjs.github.io/core.github.io/files.html"

View File

@@ -2,7 +2,7 @@
<li class="footer"><b>$generatedby</b> <li class="footer"><b>$generatedby</b>
<a href="http://www.doxygen.org/index.html"> <a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> <img class="footer" src="doxygen.png" alt="doxygen"/></a>
<i> For more information visit the </i> <a href="https://github.com/macropeople/macrocore">macropeople MacroCore library</a>.</li> <i> For more information visit the </i> <a href="https://github.com/sasjs/core">Macro Core library</a>.</li>
</ul> </ul>
</div> </div>
@@ -10,7 +10,7 @@
<!--BEGIN !GENERATE_TREEVIEW--> <!--BEGIN !GENERATE_TREEVIEW-->
<hr class="footer"/> <hr class="footer"/>
<table width="100%"><tbody><tr><td> <table width="100%"><tbody><tr><td>
For more information visit the <a href="https://github.com/macropeople/macrocore">macropeople MacroCore library</a>. For more information visit the <a href="https://github.com/sasjs/core">Macro Core library</a>.
</td><td><address class="footer"><small> </td><td><address class="footer"><small>
&copy;$year<br/> &copy;$year<br/>
$generatedby <a href="http://www.doxygen.org/index.html"> $generatedby <a href="http://www.doxygen.org/index.html">

View File

@@ -45,8 +45,8 @@ $extrastylesheet
<td> <td>
<table style="padding-left: 2em;" cellspacing="0" cellpadding="0"> <table style="padding-left: 2em;" cellspacing="0" cellpadding="0">
<tr><td> Production Ready Macros for SAS Application Developers</td></tr> <tr><td> Production Ready Macros for SAS Application Developers</td></tr>
<tr><td><a href="https://github.com/macropeople/macrocore"> <tr><td><a href="https://github.com/sasjs/core">
https://github.com/macropeople/macrocore https://github.com/sasjs/core
</a></td></tr> </a></td></tr>
</table> </table>
</td> </td>

View File

@@ -1,6 +1,6 @@
/** \dir . /** \dir .
* \brief Open Source Macro Library for Developers of the SAS Language. See: https://github.com/macropeople/macrocore * \brief Open Source Macro Library for Developers of the SAS Language. See: https://github.com/sasjs/core
* \details To use - add the subfolders to your `SASAUTOS` call path. * \details To use - add the subfolders to your `SASAUTOS` call path.
*/ */

View File

@@ -13,10 +13,10 @@ cat > $OUTFILE <<'EOL'
'included' in SAS with just 2 lines of code: 'included' in SAS with just 2 lines of code:
filename mc url filename mc url
"https://raw.githubusercontent.com/macropeople/macrocore/master/macrocore.sas"; "https://raw.githubusercontent.com/sasjs/core/main/macrocore.sas";
%inc mc; %inc mc;
The `build.sh` file in the https://github.com/macropeople/macrocore repo The `build.sh` file in the https://github.com/sasjs/core repo
is used to create this file. is used to create this file.
@author Allan Bowe @author Allan Bowe

View File

@@ -1,17 +1,18 @@
/** /**
@file @file mm_adduser2group.sas
@brief Adds a user to a group @brief Adds a user to a group
@details Adds a user to a metadata group. The macro first checks whether the @details Adds a user to a metadata group. The macro first checks whether the
user is in that group, and if not, the user is added. user is in that group, and if not, the user is added.
Usage: Usage:
%mm_adduser2group(user=sasdemo %mm_adduser2group(user=sasdemo
,group=someGroup) ,group=someGroup)
@param user= the user name (not displayname) @param user= the user name (not displayname)
@param group= the group to which to add the user @param group= the group to which to add the user
@param mdebug= set to 1 to show debug info in log
@warning the macro does not check inherited group memberships - it looks at @warning the macro does not check inherited group memberships - it looks at
direct members only direct members only
@@ -68,7 +69,7 @@ run;
%return; %return;
%end; %end;
%if %length(&syscc) ge 4 %then %do; %if &syscc ge 4 %then %do;
%put WARNING: SYSCC=&syscc, exiting &sysmacroname; %put WARNING: SYSCC=&syscc, exiting &sysmacroname;
%return; %return;
%end; %end;

View File

@@ -1,12 +1,12 @@
/** /**
@file mm_createwebservice.sas @file mm_createwebservice.sas
@brief Create a Web Ready Stored Process @brief Create a Web Ready Stored Process
@details This macro creates a Type 2 Stored Process with the macropeople @details This macro creates a Type 2 Stored Process with the mm_webout macro
mm_webout macro included as pre-code. included as pre-code.
Usage: Usage:
%* compile macros ; %* compile macros ;
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%* parmcards lets us write to a text file from open code ; %* parmcards lets us write to a text file from open code ;
@@ -104,9 +104,8 @@ data _null_;
put ' proc sql;drop table &tempds; '; put ' proc sql;drop table &tempds; ';
put ' data &tempds /view=&tempds;set &ds; '; put ' data &tempds /view=&tempds;set &ds; ';
put ' %if &fmt=N %then format _numeric_ best32.;; '; put ' %if &fmt=N %then format _numeric_ best32.;; ';
put ' proc json out=&jref '; put ' proc json out=&jref pretty ';
put ' %if &action=ARR %then nokeys ; '; put ' %if &action=ARR %then nokeys ; ';
put ' %if &dbg ge 131 %then pretty ; ';
put ' ;export &tempds / nosastags fmtnumeric; '; put ' ;export &tempds / nosastags fmtnumeric; ';
put ' run; '; put ' run; ';
put ' proc sql;drop view &tempds; '; put ' proc sql;drop view &tempds; ';
@@ -201,7 +200,8 @@ data _null_;
put '%end; '; put '%end; ';
put '%mend; '; put '%mend; ';
put '%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y); '; put '%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y); ';
put '%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug; '; put '%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug ';
put ' sasjs_tables; ';
put '%local i tempds; '; put '%local i tempds; ';
put ' '; put ' ';
put '%if &action=FETCH %then %do; '; put '%if &action=FETCH %then %do; ';
@@ -228,6 +228,7 @@ data _null_;
put ' if _n_<20 then putlog _infile_; '; put ' if _n_<20 then putlog _infile_; ';
put ' %end; '; put ' %end; ';
put ' run; '; put ' run; ';
put ' %let sasjs_tables=&sasjs_tables &&_webin_name&i; ';
put ' %end; '; put ' %end; ';
put '%end; '; put '%end; ';
put ' '; put ' ';

67
meta/mm_gettableid.sas Normal file
View File

@@ -0,0 +1,67 @@
/**
@file mm_gettableid.sas
@brief Get the metadata id for a particular table
@details Provide a libref and table name to return the corresponding metadata id
in an output datataset.
Usage:
- get a table id
%mm_gettableid(libref=METALIB,ds=SOMETABLE,outds=iwant)
@param libref= The libref to search
@param ds= The input dataset to check
@param outds= the dataset to create that contains the `tableuri`
@param mDebug= set to 1 to show debug messages in the log
@returns outds dataset containing `tableuri` and `tablename`
@version 9.3
@author Allan Bowe
**/
%macro mm_gettableid(
libref=
,ds=
,outds=work.mm_gettableid
,mDebug=0
)/*/STORE SOURCE*/;
%local mD;
%if &mDebug=1 %then %let mD=;
%else %let mD=%str(*);
%&mD.put Executing &sysmacroname..sas;
%&mD.put _local_;
data &outds;
length uri usingpkguri id type tableuri tablename tmpuri $256;
call missing(of _all_);
keep tableuri tablename;
n=1;
rc=0;
if metadata_getnobj("omsobj:SASLibrary?@Libref='&libref'",n,uri)<1 then do;
put "Library &libref not found";
stop;
end;
&mD.putlog "uri is " uri;
if metadata_getnasn(uri, "UsingPackages", 1, usingpkguri)>0 then do;
rc=metadata_resolve(usingpkguri,type,id);
&mD.putlog "Type is " type;
end;
if type='DatabaseSchema' then tmpuri=usingpkguri;
else tmpuri=uri;
t=1;
do while(metadata_getnasn(tmpuri, "Tables", t, tableuri)>0);
t+1;
rc= metadata_getattr(tableuri, "Name", tablename);
&mD.putlog "Table is " tablename;
if upcase(tablename)="%upcase(&ds)" then do;
output;
end;
end;
run;
%mend;

View File

@@ -1,13 +1,14 @@
/** /**
@file @file
@brief Retrieves properties of the SAS web app server @brief Retrieves properties of the SAS web app server
@description usage: @details
Usage:
%mm_getwebappsrvprops(outds= some_ds) %mm_getwebappsrvprops(outds= some_ds)
data _null_; data _null_;
set some_ds(where=(name='webappsrv.server.url')); set some_ds(where=(name='webappsrv.server.url'));
put value=; put value=;
run; run;
@param outds the dataset to create that contains the list of properties @param outds the dataset to create that contains the list of properties
@@ -21,7 +22,7 @@
@version 9.4 @version 9.4
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/

View File

@@ -12,7 +12,7 @@
Usage: Usage:
%* import the macros (or make them available some other way); %* import the macros (or make them available some other way);
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%* create sample text file as input to the macro; %* create sample text file as input to the macro;

View File

@@ -15,7 +15,7 @@
Usage: Usage:
%* load macros; %* load macros;
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%* export everything; %* export everything;

View File

@@ -33,7 +33,8 @@
**/ **/
%macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y); %macro mm_webout(action,ds,dslabel=,fref=_webout,fmt=Y);
%global _webin_file_count _webin_fileref1 _webin_name1 _program _debug; %global _webin_file_count _webin_fileref1 _webin_name1 _program _debug
sasjs_tables;
%local i tempds; %local i tempds;
%if &action=FETCH %then %do; %if &action=FETCH %then %do;
@@ -60,6 +61,7 @@
if _n_<20 then putlog _infile_; if _n_<20 then putlog _infile_;
%end; %end;
run; run;
%let sasjs_tables=&sasjs_tables &&_webin_name&i;
%end; %end;
%end; %end;

View File

@@ -8,7 +8,7 @@
Usage: Usage:
%* import the macros (or make them available some other way); %* import the macros (or make them available some other way);
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%* create sample text file as input to the macro; %* create sample text file as input to the macro;

View File

@@ -12,6 +12,9 @@
"type": "git", "type": "git",
"url": "https://github.com/sasjs/core" "url": "https://github.com/sasjs/core"
}, },
"release": {
"branches": ["main"]
},
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"
}, },

View File

@@ -16,7 +16,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas
@@ -96,7 +96,7 @@ options noquotelenmax;
data _null_; data _null_;
set &libref1..links; set &libref1..links;
if rel='createChild' then if rel='createChild' then
call symputx('href',quote(trim(href)),'l'); call symputx('href',quote("&base_uri"!!trim(href)),'l');
run; run;
%end; %end;
%else %if &SYS_PROCHTTP_STATUS_CODE=404 %then %do; %else %if &SYS_PROCHTTP_STATUS_CODE=404 %then %do;

View File

@@ -4,7 +4,7 @@
@details Code is passed in as one or more filerefs. @details Code is passed in as one or more filerefs.
%* Step 1 - compile macros ; %* Step 1 - compile macros ;
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%* Step 2 - Create some code and add it to a web service; %* Step 2 - Create some code and add it to a web service;
@@ -55,7 +55,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
**/ **/
@@ -241,9 +241,8 @@ data _null_;
put ' proc sql;drop table &tempds; '; put ' proc sql;drop table &tempds; ';
put ' data &tempds /view=&tempds;set &ds; '; put ' data &tempds /view=&tempds;set &ds; ';
put ' %if &fmt=N %then format _numeric_ best32.;; '; put ' %if &fmt=N %then format _numeric_ best32.;; ';
put ' proc json out=&jref '; put ' proc json out=&jref pretty ';
put ' %if &action=ARR %then nokeys ; '; put ' %if &action=ARR %then nokeys ; ';
put ' %if &dbg ge 131 %then pretty ; ';
put ' ;export &tempds / nosastags fmtnumeric; '; put ' ;export &tempds / nosastags fmtnumeric; ';
put ' run; '; put ' run; ';
put ' proc sql;drop view &tempds; '; put ' proc sql;drop view &tempds; ';
@@ -338,7 +337,8 @@ data _null_;
put '%end; '; put '%end; ';
put '%mend; '; put '%mend; ';
put '%macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y); '; put '%macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y); ';
put '%global _webin_file_count _webin_fileuri _debug _omittextlog ; '; put '%global _webin_file_count _webin_fileuri _debug _omittextlog _webin_name ';
put ' sasjs_tables SYS_JES_JOB_URI; ';
put '%if %index("&_debug",log) %then %let _debug=131; '; put '%if %index("&_debug",log) %then %let _debug=131; ';
put ' '; put ' ';
put '%local i tempds; '; put '%local i tempds; ';
@@ -352,11 +352,11 @@ data _null_;
put ' %if not %symexist(_webin_fileuri1) %then %do; '; put ' %if not %symexist(_webin_fileuri1) %then %do; ';
put ' %let _webin_file_count=%eval(&_webin_file_count+0); '; put ' %let _webin_file_count=%eval(&_webin_file_count+0); ';
put ' %let _webin_fileuri1=&_webin_fileuri; '; put ' %let _webin_fileuri1=&_webin_fileuri; ';
put ' %let _webin_name1=&_webin_name; ';
put ' %end; '; put ' %end; ';
put ' '; put ' ';
put ' %if %symexist(sasjs_tables) %then %do; '; put ' /* if the sasjs_tables param is passed, we expect param based upload */ ';
put ' /* small volumes of non-special data are sent as params for responsiveness */ '; put ' %if %length(&sasjs_tables.XX)>2 %then %do; ';
put ' /* to do - deal with escaped values */ ';
put ' filename _sasjs "%sysfunc(pathname(work))/sasjs.lua"; '; put ' filename _sasjs "%sysfunc(pathname(work))/sasjs.lua"; ';
put ' data _null_; '; put ' data _null_; ';
put ' file _sasjs; '; put ' file _sasjs; ';
@@ -435,13 +435,19 @@ data _null_;
put ' infile indata firstobs=2 dsd termstr=crlf ; '; put ' infile indata firstobs=2 dsd termstr=crlf ; ';
put ' input &input_statement; '; put ' input &input_statement; ';
put ' run; '; put ' run; ';
put ' %let sasjs_tables=&sasjs_tables &&_webin_name&i; ';
put ' %end; '; put ' %end; ';
put '%end; '; put '%end; ';
put '%else %if &action=OPEN %then %do; '; put '%else %if &action=OPEN %then %do; ';
put ' /* setup webout */ '; put ' /* setup webout */ ';
put ' OPTIONS NOBOMFILE; '; put ' OPTIONS NOBOMFILE; ';
put ' filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" '; put ' %if "X&SYS_JES_JOB_URI.X"="XX" %then %do; ';
put ' name="_webout.json" lrecl=999999 mod; '; put ' filename _webout temp lrecl=999999 mod; ';
put ' %end; ';
put ' %else %do; ';
put ' filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" ';
put ' name="_webout.json" lrecl=999999 mod; ';
put ' %end; ';
put ' '; put ' ';
put ' /* setup temp ref */ '; put ' /* setup temp ref */ ';
put ' %if %upcase(&fref) ne _WEBOUT %then %do; '; put ' %if %upcase(&fref) ne _WEBOUT %then %do; ';
@@ -471,13 +477,13 @@ data _null_;
put ' i+1; '; put ' i+1; ';
put ' call symputx(''wt''!!left(i),name); '; put ' call symputx(''wt''!!left(i),name); ';
put ' call symputx(''wtcnt'',i); '; put ' call symputx(''wtcnt'',i); ';
put ' data _null_; file &fref; put ",""WORK"":{"; '; put ' data _null_; file &fref mod; put ",""WORK"":{"; ';
put ' %do i=1 %to &wtcnt; '; put ' %do i=1 %to &wtcnt; ';
put ' %let wt=&&wt&i; '; put ' %let wt=&&wt&i; ';
put ' proc contents noprint data=&wt '; put ' proc contents noprint data=&wt ';
put ' out=_data_ (keep=name type length format:); '; put ' out=_data_ (keep=name type length format:); ';
put ' run;%let tempds=%scan(&syslast,2,.); '; put ' run;%let tempds=%scan(&syslast,2,.); ';
put ' data _null_; file &fref; '; put ' data _null_; file &fref mod; ';
put ' dsid=open("WORK.&wt",''is''); '; put ' dsid=open("WORK.&wt",''is''); ';
put ' nlobs=attrn(dsid,''NLOBS''); '; put ' nlobs=attrn(dsid,''NLOBS''); ';
put ' nvars=attrn(dsid,''NVARS''); '; put ' nvars=attrn(dsid,''NVARS''); ';
@@ -488,9 +494,9 @@ data _null_;
put ' put '',"nvars":'' nvars; '; put ' put '',"nvars":'' nvars; ';
put ' %mp_jsonout(OBJ,&tempds,jref=&fref,dslabel=colattrs,engine=DATASTEP) '; put ' %mp_jsonout(OBJ,&tempds,jref=&fref,dslabel=colattrs,engine=DATASTEP) ';
put ' %mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,engine=DATASTEP) '; put ' %mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,engine=DATASTEP) ';
put ' data _null_; file &fref;put "}"; '; put ' data _null_; file &fref mod;put "}"; ';
put ' %end; '; put ' %end; ';
put ' data _null_; file &fref;put "}";run; '; put ' data _null_; file &fref mod;put "}";run; ';
put ' %end; '; put ' %end; ';
put ' '; put ' ';
put ' /* close off json */ '; put ' /* close off json */ ';

View File

@@ -4,7 +4,7 @@
@details If not executed in Studio 5+ will expect oauth token in a global @details If not executed in Studio 5+ will expect oauth token in a global
macro variable (default ACCESS_TOKEN). macro variable (default ACCESS_TOKEN).
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%mv_createwebservice(path=/Public/test, name=blah) %mv_createwebservice(path=/Public/test, name=blah)
@@ -21,7 +21,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -4,7 +4,7 @@
@details If not executed in Studio 5+ will expect oauth token in a global @details If not executed in Studio 5+ will expect oauth token in a global
macro variable (default ACCESS_TOKEN). macro variable (default ACCESS_TOKEN).
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%mv_createwebservice(path=/Public/test, name=blah) %mv_createwebservice(path=/Public/test, name=blah)
@@ -20,7 +20,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -17,7 +17,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -4,7 +4,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mv_tokenrefresh.sas @li mv_tokenrefresh.sas

View File

@@ -4,7 +4,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mv_registerclient.sas @li mv_registerclient.sas

View File

@@ -6,7 +6,7 @@
Using the macros here: Using the macros here:
filename mc url filename mc url
"https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
An administrator needs to set you up with an access code: An administrator needs to set you up with an access code:
@@ -30,7 +30,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -16,7 +16,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -6,7 +6,7 @@
Using the macros here: Using the macros here:
filename mc url filename mc url
"https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
Now we can run the macro! Now we can run the macro!
@@ -31,7 +31,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -6,7 +6,7 @@
Using the macros here: Using the macros here:
filename mc url filename mc url
"https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
An administrator needs to set you up with an access code: An administrator needs to set you up with an access code:
@@ -30,7 +30,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -4,7 +4,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mv_tokenauth.sas @li mv_tokenauth.sas

View File

@@ -6,7 +6,7 @@
Using the macros here: Using the macros here:
filename mc url filename mc url
"https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
An administrator needs to set you up with an access code: An administrator needs to set you up with an access code:
@@ -30,7 +30,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -6,7 +6,7 @@
Using the macros here: Using the macros here:
filename mc url filename mc url
"https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
An administrator needs to set you up with an access code: An administrator needs to set you up with an access code:
@@ -48,7 +48,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -12,7 +12,7 @@
Usage: Usage:
%* compile macros; %* compile macros;
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
%* specific client with just openid scope; %* specific client with just openid scope;
@@ -53,7 +53,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -15,7 +15,7 @@
Usage: Usage:
filename mc url "https://raw.githubusercontent.com/macropeople/macrocore/master/mc_all.sas"; filename mc url "https://raw.githubusercontent.com/sasjs/core/main/all.sas";
%inc mc; %inc mc;
@@ -41,7 +41,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -41,7 +41,7 @@
@version VIYA V.03.04 @version VIYA V.03.04
@author Allan Bowe @author Allan Bowe
@source https://github.com/macropeople/macrocore @source https://github.com/sasjs/core
<h4> Dependencies </h4> <h4> Dependencies </h4>
@li mp_abort.sas @li mp_abort.sas

View File

@@ -36,7 +36,8 @@
**/ **/
%macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y); %macro mv_webout(action,ds,fref=_mvwtemp,dslabel=,fmt=Y);
%global _webin_file_count _webin_fileuri _debug _omittextlog ; %global _webin_file_count _webin_fileuri _debug _omittextlog _webin_name
sasjs_tables SYS_JES_JOB_URI;
%if %index("&_debug",log) %then %let _debug=131; %if %index("&_debug",log) %then %let _debug=131;
%local i tempds; %local i tempds;
@@ -50,11 +51,11 @@
%if not %symexist(_webin_fileuri1) %then %do; %if not %symexist(_webin_fileuri1) %then %do;
%let _webin_file_count=%eval(&_webin_file_count+0); %let _webin_file_count=%eval(&_webin_file_count+0);
%let _webin_fileuri1=&_webin_fileuri; %let _webin_fileuri1=&_webin_fileuri;
%let _webin_name1=&_webin_name;
%end; %end;
%if %symexist(sasjs_tables) %then %do; /* if the sasjs_tables param is passed, we expect param based upload */
/* small volumes of non-special data are sent as params for responsiveness */ %if %length(&sasjs_tables.XX)>2 %then %do;
/* to do - deal with escaped values */
filename _sasjs "%sysfunc(pathname(work))/sasjs.lua"; filename _sasjs "%sysfunc(pathname(work))/sasjs.lua";
data _null_; data _null_;
file _sasjs; file _sasjs;
@@ -133,13 +134,19 @@
infile indata firstobs=2 dsd termstr=crlf ; infile indata firstobs=2 dsd termstr=crlf ;
input &input_statement; input &input_statement;
run; run;
%let sasjs_tables=&sasjs_tables &&_webin_name&i;
%end; %end;
%end; %end;
%else %if &action=OPEN %then %do; %else %if &action=OPEN %then %do;
/* setup webout */ /* setup webout */
OPTIONS NOBOMFILE; OPTIONS NOBOMFILE;
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI" %if "X&SYS_JES_JOB_URI.X"="XX" %then %do;
name="_webout.json" lrecl=999999 mod; filename _webout temp lrecl=999999 mod;
%end;
%else %do;
filename _webout filesrvc parenturi="&SYS_JES_JOB_URI"
name="_webout.json" lrecl=999999 mod;
%end;
/* setup temp ref */ /* setup temp ref */
%if %upcase(&fref) ne _WEBOUT %then %do; %if %upcase(&fref) ne _WEBOUT %then %do;
@@ -169,13 +176,13 @@
i+1; i+1;
call symputx('wt'!!left(i),name); call symputx('wt'!!left(i),name);
call symputx('wtcnt',i); call symputx('wtcnt',i);
data _null_; file &fref; put ",""WORK"":{"; data _null_; file &fref mod; put ",""WORK"":{";
%do i=1 %to &wtcnt; %do i=1 %to &wtcnt;
%let wt=&&wt&i; %let wt=&&wt&i;
proc contents noprint data=&wt proc contents noprint data=&wt
out=_data_ (keep=name type length format:); out=_data_ (keep=name type length format:);
run;%let tempds=%scan(&syslast,2,.); run;%let tempds=%scan(&syslast,2,.);
data _null_; file &fref; data _null_; file &fref mod;
dsid=open("WORK.&wt",'is'); dsid=open("WORK.&wt",'is');
nlobs=attrn(dsid,'NLOBS'); nlobs=attrn(dsid,'NLOBS');
nvars=attrn(dsid,'NVARS'); nvars=attrn(dsid,'NVARS');
@@ -186,9 +193,9 @@
put ',"nvars":' nvars; put ',"nvars":' nvars;
%mp_jsonout(OBJ,&tempds,jref=&fref,dslabel=colattrs,engine=DATASTEP) %mp_jsonout(OBJ,&tempds,jref=&fref,dslabel=colattrs,engine=DATASTEP)
%mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,engine=DATASTEP) %mp_jsonout(OBJ,&wt,jref=&fref,dslabel=first10rows,engine=DATASTEP)
data _null_; file &fref;put "}"; data _null_; file &fref mod;put "}";
%end; %end;
data _null_; file &fref;put "}";run; data _null_; file &fref mod;put "}";run;
%end; %end;
/* close off json */ /* close off json */