Compare commits

...

4 Commits

Author SHA1 Message Date
Bart Jablonski
c667bc6b25 SAS Packages Framework, version 20241014
#SAS Packages Framework, version `20241014`

## Changes

---

The [%generatePackage()]{https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/SPFinit.md#generatepackage} macro accepts two new code types:
- `DS2PCK` for Proc DS2 packages, and
- `DS2THR` for Proc DS2 threads.

Those two new types allow to add `PROC DS2` *threads* and *packages* to a SAS package.

---

The [%loadPackage()]{https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/SPFinit.md#loadpackage} macro has new parameter:
- `DS2force` - when set to `1` an existing data set named the same as thread or package is overwritten by DS2 file.

While loading a package that contains `PRCO DS2` code, by default, if there already exist a SAS data set with the same name (which is not a DS2 thread or package file) a warning is issued in the log and the thread/package data set is not generated. To force overwrite, set the `DS2force=` parameter of the `%loadPackage()` macro to 1.

---

Minor updates and fixes:
- Proc `sql` "drop table" replaced with `fedsqsl`'s for data sets deletion.
- Proc `iml`, `fcmp`, and `proto` code blocks end with `quit;` statement.

---

[Documentation]{https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation} and [Hands-on-Workshops materials]{https://github.com/yabwon/HoW-SASPackages} updated.

---
2024-10-14 21:38:08 +02:00
Bart Jablonski
0a01f39662 update in README.md
update in README.md

- links to packages documentation updated
2024-10-01 07:25:20 +02:00
Bart Jablonski
45127a057e SAS Packages Framework, version 20240927
## SAS Packages Framework, version `20240927`

---

### Changes

- Aesthetic changes in log when running the `%installPackage()` macro, notes about successful/failed installation.
- New parameter `SFRCVN` added to the `%installPackage()` macro, `SFRCVN` provides a *name* for a macro variable to store value of the *success-failure return code* of the installation process. Return value has the following form: `<number of successes>.<number of failures>` The macro variable is created as a *global* macro variable.
- Documentation updated.

---
2024-09-27 11:25:33 +02:00
Bart Jablonski
3f950e11ce The BasePlus package [ver. 2.1.0]
## The BasePlus package [ver. 2.1.0]

### Changes:

Update to the
[`%rainCloudPlot()`](https://github.com/SASPAC/baseplus/blob/2.1.0/baseplus.md#raincloudplot-macro-17)
macro, new `whiskerScale=` parameter added.

See [documentation](https://github.com/SASPAC/baseplus/blob/main/baseplus.md) for details.

---

SHA256 digest for BasePlus: `F*DFA83F8E0D7424DEB63D49620392068BC68D766552E2804CB6B01DE8E5A87769`

---

### Example.

~~~~sas
%rainCloudPlot(
 sashelp.class
,sex
,height
,whiskerScale=0.5
)
~~~~
2024-09-09 13:17:27 +02:00
21 changed files with 673 additions and 188 deletions

View File

@@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2019 - 2023 Bartosz Jablonski Copyright (c) 2019 - 2024 Bartosz Jablonski
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -16,7 +16,7 @@ Don't forget to **STAR** (:star:) the repository! :-)
### Current version: ### Current version:
**The latest version** of SPF is **`20240711`**. **The latest version** of SPF is **`20241014`**.
To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). To get started with SAS Packages try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory).
@@ -163,6 +163,8 @@ The SAS Packages Framework [(short) documentation](https://github.com/yabwon/SAS
### Updates worth mentioning: ### Updates worth mentioning:
**Update**\[October 14th, 2024\]**:** `DS2PCK` and `DS2THR` **types for `PROC DS2` *threads* and *packages* added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20241014 "PROC DS2"))**.
**Update**\[December 10th, 2023\]**:** `markdownDoc=` **parameter added to** `%generatePackage()` **macro, which allows to generate markdown file with documentation. Content is taken from the help information notes and the description. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231210 "markdown documentation"))**. **Update**\[December 10th, 2023\]**:** `markdownDoc=` **parameter added to** `%generatePackage()` **macro, which allows to generate markdown file with documentation. Content is taken from the help information notes and the description. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231210 "markdown documentation"))**.
**Update**\[November 11th, 2023\]**:** `KMFSNIP` **type for *key macro abbreviations* snippets added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231111 "KMF-abbreviations"))**. **Update**\[November 11th, 2023\]**:** `KMFSNIP` **type for *key macro abbreviations* snippets added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20231111 "KMF-abbreviations"))**.
@@ -215,32 +217,32 @@ Packages:
- **SQLinDS** - **SQLinDS**
[Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS") [Documentation for SQLinDS](https://github.com/SASPAC/blob/main/sqlinds.md "Documentation for SQLinDS")
[SQLinDS in SASPAC](https://github.com/SASPAC/sqlinds "SQLinDS in SASPAC") [SQLinDS in SASPAC](https://github.com/SASPAC/sqlinds "SQLinDS in SASPAC")
- **DFA** (Dynamic Function Arrays) - **DFA** (Dynamic Function Arrays)
[Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA") [Documentation for DFA](https://github.com/SASPAC/blob/main/dfa.md "Documentation for DFA")
[DFA in SASPAC](https://github.com/SASPAC/dfa "DFA in SASPAC") [DFA in SASPAC](https://github.com/SASPAC/dfa "DFA in SASPAC")
- **macroArray** - **macroArray**
[Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") [Documentation for macroArray](https://github.com/SASPAC/blob/main/macroarray.md "Documentation for macroArray")
[MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC") [MacroArray in SASPAC](https://github.com/SASPAC/macroarray "MacroArray in SASPAC")
- **BasePlus** - **BasePlus**
[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") [Documentation for BasePlus](https://github.com/SASPAC/blob/main/baseplus.md "Documentation for BasePlus")
[BasePlus in SASPAC](https://github.com/SASPAC/baseplus "BasePlus in SASPAC") [BasePlus in SASPAC](https://github.com/SASPAC/baseplus "BasePlus in SASPAC")
- **GSM** (Generate Secure Macros) - **GSM** (Generate Secure Macros)
[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") [Documentation for GSM](https://github.com/SASPAC/blob/main/gsm.md "Documentation for GSM")
[GSM in SASPAC](https://github.com/SASPAC/gsm "GSM in SASPAC") [GSM in SASPAC](https://github.com/SASPAC/gsm "GSM in SASPAC")

View File

@@ -6,7 +6,7 @@
when empty the "packages" value is used */ when empty the "packages" value is used */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to list directories pointed by "packages" fileref, version 20240711. Run %extendPackagesFileref(HELP) for help info.' des = 'Macro to list directories pointed by "packages" fileref, version 20241014. Run %extendPackagesFileref(HELP) for help info.'
; ;
%if %QUPCASE(&packages.) = HELP %then %if %QUPCASE(&packages.) = HELP %then
@@ -22,7 +22,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20240711
%put ### This is short help information for the `extendPackagesFileref` macro #; %put ### This is short help information for the `extendPackagesFileref` macro #;
%put #-----------------------------------------------------------------------------------------#;; %put #-----------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to list directories pointed by 'packages' fileref, version `20240711` #; %put # Macro to list directories pointed by 'packages' fileref, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -3,7 +3,7 @@
Macro to generate SAS packages. Macro to generate SAS packages.
Version 20240711 Version 20241014
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -43,7 +43,7 @@
file name be created */ file name be created */
)/ secure minoperator )/ secure minoperator
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to generate SAS packages, version 20240711. Run %generatePackage() for help info.' des = 'Macro to generate SAS packages, version 20241014. Run %generatePackage() for help info.'
; ;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do; %do;
@@ -58,7 +58,7 @@ des = 'Macro to generate SAS packages, version 20240711. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #; %put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to generate SAS packages, version `20240711` #; %put # Macro to generate SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -527,6 +527,18 @@ DESCRIPTION END:
| | | |
| +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case] | +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case]
| |
+-013_ds2pck [one file one PROC DS2 package]
| |
| +-abc.sas [a data set with a package ABC stored in WORK.ABC data set]
| |
| +-library.xyz.sas [a data set with a package LIBRARY.XYZ stored in LIBRARY.XYZ data set]
|
+-014_ds2thr [one file one PROC DS2 thread]
| |
| +-abc.sas [a data set with a thread ABC stored in WORK.ABC data set]
| |
| +-library.xyz.sas [a data set with a thread LIBRARY.XYZ stored in LIBRARY.XYZ data set]
|
+-<sequential number>_<type [in lower case]> +-<sequential number>_<type [in lower case]>
| |
+-00n_clean [if you need to clean something up after exec file execution, +-00n_clean [if you need to clean something up after exec file execution,
@@ -609,6 +621,7 @@ data &filesWithCodes.;
'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN' 'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN'
'LAZYDATA' 'TEST' 'CASLUDF' 'LAZYDATA' 'TEST' 'CASLUDF'
'ADDCNT' 'KMFSNIP' 'ADDCNT' 'KMFSNIP'
'DS2PCK' 'DS2THR'
)) ))
then then
do; do;
@@ -687,6 +700,9 @@ run;
%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source)); %let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source));
options NOnotes NOsource; options NOnotes NOsource;
options mprint;
options notes source;
proc sort data = &filesWithCodes.; proc sort data = &filesWithCodes.;
by order type file; by order type file;
run; run;
@@ -793,7 +809,7 @@ run;
/* code inspired by Kurt Bremser's "Talking to Your Host" article */ /* code inspired by Kurt Bremser's "Talking to Your Host" article */
/* https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344 */ /* https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344 */
/* WUSS 2022 */ /* WUSS 2022 */
data &filesWithCodes.addCnt; data &filesWithCodes.addCnt;
run; run;
@@ -855,9 +871,12 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */ title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */
%end; %end;
footnote1 "SAS Packages Framework, version 20240711"; footnote1 "SAS Packages Framework, version 20241014";
proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent); proc print
data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent)
width=full
;
run; run;
title; title;
@@ -876,7 +895,7 @@ title;
title2 "Package additional content:"; title2 "Package additional content:";
proc print proc print
data=&filesWithCodes.addCnt(drop=root dir level) data=&filesWithCodes.addCnt(drop=root dir level)
label label width=full
; ;
run; run;
%end; %end;
@@ -1111,6 +1130,8 @@ data _null_;
isProto = 0; isProto = 0;
isIMLmodule = 0; isIMLmodule = 0;
isCASLudf = 0; isCASLudf = 0;
isDS2pck = 0;
isDS2thr = 0;
%if (%superq(packageRequired) ne ) %if (%superq(packageRequired) ne )
or (%superq(packageReqPackages) ne ) or (%superq(packageReqPackages) ne )
@@ -1350,7 +1371,7 @@ data _null_;
('LIBNAME' 'MACRO' /*'MACROS'*/ 'DATA' ('LIBNAME' 'MACRO' /*'MACROS'*/ 'DATA'
'FUNCTION' /*'FUNCTIONS'*/ 'FORMAT' /*'FORMATS'*/ 'FUNCTION' /*'FUNCTIONS'*/ 'FORMAT' /*'FORMATS'*/
'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN' 'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN'
'LAZYDATA' 'TEST' 'ADDCNT' 'KMFSNIP')) 'LAZYDATA' 'TEST' 'ADDCNT' 'KMFSNIP' 'DS2PCK' 'DS2THR'))
then then
do; do;
putlog 'WARNING: Type ' type 'is not yet supported.'; putlog 'WARNING: Type ' type 'is not yet supported.';
@@ -1361,8 +1382,11 @@ data _null_;
isFormat + (upcase(type)=:'FORMAT'); isFormat + (upcase(type)=:'FORMAT');
isProto + (upcase(type)=:'PROTO'); isProto + (upcase(type)=:'PROTO');
isIMLmodule + (upcase(type)=:'IMLMODULE'); isIMLmodule + (upcase(type)=:'IMLMODULE');
isDS2pck + (upcase(type)=:'DS2PCK');
isDS2thr + (upcase(type)=:'DS2THR');
/* HEADERS for IML, FCMP, and PROTO - start */
/* HEADERS for PROC IML, FCMP, and PROTO - start */
if 1 = isFunction and upcase(type)=:'FUNCTION' then if 1 = isFunction and upcase(type)=:'FUNCTION' then
do; do;
/* macro variable for test if cherry picking used FCMP */ /* macro variable for test if cherry picking used FCMP */
@@ -1420,7 +1444,7 @@ data _null_;
/* header, for IML modules */ /* header, for IML modules */
put "proc iml ; "; put "proc iml ; ";
end; end;
/* HEADERS for IML, FCMP, and PROTO - end */ /* HEADERS for PROC IML, FCMP, and PROTO - end */
put ' ' / put ' ' /
'%if (%str(*)=%superq(cherryPick)) or (' fileshort +(-1) ' in %superq(cherryPick)) %then %do; '; /* Cherry Pick test1 start */ '%if (%str(*)=%superq(cherryPick)) or (' fileshort +(-1) ' in %superq(cherryPick)) %then %do; '; /* Cherry Pick test1 start */
@@ -1431,6 +1455,8 @@ data _null_;
put ' %put %sysfunc(ifc(%SYSMACEXIST(' fileshort +(-1) ')=1, NOTE# Macro ' fileshort put ' %put %sysfunc(ifc(%SYSMACEXIST(' fileshort +(-1) ')=1, NOTE# Macro ' fileshort
"exist. It will be overwritten by the macro from the &packageName. package, ));"; "exist. It will be overwritten by the macro from the &packageName. package, ));";
/* separate approach for EXEC */
if upcase(type)=:'EXEC' then if upcase(type)=:'EXEC' then
do; do;
/* User can suppress running the exec files */ /* User can suppress running the exec files */
@@ -1453,9 +1479,84 @@ data _null_;
/ ' )));' / ' )));'
; ;
end; end;
else /* separate approach for DS2 */
else if (upcase(type) in: ('DS2PCK' 'DS2THR')) then
do; do;
/* include the file with the code of the element */ if 1 = isDS2pck and upcase(type)=:'DS2PCK' then
do;
/* macro variable for test if cherry picking used DS2 package */
put 'data _null_; ';
put " call symputX('cherryPick_DS2PCK', 0, 'L'); ";
put 'run; ';
end;
if 1 = isDS2thr and upcase(type)=:'DS2THR' then
do;
/* macro variable for test if cherry picking used DS2 threads */
put 'data _null_; ';
put " call symputX('cherryPick_DS2THR', 0, 'L'); ";
put 'run; ';
end;
/* since DS2 packages and threads are stored in SAS data sets */
/* we have to check (before loading) if there is no "regular" */
/* data set (or view) with the same name to avoid overwriting */
if upcase(type) in: ('DS2PCK' 'DS2THR') then
do;
length DS2lib $ 8 DS2ds $ 32;
DS2lib = coalescec(scan(fileshort,-2,"."), "WORK");
DS2ds = scan(fileshort,-1,".");
put '%put %sysfunc(ifc(%sysfunc(exist(' fileshort +(-1) '))=1,'
/ '%sysfunc(dosubl(%str(options ps=min; title; options msglevel=n nodate notes source nomprint;'
/ ' data _null_;'
/ ' id = OPEN("' fileshort +(-1) '");'
/ ' if id then do;'
/ ' x = VARNUM(id, "SAS_CHECKSUM_") AND VARNUM(id, "SAS_ROWID_") AND (VARNUM(id, "SAS_TEXTTHREAD_") OR VARNUM(id, "SAS_TEXTPACKAGE_"));'
/ ' y = ("DATA"=ATTRC(id, "MTYPE"));'
/ ' if symexist("DS2force") then z = symgetn("DS2force"); else z = 0;'
/ ' if (x AND y) OR z then do;'
/ ' call execute("proc delete data=' fileshort +(-1) '; run;");'
/ " put 'NOTE# The " fileshort "will be overwritten by the PROC DS2 package/thread from the &packageName. package.';"
/* header for each DS2 packages or threads in PROC DS2 run */
/ ' call execute("proc ds2;");'
/ ' call execute(''%include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'');'
/* footer for each DS2 packages or threads in PROC DS2 run */
/ ' call execute("run; quit;");'
/ ' call execute("options nonotes; proc datasets lib=' DS2lib 'noprint;");'
/ " call execute('modify " DS2ds "(label=""Package: &packageName. ; Type: " type "; Name: " fileshort """);');"
/ ' call execute("run; quit;");'
/ ' end;'
/ ' else put "WARNING: Data set ' fileshort 'exist and is not a PROC DS2 package/thread!"'
/ ' / "WARNING- PROC DS2 package/thread ' fileshort 'will not be generated..."; '
/ ' id = CLOSE(id);'
/ ' end;'
/ ' run;))),'
/ '%sysfunc(dosubl(%str(options ps=min; title; options msglevel=n nodate notes source nomprint;'
/* header for each DS2 packages or threads in PROC DS2 run */
/ ' proc ds2;'
/ ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'
/* footer for each DS2 packages or threads in PROC DS2 run */
/ ' run; quit;'
/ ' options nonotes; proc datasets lib=' DS2lib 'noprint;'
/ " modify " DS2ds "(label=""Package: &packageName. ; Type: " type "; Name: " fileshort """);"
/ ' run; quit;'
/ '))),'
/ '));'
/ " "
/ ;
end;
end;
else
do;
/* include the file with the code of the element, all other cases */
put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'; put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;';
end; end;
@@ -1471,13 +1572,19 @@ data _null_;
if upcase(type)=:'FORMAT' then if upcase(type)=:'FORMAT' then
put ' %let cherryPick_FORMAT = %eval(&cherryPick_FORMAT. + 1);'; put ' %let cherryPick_FORMAT = %eval(&cherryPick_FORMAT. + 1);';
if upcase(type)=:'DS2PCK' then
put ' %let cherryPick_DS2PCK = %eval(&cherryPick_DS2PCK. + 1);';
if upcase(type)=:'DS2THR' then
put ' %let cherryPick_DS2THR = %eval(&cherryPick_DS2THR. + 1);';
put '%end; ' /; /* Cherry Pick test1 end */ put '%end; ' /; /* Cherry Pick test1 end */
/* FOOTERS for IML, FCMP, and PROTO - start */ /* FOOTERS for PROC IML, FCMP, and PROTO - start */
if 1 = LAST.type and upcase(type) in ('FUNCTIONS' 'PROTO' 'FORMATS') then if 1 = LAST.type and upcase(type) in ('FUNCTIONS' 'PROTO' 'FORMATS') then
do; /* footer, for multiple functions in one FCMP run, one PROTO run, or one FORMAT run */ do; /* footer, for multiple functions in one FCMP run, one PROTO run, or one FORMAT run */
put "run; " / ; put "quit; " / ;
end; end;
if 1 = LAST.type and upcase(type)='IMLMODULE' then /* footer, for IML modules */ if 1 = LAST.type and upcase(type)='IMLMODULE' then /* footer, for IML modules */
do; do;
@@ -1488,7 +1595,7 @@ data _null_;
'%end; ' / '%end; ' /
"quit; " / ; "quit; " / ;
end; end;
/* FOOTERS for IML, FCMP, and PROTO - end */ /* FOOTERS for PROC IML, FCMP, and PROTO - end */
/* add the link to the functions dataset, only for the first occurrence */ /* add the link to the functions dataset, only for the first occurrence */
/*if 1 = isFunction and (upcase(type)=:'FUNCTION') then /*if 1 = isFunction and (upcase(type)=:'FUNCTION') then
@@ -1576,7 +1683,7 @@ data _null_;
%end; %end;
put +(-1) '`.;''' / put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20240711.;''' / ' !! '' %put with the SAS Packages Framework version 20241014.;''' /
' !! '' %put ****************************************************************************;''' / ' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ; ' !! '' %end;''' ;
@@ -1741,7 +1848,7 @@ data _null_;
%end; %end;
put +(-1) '`.; '' !!' / put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20240711.; '' !! ' / ''' %put with the SAS Packages Framework version 20241014.; '' !! ' /
''' %put ****************************************************************************; '' !! ' / ''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' / ''' %end; '' !! ' /
@@ -2256,15 +2363,33 @@ data _null_;
/* put 'remove module = ' fileshort ';'; */ /* put 'remove module = ' fileshort ';'; */
end; end;
/* delete datasets */ /* delete data sets */
put "proc sql noprint;"; put "proc fedsql noprint;";
EOF = 0; EOF = 0;
do until(EOF); do until(EOF);
set &filesWithCodes. end = EOF; set &filesWithCodes. end = EOF;
if not (upcase(type)=:'DATA') then continue; if not (upcase(type) in: ('DATA')) then continue;
put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'; put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;';
put '%put NOTE- ;'; put '%put NOTE- ;';
put 'drop table ' fileshort ';' /; put 'drop table ' fileshort ' FORCE;' /;
end;
put "quit;" /;
/* delete PROC DS2 packages or threads */
put 'data _null_; call symputx("_DS2_2_del_",0,"L"); run;';
put "proc fedsql noprint;";
EOF = 0;
do until(EOF);
set &filesWithCodes. end = EOF;
if not (upcase(type) in: ('DS2PCK' 'DS2THR')) then continue;
put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'
/ '%put NOTE- ;'
/ '%let _DS2_2_del_ = %sysfunc(open(' fileshort '));'
/ '%sysfunc(ifc(&_DS2_2_del_. AND %sysfunc(ATTRC(&_DS2_2_del_.,LABEL))='
/ '%str(' "Package: &packageName. ; Type: " type "; Name: " fileshort +(-1) '),drop table ' fileshort ' FORCE,)) ;'
/ '%let _DS2_2_del_ = %sysfunc(close(&_DS2_2_del_.));'
;
put ';' /;
end; end;
put "quit;" /; put "quit;" /;
@@ -2392,12 +2517,13 @@ data _null_;
length fileshort2 $ 256; length fileshort2 $ 256;
select; select;
when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" );
when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'" );
when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" ); when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) in ('DS2PCK' 'DS2THR')) fileshort2 = cats("'DS2", fileshort, "'" );
otherwise fileshort2 = fileshort; otherwise fileshort2 = fileshort;
end; end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2); strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -2529,7 +2655,7 @@ data _null_;
%end; %end;
put 'put " " / @3 "--------------------------------------------------------------------" / " ";' put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20240711`*";' / 'put @3 "*SAS package generated by SAS Package Framework, version `20241014`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";'; / 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /; put 'run; ' /;
@@ -2568,13 +2694,14 @@ data _null_;
length fileshort2 $ 256; length fileshort2 $ 256;
select; select;
when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" );
when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'" );
when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" ); when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) in ('DS2PCK' 'DS2THR')) fileshort2 = cats("'DS2", fileshort, "'" );
otherwise fileshort2 = fileshort; otherwise fileshort2 = fileshort;
end; end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2); strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -3566,7 +3693,7 @@ data &filesWithCodes.markdown;
%end; %end;
put " " / "--------------------------------------------------------------------" / " " put " " / "--------------------------------------------------------------------" / " "
/ "*SAS package generated by SAS Package Framework, version `20240711`*" / "*SAS package generated by SAS Package Framework, version `20241014`*"
/ " " / "--------------------------------------------------------------------" / " "; / " " / "--------------------------------------------------------------------" / " ";
put "# The `&packageName.` package content"; put "# The `&packageName.` package content";

View File

@@ -28,7 +28,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage() for help info.' des = 'Macro to get help about SAS package, version 20241014. Run %helpPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -43,7 +43,7 @@ des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage()
%put ### This is short help information for the `helpPackage` macro #; %put ### This is short help information for the `helpPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to get help about SAS packages, version `20240711` #; %put # Macro to get help about SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -120,14 +120,15 @@ des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage()
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -170,7 +171,8 @@ des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage()
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofhelpPackage: %ENDofhelpPackage:
%mend helpPackage; %mend helpPackage;

View File

@@ -1,5 +1,5 @@
/*+installPackage+*/ /*+installPackage+*/
/* Macros to install SAS packages, version 20240711 */ /* Macros to install SAS packages, version 20241014 */
/* A SAS package is a zip file containing a group of files /* A SAS package is a zip file containing a group of files
with SAS code (macros, functions, data steps generating with SAS code (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by data, etc.) wrapped up together and %INCLUDEed by
@@ -18,11 +18,12 @@
, URLoptions = /* options for the `sourcePath` URLs */ , URLoptions = /* options for the `sourcePath` URLs */
, loadAddCnt=0 /* should the additional content be loaded? , loadAddCnt=0 /* should the additional content be loaded?
default is 0 - means No, 1 means Yes */ default is 0 - means No, 1 means Yes */
, SFRCVN = /* name of a macro variable to store success-failure return code value */
) )
/secure /secure
minoperator minoperator
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to install SAS package, version 20240711. Run %%installPackage() for help info.' des = 'Macro to install SAS package, version 20241014. Run %%installPackage() for help info.'
; ;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
%do; %do;
@@ -37,7 +38,7 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put ### This is short help information for the `installPackage` macro #; %put ### This is short help information for the `installPackage` macro #;
%put #--------------------------------------------------------------------------------------------#;; %put #--------------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to install SAS packages, version `20240711` #; %put # Macro to install SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -81,7 +82,7 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put # - `version=` Indicates which historical version of a package to install. #; %put # - `version=` Indicates which historical version of a package to install. #;
%put # Historical version are available only if `mirror=0` is set. #; %put # Historical version are available only if `mirror=0` is set. #;
%put # Default value is null which means "install the latest". #; %put # Default value is null which means "install the latest". #;
%put # When there are multiple packages to install version #; %put # When there are multiple packages to install version variable #;
%put # is scan sequentially. #; %put # is scan sequentially. #;
%put # #; %put # #;
%put # - `replace=` With default value of `1` it causes existing package file #; %put # - `replace=` With default value of `1` it causes existing package file #;
@@ -101,6 +102,11 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put # directory in `<packageName>_AdditionalContent` folder. #; %put # directory in `<packageName>_AdditionalContent` folder. #;
%put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #; %put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #;
%put # #; %put # #;
%put # - `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the #;
%put # *success-failure return code* of the installation process. Return value #;
%put # has the following form: `<number of successes>.<number of failures>` #;
%put # The macro variable is created as a *global* macro variable. #;
%put # #;
%put #--------------------------------------------------------------------------------------------#; %put #--------------------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
@@ -149,7 +155,7 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
@@ -158,8 +164,9 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
/* /*
Reference: Reference:
@@ -233,6 +240,10 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put ; %put ;
%put INFO: Calling: &packagesNames.; %put INFO: Calling: &packagesNames.;
%Local PackagesInstalledSussess PackagesInstalledFail;
%Let PackagesInstalledSussess=;
%let PackagesInstalledFail=;
%do i = 1 %to %sysfunc(countw(&packagesNames., , S)); %do i = 1 %to %sysfunc(countw(&packagesNames., , S));
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
%local packageName packageSubDir vers versA versB; %local packageName packageSubDir vers versA versB;
@@ -266,7 +277,9 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%do; %do;
%let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas; %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas;
%end; %end;
%if %superq(mirror) > 1 %then
%put %str( )Mirror %superq(mirror) does not support versioning.;
filename &in URL filename &in URL
"&SPFinitMirror." "&SPFinitMirror."
recfm=N lrecl=1; recfm=N lrecl=1;
@@ -286,6 +299,12 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%let packageSubDir = %lowcase(&packageName.)/raw/&vers./; %let packageSubDir = %lowcase(&packageName.)/raw/&vers./;
%end; %end;
%end; %end;
%else
%do;
%if %superq(mirror) > 0 %then
%put %str( )Mirror %superq(mirror) does not support versioning.;
%end;
filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip"
%if (%superq(URLuser) ne ) %then %if (%superq(URLuser) ne ) %then
%do; %do;
@@ -360,6 +379,21 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
filename &in clear; filename &in clear;
filename &out clear; filename &out clear;
%if 0 = &installationRC. %then
%do;
%if %superq(vers)= %then
%Let PackagesInstalledSussess=&PackagesInstalledSussess. &packageName.;
%else
%Let PackagesInstalledSussess=&PackagesInstalledSussess. &packageName.(&vers.);
%end;
%else
%do;
%if %superq(vers)= %then
%Let PackagesInstalledFail=&PackagesInstalledFail. &packageName.;
%else
%let PackagesInstalledFail=&PackagesInstalledFail. &packageName.(&vers.);
%end;
%if 1 = &loadAddCnt. %if 1 = &loadAddCnt.
AND 0 = &installationRC. AND 0 = &installationRC.
AND NOT (%upcase(&packageName.) in (SPFINIT SASPACKAGEFRAMEWORK SASPACKAGESFRAMEWORK)) AND NOT (%upcase(&packageName.) in (SPFINIT SASPACKAGEFRAMEWORK SASPACKAGESFRAMEWORK))
@@ -375,14 +409,60 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put *** %lowcase(&packageName.) end *******************************************; %put *** %lowcase(&packageName.) end *******************************************;
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
%end; %end;
%local sucsCount sucsCountWords;
%let sucsCount=0;
%if NOT(%superq(PackagesInstalledSussess)=) %then
%do;
%put %str( );
%let sucsCount=%sysfunc(countw(%superq(PackagesInstalledSussess),%str( )));
%if 1=&sucsCount. %then
%put INFO: Package %superq(PackagesInstalledSussess) installed.;
%else %if 1<&sucsCount. %then
%do;
%let sucsCountWords=%sysfunc(abs(&sucsCount.),words.);
%put INFO: Successfully installed &sucsCountWords. packages:;
%put %str( )&PackagesInstalledSussess.;
%end;
%end;
%local failCount failCountWords;
%let failCount=0;
%if NOT(%superq(PackagesInstalledFail)=) %then
%do;
%put %str( );
%let failCount=%sysfunc(countw(%superq(PackagesInstalledFail),%str( )));
%if 1=&failCount. %then
%put WARNING: Failed to install %superq(PackagesInstalledFail) package.;
%else %if 1<&failCount. %then
%do;
%let failCountWords=%sysfunc(abs(&failCount.),words.);
%put WARNING: Failed to install &failCountWords. packages:;
%put WARNING- &PackagesInstalledFail.;
%end;
%end;
%put %str( );
%if NOT(%superq(SFRCVN)=) %then
%do;
data _null_;
length SFRCVN $ 32;
SFRCVN = compress(symget('SFRCVN'),"_","KAD");
value = "&sucsCount..&failCount.";
put 'INFO: Success-Failure-Return-Code macroVariable Name is: ' SFRCVN
/ ' with value: ' value
/ ;
call symputX(SFRCVN, value, "G");
run;
%end;
%packagesListError: %packagesListError:
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofinstallPackage: %ENDofinstallPackage:
%mend installPackage; %mend installPackage;

View File

@@ -3,7 +3,7 @@
Macro to list SAS packages in packages folder. Macro to list SAS packages in packages folder.
Version 20240711 Version 20241014
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -21,8 +21,9 @@
*//*** HELP END ***/ *//*** HELP END ***/
%macro listPackages()/secure PARMBUFF %macro listPackages()
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240711.' /secure PARMBUFF
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241014.'
; ;
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
%do; %do;
@@ -37,7 +38,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE
%put ### This is short help information for the `listPackages` macro #; %put ### This is short help information for the `listPackages` macro #;
%put #-----------------------------------------------------------------------------------------#;; %put #-----------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to list available SAS packages, version `20240711` #; %put # Macro to list available SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -30,11 +30,13 @@
, loadAddCnt=0 /* should the additional content be loaded? , loadAddCnt=0 /* should the additional content be loaded?
default is 0 - means No, 1 means Yes */ default is 0 - means No, 1 means Yes */
, suppressExec=0 /* indicates if loading of exec files , suppressExec=0 /* indicates if loading of exec files
should be suppressed, 1=suppress should be suppressed, 1=suppress */
, DS2force=0 /* indicates if PROC DS2 packages and threads
should be loaded if a data set exists, 0=do not load
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load SAS package, version 20240711. Run %loadPackage() for help info.' des = 'Macro to load SAS package, version 20241014. Run %loadPackage() for help info.'
minoperator minoperator
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -50,7 +52,7 @@ minoperator
%put ### This is short help information for the `loadPackage` macro #; %put ### This is short help information for the `loadPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to *load* SAS packages, version `20240711` #; %put # Macro to *load* SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -110,6 +112,10 @@ minoperator
%put # should be suppressed, default value is `0`, #; %put # should be suppressed, default value is `0`, #;
%put # when set to `1` `exec` files are *not* loaded #; %put # when set to `1` `exec` files are *not* loaded #;
%put # #; %put # #;
%put # - `DS2force=` *Optional.* Indicates if loading of `PROC DS2` packages #;
%put # or threads should overwrite existing SAS data sets. #;
%put # Default value of `0` means "do not overwrite". #;
%put # #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
@@ -159,7 +165,7 @@ minoperator
%GOTO ENDofloadPackage; %GOTO ENDofloadPackage;
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -167,8 +173,9 @@ minoperator
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -211,6 +218,11 @@ minoperator
%let suppressExec = 0; %let suppressExec = 0;
%end; %end;
%if %superq(DS2force) NE 1 %then
%do;
%let DS2force = 0;
%end;
filename &_PackageFileref_. &ZIP. filename &_PackageFileref_. &ZIP.
/* put location of package myPackageFile.zip here */ /* put location of package myPackageFile.zip here */
"&path./%lowcase(&packageName.).&zip." %unquote(&options.) "&path./%lowcase(&packageName.).&zip." %unquote(&options.)
@@ -278,7 +290,7 @@ minoperator
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofloadPackage: %ENDofloadPackage:
%mend loadPackage; %mend loadPackage;

View File

@@ -19,7 +19,7 @@
is provided in required version */ is provided in required version */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load additional content for a SAS package, version 20240711. Run %loadPackageAddCnt() for help info.' des = 'Macro to load additional content for a SAS package, version 20241014. Run %loadPackageAddCnt() for help info.'
minoperator minoperator
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -35,7 +35,7 @@ minoperator
%put ### This is short help information for the `loadPackageAddCnt` macro #; %put ### This is short help information for the `loadPackageAddCnt` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to *load* additional content for a SAS package, version `20240711` #; %put # Macro to *load* additional content for a SAS package, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -100,7 +100,7 @@ minoperator
%GOTO ENDofloadPackageAddCnt; %GOTO ENDofloadPackageAddCnt;
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp zip; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp zip;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -108,10 +108,11 @@ minoperator
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
%let zip = zip; %let zip = zip;
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -364,7 +365,7 @@ minoperator
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofloadPackageAddCnt: %ENDofloadPackageAddCnt:
%mend loadPackageAddCnt; %mend loadPackageAddCnt;

View File

@@ -11,7 +11,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load multiple SAS packages at one run, version 20240711. Run %loadPackages() for help info.' des = 'Macro to load multiple SAS packages at one run, version 20241014. Run %loadPackages() for help info.'
parmbuff parmbuff
; ;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
@@ -27,7 +27,7 @@ parmbuff
%put ### This is short help information for the `loadPackageS` macro #; %put ### This is short help information for the `loadPackageS` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro wrapper for the loadPackage macro, version `20240711` #; %put # Macro wrapper for the loadPackage macro, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;

View File

@@ -23,7 +23,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to preview content of a SAS package, version 20240711. Run %previewPackage() for help info.' des = 'Macro to preview content of a SAS package, version 20241014. Run %previewPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -38,7 +38,7 @@ des = 'Macro to preview content of a SAS package, version 20240711. Run %preview
%put ### This is short help information for the `previewPackage` macro #; %put ### This is short help information for the `previewPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to get preview of a SAS packages, version `20240711` #; %put # Macro to get preview of a SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -106,13 +106,15 @@ des = 'Macro to preview content of a SAS package, version 20240711. Run %preview
%GOTO ENDofpreviewPackage; %GOTO ENDofpreviewPackage;
%end; %end;
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; %let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -152,7 +154,8 @@ des = 'Macro to preview content of a SAS package, version 20240711. Run %preview
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofpreviewPackage: %ENDofpreviewPackage:
%mend previewPackage; %mend previewPackage;

View File

@@ -20,7 +20,7 @@
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for help info.' des = 'Macro to unload SAS package, version 20241014. Run %unloadPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for h
%put ### This is short help information for the `unloadPackage` macro #; %put ### This is short help information for the `unloadPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to unload SAS packages, version `20240711` #; %put # Macro to unload SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -102,14 +102,15 @@ des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for h
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -149,7 +150,8 @@ des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for h
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofunloadPackage: %ENDofunloadPackage:
%mend unloadPackage; %mend unloadPackage;

View File

@@ -13,7 +13,7 @@
hashing_file() function, SAS 9.4M6 */ hashing_file() function, SAS 9.4M6 */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %verifyPackage() for help info.' des = 'Macro to verify SAS package with the hash digest, version 20241014. Run %verifyPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -28,7 +28,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
%put ### This is short help information for the `verifyPackage` macro #; %put ### This is short help information for the `verifyPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to verify SAS package with it hash digest, version `20240711` #; %put # Macro to verify SAS package with it hash digest, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -83,7 +83,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
%GOTO ENDofverifyPackage; %GOTO ENDofverifyPackage;
%end; %end;
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -91,8 +91,9 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -176,7 +177,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofverifyPackage: %ENDofverifyPackage:
%mend verifyPackage; %mend verifyPackage;

View File

@@ -22,7 +22,7 @@ A **SAS package** is an automatically generated, single, stand alone *zip* file
The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process. The *purpose of a package* is to be a simple, and easy to access, code sharing medium, which will allow: on the one hand, to separate the code complex dependencies created by the developer from the user experience with the final product and, on the other hand, reduce developer's and user's unnecessary frustration related to a remote deployment process.
In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20240711`**. In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20241014`**.
**To get started with SAS Packages** try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory). **To get started with SAS Packages** try this [**`Getting Started with SAS Packages`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Getting_Started_with_SAS_Packages.pdf "Getting Started with SAS Packages") presentation (see the `./SPF/Documentation` directory).
@@ -40,7 +40,7 @@ After assigning the directory do not change them when using the SPF since it may
## This is short help information for the `installPackage` macro <a name="installpackage"></a> ## This is short help information for the `installPackage` macro <a name="installpackage"></a>
-------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------
Macro to install SAS packages, version `20240711` Macro to install SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -102,7 +102,12 @@ After assigning the directory do not change them when using the SPF since it may
means "Yes". Content is extracted into the **packages** fileref means "Yes". Content is extracted into the **packages** fileref
directory in `<packageName>_AdditionalContent` folder. directory in `<packageName>_AdditionalContent` folder.
For other locations use `%loadPackageAddCnt()` macro. For other locations use `%loadPackageAddCnt()` macro.
- `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the
*success-failure return code* of the installation process. Return value
has the following form: `<number of successes>.<number of failures>`
The macro variable is created as a *global* macro variable.
-------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` to learn more. Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` to learn more.
@@ -149,7 +154,7 @@ filename packages "C:/SAS_PACKAGES";
## This is short help information for the `helpPackage` macro <a name="helppackage"></a> ## This is short help information for the `helpPackage` macro <a name="helppackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to get help about SAS packages, version `20240711` Macro to get help about SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -225,7 +230,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `loadPackage` macro <a name="loadpackage"></a> ## This is short help information for the `loadPackage` macro <a name="loadpackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to *load* SAS packages, version `20240711` Macro to *load* SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -285,6 +290,10 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
should be suppressed, default value is `0`, should be suppressed, default value is `0`,
when set to `1` `exec` files are *not* loaded when set to `1` `exec` files are *not* loaded
- `DS2force=` *Optional.* Indicates if loading of `PROC DS2` packages
or threads should overwrite existing SAS data sets.
Default value of `0` means "do not overwrite".
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation`
@@ -377,7 +386,7 @@ If created, those macros are automatically deleted when the `%unloadPackage()` m
## This is short help information for the `loadPackageS` macro <a name="loadpackages"></a> ## This is short help information for the `loadPackageS` macro <a name="loadpackages"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro wrapper for the loadPackage macro, version `20240711` Macro wrapper for the loadPackage macro, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -426,7 +435,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `unloadPackage` macro <a name="unloadpackage"></a> ## This is short help information for the `unloadPackage` macro <a name="unloadpackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to unload SAS packages, version `20240711` Macro to unload SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -491,7 +500,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `listPackages` macro <a name="listpackages"></a> ## This is short help information for the `listPackages` macro <a name="listpackages"></a>
----------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------
Macro to list available SAS packages, version `20240711` Macro to list available SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -532,7 +541,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `verifyPackage` macro <a name="verifypackage"></a> ## This is short help information for the `verifyPackage` macro <a name="verifypackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to verify SAS package with it hash digest, version `20240711` Macro to verify SAS package with it hash digest, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -586,7 +595,7 @@ filename packages "C:/SAS_PACKAGES"; %* set-up a directory for packages;
## This is short help information for the `previewPackage` macro <a name="previewpackage"></a> ## This is short help information for the `previewPackage` macro <a name="previewpackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to get preview of a SAS packages, version `20240711` Macro to get preview of a SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -653,7 +662,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
## This is short help information for the `generatePackage` macro <a name="generatepackage"></a> ## This is short help information for the `generatePackage` macro <a name="generatepackage"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to generate SAS packages, version `20240711` Macro to generate SAS packages, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -868,7 +877,7 @@ All files have to have `.sas` extension. Other files are ignored.
## This is short help information for the `extendPackagesFileref` macro <a name="extendpackagesfileref"></a> ## This is short help information for the `extendPackagesFileref` macro <a name="extendpackagesfileref"></a>
----------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------
Macro to list directories pointed by 'packages' fileref, version `20240711` Macro to list directories pointed by 'packages' fileref, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -908,7 +917,7 @@ filename packages ("D:/NEW_DIR" %extendPackagesFileref()); %* add new directory;
## This is short help information for the `loadPackageAddCnt` macro <a name="loadpackageaddcnt"></a> ## This is short help information for the `loadPackageAddCnt` macro <a name="loadpackageaddcnt"></a>
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Macro to load *additional content* for a SAS package, version `20240711` Macro to load *additional content* for a SAS package, version `20241014`
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating

View File

@@ -42,7 +42,7 @@
- to unload, or - to unload, or
- to generate SAS packages. - to generate SAS packages.
Version 20240711. Version 20241014.
See examples below. See examples below.
A SAS package is a zip file containing a group of files A SAS package is a zip file containing a group of files
@@ -85,11 +85,13 @@
, loadAddCnt=0 /* should the additional content be loaded? , loadAddCnt=0 /* should the additional content be loaded?
default is 0 - means No, 1 means Yes */ default is 0 - means No, 1 means Yes */
, suppressExec=0 /* indicates if loading of exec files , suppressExec=0 /* indicates if loading of exec files
should be suppressed, 1=suppress should be suppressed, 1=suppress */
, DS2force=0 /* indicates if PROC DS2 packages and threads
should be loaded if a data set exists, 0=do not load
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load SAS package, version 20240711. Run %loadPackage() for help info.' des = 'Macro to load SAS package, version 20241014. Run %loadPackage() for help info.'
minoperator minoperator
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -105,7 +107,7 @@ minoperator
%put ### This is short help information for the `loadPackage` macro #; %put ### This is short help information for the `loadPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to *load* SAS packages, version `20240711` #; %put # Macro to *load* SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -165,6 +167,10 @@ minoperator
%put # should be suppressed, default value is `0`, #; %put # should be suppressed, default value is `0`, #;
%put # when set to `1` `exec` files are *not* loaded #; %put # when set to `1` `exec` files are *not* loaded #;
%put # #; %put # #;
%put # - `DS2force=` *Optional.* Indicates if loading of `PROC DS2` packages #;
%put # or threads should overwrite existing SAS data sets. #;
%put # Default value of `0` means "do not overwrite". #;
%put # #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
@@ -214,7 +220,7 @@ minoperator
%GOTO ENDofloadPackage; %GOTO ENDofloadPackage;
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -222,8 +228,9 @@ minoperator
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -266,6 +273,11 @@ minoperator
%let suppressExec = 0; %let suppressExec = 0;
%end; %end;
%if %superq(DS2force) NE 1 %then
%do;
%let DS2force = 0;
%end;
filename &_PackageFileref_. &ZIP. filename &_PackageFileref_. &ZIP.
/* put location of package myPackageFile.zip here */ /* put location of package myPackageFile.zip here */
"&path./%lowcase(&packageName.).&zip." %unquote(&options.) "&path./%lowcase(&packageName.).&zip." %unquote(&options.)
@@ -333,7 +345,7 @@ minoperator
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofloadPackage: %ENDofloadPackage:
%mend loadPackage; %mend loadPackage;
@@ -360,7 +372,7 @@ minoperator
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for help info.' des = 'Macro to unload SAS package, version 20241014. Run %unloadPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -375,7 +387,7 @@ des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for h
%put ### This is short help information for the `unloadPackage` macro #; %put ### This is short help information for the `unloadPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to unload SAS packages, version `20240711` #; %put # Macro to unload SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -442,14 +454,15 @@ des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for h
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -489,7 +502,8 @@ des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for h
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofunloadPackage: %ENDofunloadPackage:
%mend unloadPackage; %mend unloadPackage;
@@ -524,7 +538,7 @@ des = 'Macro to unload SAS package, version 20240711. Run %unloadPackage() for h
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage() for help info.' des = 'Macro to get help about SAS package, version 20241014. Run %helpPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -539,7 +553,7 @@ des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage()
%put ### This is short help information for the `helpPackage` macro #; %put ### This is short help information for the `helpPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to get help about SAS packages, version `20240711` #; %put # Macro to get help about SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -616,14 +630,15 @@ des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage()
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -666,7 +681,8 @@ des = 'Macro to get help about SAS package, version 20240711. Run %helpPackage()
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofhelpPackage: %ENDofhelpPackage:
%mend helpPackage; %mend helpPackage;
@@ -678,7 +694,7 @@ TODO:
*/ */
/*+installPackage+*/ /*+installPackage+*/
/* Macros to install SAS packages, version 20240711 */ /* Macros to install SAS packages, version 20241014 */
/* A SAS package is a zip file containing a group of files /* A SAS package is a zip file containing a group of files
with SAS code (macros, functions, data steps generating with SAS code (macros, functions, data steps generating
data, etc.) wrapped up together and %INCLUDEed by data, etc.) wrapped up together and %INCLUDEed by
@@ -697,11 +713,12 @@ TODO:
, URLoptions = /* options for the `sourcePath` URLs */ , URLoptions = /* options for the `sourcePath` URLs */
, loadAddCnt=0 /* should the additional content be loaded? , loadAddCnt=0 /* should the additional content be loaded?
default is 0 - means No, 1 means Yes */ default is 0 - means No, 1 means Yes */
, SFRCVN = /* name of a macro variable to store success-failure return code value */
) )
/secure /secure
minoperator minoperator
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to install SAS package, version 20240711. Run %%installPackage() for help info.' des = 'Macro to install SAS package, version 20241014. Run %%installPackage() for help info.'
; ;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
%do; %do;
@@ -716,7 +733,7 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put ### This is short help information for the `installPackage` macro #; %put ### This is short help information for the `installPackage` macro #;
%put #--------------------------------------------------------------------------------------------#;; %put #--------------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to install SAS packages, version `20240711` #; %put # Macro to install SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -760,7 +777,7 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put # - `version=` Indicates which historical version of a package to install. #; %put # - `version=` Indicates which historical version of a package to install. #;
%put # Historical version are available only if `mirror=0` is set. #; %put # Historical version are available only if `mirror=0` is set. #;
%put # Default value is null which means "install the latest". #; %put # Default value is null which means "install the latest". #;
%put # When there are multiple packages to install version #; %put # When there are multiple packages to install version variable #;
%put # is scan sequentially. #; %put # is scan sequentially. #;
%put # #; %put # #;
%put # - `replace=` With default value of `1` it causes existing package file #; %put # - `replace=` With default value of `1` it causes existing package file #;
@@ -780,6 +797,11 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put # directory in `<packageName>_AdditionalContent` folder. #; %put # directory in `<packageName>_AdditionalContent` folder. #;
%put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #; %put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #;
%put # #; %put # #;
%put # - `SFRCVN=` *Optional.* Provides a NAME for a macro variable to store value of the #;
%put # *success-failure return code* of the installation process. Return value #;
%put # has the following form: `<number of successes>.<number of failures>` #;
%put # The macro variable is created as a *global* macro variable. #;
%put # #;
%put #--------------------------------------------------------------------------------------------#; %put #--------------------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #; %put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
@@ -828,7 +850,7 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
@@ -837,8 +859,9 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
/* /*
Reference: Reference:
@@ -912,6 +935,10 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put ; %put ;
%put INFO: Calling: &packagesNames.; %put INFO: Calling: &packagesNames.;
%Local PackagesInstalledSussess PackagesInstalledFail;
%Let PackagesInstalledSussess=;
%let PackagesInstalledFail=;
%do i = 1 %to %sysfunc(countw(&packagesNames., , S)); %do i = 1 %to %sysfunc(countw(&packagesNames., , S));
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
%local packageName packageSubDir vers versA versB; %local packageName packageSubDir vers versA versB;
@@ -945,7 +972,9 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%do; %do;
%let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas; %let SPFinitMirror = https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/&vers./SPF/SPFinit.sas;
%end; %end;
%if %superq(mirror) > 1 %then
%put %str( )Mirror %superq(mirror) does not support versioning.;
filename &in URL filename &in URL
"&SPFinitMirror." "&SPFinitMirror."
recfm=N lrecl=1; recfm=N lrecl=1;
@@ -965,6 +994,12 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%let packageSubDir = %lowcase(&packageName.)/raw/&vers./; %let packageSubDir = %lowcase(&packageName.)/raw/&vers./;
%end; %end;
%end; %end;
%else
%do;
%if %superq(mirror) > 0 %then
%put %str( )Mirror %superq(mirror) does not support versioning.;
%end;
filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip" filename &in URL "&sourcePath.&packageSubDir.%lowcase(&packageName.).zip"
%if (%superq(URLuser) ne ) %then %if (%superq(URLuser) ne ) %then
%do; %do;
@@ -1039,6 +1074,21 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
filename &in clear; filename &in clear;
filename &out clear; filename &out clear;
%if 0 = &installationRC. %then
%do;
%if %superq(vers)= %then
%Let PackagesInstalledSussess=&PackagesInstalledSussess. &packageName.;
%else
%Let PackagesInstalledSussess=&PackagesInstalledSussess. &packageName.(&vers.);
%end;
%else
%do;
%if %superq(vers)= %then
%Let PackagesInstalledFail=&PackagesInstalledFail. &packageName.;
%else
%let PackagesInstalledFail=&PackagesInstalledFail. &packageName.(&vers.);
%end;
%if 1 = &loadAddCnt. %if 1 = &loadAddCnt.
AND 0 = &installationRC. AND 0 = &installationRC.
AND NOT (%upcase(&packageName.) in (SPFINIT SASPACKAGEFRAMEWORK SASPACKAGESFRAMEWORK)) AND NOT (%upcase(&packageName.) in (SPFINIT SASPACKAGEFRAMEWORK SASPACKAGESFRAMEWORK))
@@ -1054,14 +1104,60 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
%put *** %lowcase(&packageName.) end *******************************************; %put *** %lowcase(&packageName.) end *******************************************;
/*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/ /*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*/
%end; %end;
%local sucsCount sucsCountWords;
%let sucsCount=0;
%if NOT(%superq(PackagesInstalledSussess)=) %then
%do;
%put %str( );
%let sucsCount=%sysfunc(countw(%superq(PackagesInstalledSussess),%str( )));
%if 1=&sucsCount. %then
%put INFO: Package %superq(PackagesInstalledSussess) installed.;
%else %if 1<&sucsCount. %then
%do;
%let sucsCountWords=%sysfunc(abs(&sucsCount.),words.);
%put INFO: Successfully installed &sucsCountWords. packages:;
%put %str( )&PackagesInstalledSussess.;
%end;
%end;
%local failCount failCountWords;
%let failCount=0;
%if NOT(%superq(PackagesInstalledFail)=) %then
%do;
%put %str( );
%let failCount=%sysfunc(countw(%superq(PackagesInstalledFail),%str( )));
%if 1=&failCount. %then
%put WARNING: Failed to install %superq(PackagesInstalledFail) package.;
%else %if 1<&failCount. %then
%do;
%let failCountWords=%sysfunc(abs(&failCount.),words.);
%put WARNING: Failed to install &failCountWords. packages:;
%put WARNING- &PackagesInstalledFail.;
%end;
%end;
%put %str( );
%if NOT(%superq(SFRCVN)=) %then
%do;
data _null_;
length SFRCVN $ 32;
SFRCVN = compress(symget('SFRCVN'),"_","KAD");
value = "&sucsCount..&failCount.";
put 'INFO: Success-Failure-Return-Code macroVariable Name is: ' SFRCVN
/ ' with value: ' value
/ ;
call symputX(SFRCVN, value, "G");
run;
%end;
%packagesListError: %packagesListError:
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofinstallPackage: %ENDofinstallPackage:
%mend installPackage; %mend installPackage;
@@ -1170,7 +1266,7 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
Macro to list SAS packages in packages folder. Macro to list SAS packages in packages folder.
Version 20240711 Version 20241014
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -1188,8 +1284,9 @@ des = 'Macro to install SAS package, version 20240711. Run %%installPackage() fo
*//*** HELP END ***/ *//*** HELP END ***/
%macro listPackages()/secure PARMBUFF %macro listPackages()
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20240711.' /secure PARMBUFF
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20241014.'
; ;
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then %if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
%do; %do;
@@ -1204,7 +1301,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE
%put ### This is short help information for the `listPackages` macro #; %put ### This is short help information for the `listPackages` macro #;
%put #-----------------------------------------------------------------------------------------#;; %put #-----------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to list available SAS packages, version `20240711` #; %put # Macro to list available SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -1355,7 +1452,7 @@ options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.;
Macro to generate SAS packages. Macro to generate SAS packages.
Version 20240711 Version 20241014
A SAS package is a zip file containing a group A SAS package is a zip file containing a group
of SAS codes (macros, functions, data steps generating of SAS codes (macros, functions, data steps generating
@@ -1395,7 +1492,7 @@ options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.;
file name be created */ file name be created */
)/ secure minoperator )/ secure minoperator
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to generate SAS packages, version 20240711. Run %generatePackage() for help info.' des = 'Macro to generate SAS packages, version 20241014. Run %generatePackage() for help info.'
; ;
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then %if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
%do; %do;
@@ -1410,7 +1507,7 @@ des = 'Macro to generate SAS packages, version 20240711. Run %generatePackage()
%put ### This is short help information for the `generatePackage` macro #; %put ### This is short help information for the `generatePackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to generate SAS packages, version `20240711` #; %put # Macro to generate SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -1879,6 +1976,18 @@ DESCRIPTION END:
| | | |
| +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case] | +-abc.sas [a file with a KMF-abbreviation snippet ABC, _with_ proper tagging, snippets names are in low-case]
| |
+-013_ds2pck [one file one PROC DS2 package]
| |
| +-abc.sas [a data set with a package ABC stored in WORK.ABC data set]
| |
| +-library.xyz.sas [a data set with a package LIBRARY.XYZ stored in LIBRARY.XYZ data set]
|
+-014_ds2thr [one file one PROC DS2 thread]
| |
| +-abc.sas [a data set with a thread ABC stored in WORK.ABC data set]
| |
| +-library.xyz.sas [a data set with a thread LIBRARY.XYZ stored in LIBRARY.XYZ data set]
|
+-<sequential number>_<type [in lower case]> +-<sequential number>_<type [in lower case]>
| |
+-00n_clean [if you need to clean something up after exec file execution, +-00n_clean [if you need to clean something up after exec file execution,
@@ -1961,6 +2070,7 @@ data &filesWithCodes.;
'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN' 'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN'
'LAZYDATA' 'TEST' 'CASLUDF' 'LAZYDATA' 'TEST' 'CASLUDF'
'ADDCNT' 'KMFSNIP' 'ADDCNT' 'KMFSNIP'
'DS2PCK' 'DS2THR'
)) ))
then then
do; do;
@@ -2039,6 +2149,9 @@ run;
%let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source)); %let notesSourceOptions = %sysfunc(getoption(notes)) %sysfunc(getoption(source));
options NOnotes NOsource; options NOnotes NOsource;
options mprint;
options notes source;
proc sort data = &filesWithCodes.; proc sort data = &filesWithCodes.;
by order type file; by order type file;
run; run;
@@ -2145,7 +2258,7 @@ run;
/* code inspired by Kurt Bremser's "Talking to Your Host" article */ /* code inspired by Kurt Bremser's "Talking to Your Host" article */
/* https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344 */ /* https://communities.sas.com/t5/SAS-User-Groups-Library/WUSS-Presentation-Talking-to-Your-Host/ta-p/838344 */
/* WUSS 2022 */ /* WUSS 2022 */
data &filesWithCodes.addCnt; data &filesWithCodes.addCnt;
run; run;
@@ -2207,9 +2320,12 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */ title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */
%end; %end;
footnote1 "SAS Packages Framework, version 20240711"; footnote1 "SAS Packages Framework, version 20241014";
proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent); proc print
data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent)
width=full
;
run; run;
title; title;
@@ -2228,7 +2344,7 @@ title;
title2 "Package additional content:"; title2 "Package additional content:";
proc print proc print
data=&filesWithCodes.addCnt(drop=root dir level) data=&filesWithCodes.addCnt(drop=root dir level)
label label width=full
; ;
run; run;
%end; %end;
@@ -2463,6 +2579,8 @@ data _null_;
isProto = 0; isProto = 0;
isIMLmodule = 0; isIMLmodule = 0;
isCASLudf = 0; isCASLudf = 0;
isDS2pck = 0;
isDS2thr = 0;
%if (%superq(packageRequired) ne ) %if (%superq(packageRequired) ne )
or (%superq(packageReqPackages) ne ) or (%superq(packageReqPackages) ne )
@@ -2702,7 +2820,7 @@ data _null_;
('LIBNAME' 'MACRO' /*'MACROS'*/ 'DATA' ('LIBNAME' 'MACRO' /*'MACROS'*/ 'DATA'
'FUNCTION' /*'FUNCTIONS'*/ 'FORMAT' /*'FORMATS'*/ 'FUNCTION' /*'FUNCTIONS'*/ 'FORMAT' /*'FORMATS'*/
'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN' 'IMLMODULE' 'PROTO' 'EXEC' 'CLEAN'
'LAZYDATA' 'TEST' 'ADDCNT' 'KMFSNIP')) 'LAZYDATA' 'TEST' 'ADDCNT' 'KMFSNIP' 'DS2PCK' 'DS2THR'))
then then
do; do;
putlog 'WARNING: Type ' type 'is not yet supported.'; putlog 'WARNING: Type ' type 'is not yet supported.';
@@ -2713,8 +2831,11 @@ data _null_;
isFormat + (upcase(type)=:'FORMAT'); isFormat + (upcase(type)=:'FORMAT');
isProto + (upcase(type)=:'PROTO'); isProto + (upcase(type)=:'PROTO');
isIMLmodule + (upcase(type)=:'IMLMODULE'); isIMLmodule + (upcase(type)=:'IMLMODULE');
isDS2pck + (upcase(type)=:'DS2PCK');
isDS2thr + (upcase(type)=:'DS2THR');
/* HEADERS for IML, FCMP, and PROTO - start */
/* HEADERS for PROC IML, FCMP, and PROTO - start */
if 1 = isFunction and upcase(type)=:'FUNCTION' then if 1 = isFunction and upcase(type)=:'FUNCTION' then
do; do;
/* macro variable for test if cherry picking used FCMP */ /* macro variable for test if cherry picking used FCMP */
@@ -2772,7 +2893,7 @@ data _null_;
/* header, for IML modules */ /* header, for IML modules */
put "proc iml ; "; put "proc iml ; ";
end; end;
/* HEADERS for IML, FCMP, and PROTO - end */ /* HEADERS for PROC IML, FCMP, and PROTO - end */
put ' ' / put ' ' /
'%if (%str(*)=%superq(cherryPick)) or (' fileshort +(-1) ' in %superq(cherryPick)) %then %do; '; /* Cherry Pick test1 start */ '%if (%str(*)=%superq(cherryPick)) or (' fileshort +(-1) ' in %superq(cherryPick)) %then %do; '; /* Cherry Pick test1 start */
@@ -2783,6 +2904,8 @@ data _null_;
put ' %put %sysfunc(ifc(%SYSMACEXIST(' fileshort +(-1) ')=1, NOTE# Macro ' fileshort put ' %put %sysfunc(ifc(%SYSMACEXIST(' fileshort +(-1) ')=1, NOTE# Macro ' fileshort
"exist. It will be overwritten by the macro from the &packageName. package, ));"; "exist. It will be overwritten by the macro from the &packageName. package, ));";
/* separate approach for EXEC */
if upcase(type)=:'EXEC' then if upcase(type)=:'EXEC' then
do; do;
/* User can suppress running the exec files */ /* User can suppress running the exec files */
@@ -2805,9 +2928,84 @@ data _null_;
/ ' )));' / ' )));'
; ;
end; end;
else /* separate approach for DS2 */
else if (upcase(type) in: ('DS2PCK' 'DS2THR')) then
do; do;
/* include the file with the code of the element */ if 1 = isDS2pck and upcase(type)=:'DS2PCK' then
do;
/* macro variable for test if cherry picking used DS2 package */
put 'data _null_; ';
put " call symputX('cherryPick_DS2PCK', 0, 'L'); ";
put 'run; ';
end;
if 1 = isDS2thr and upcase(type)=:'DS2THR' then
do;
/* macro variable for test if cherry picking used DS2 threads */
put 'data _null_; ';
put " call symputX('cherryPick_DS2THR', 0, 'L'); ";
put 'run; ';
end;
/* since DS2 packages and threads are stored in SAS data sets */
/* we have to check (before loading) if there is no "regular" */
/* data set (or view) with the same name to avoid overwriting */
if upcase(type) in: ('DS2PCK' 'DS2THR') then
do;
length DS2lib $ 8 DS2ds $ 32;
DS2lib = coalescec(scan(fileshort,-2,"."), "WORK");
DS2ds = scan(fileshort,-1,".");
put '%put %sysfunc(ifc(%sysfunc(exist(' fileshort +(-1) '))=1,'
/ '%sysfunc(dosubl(%str(options ps=min; title; options msglevel=n nodate notes source nomprint;'
/ ' data _null_;'
/ ' id = OPEN("' fileshort +(-1) '");'
/ ' if id then do;'
/ ' x = VARNUM(id, "SAS_CHECKSUM_") AND VARNUM(id, "SAS_ROWID_") AND (VARNUM(id, "SAS_TEXTTHREAD_") OR VARNUM(id, "SAS_TEXTPACKAGE_"));'
/ ' y = ("DATA"=ATTRC(id, "MTYPE"));'
/ ' if symexist("DS2force") then z = symgetn("DS2force"); else z = 0;'
/ ' if (x AND y) OR z then do;'
/ ' call execute("proc delete data=' fileshort +(-1) '; run;");'
/ " put 'NOTE# The " fileshort "will be overwritten by the PROC DS2 package/thread from the &packageName. package.';"
/* header for each DS2 packages or threads in PROC DS2 run */
/ ' call execute("proc ds2;");'
/ ' call execute(''%include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'');'
/* footer for each DS2 packages or threads in PROC DS2 run */
/ ' call execute("run; quit;");'
/ ' call execute("options nonotes; proc datasets lib=' DS2lib 'noprint;");'
/ " call execute('modify " DS2ds "(label=""Package: &packageName. ; Type: " type "; Name: " fileshort """);');"
/ ' call execute("run; quit;");'
/ ' end;'
/ ' else put "WARNING: Data set ' fileshort 'exist and is not a PROC DS2 package/thread!"'
/ ' / "WARNING- PROC DS2 package/thread ' fileshort 'will not be generated..."; '
/ ' id = CLOSE(id);'
/ ' end;'
/ ' run;))),'
/ '%sysfunc(dosubl(%str(options ps=min; title; options msglevel=n nodate notes source nomprint;'
/* header for each DS2 packages or threads in PROC DS2 run */
/ ' proc ds2;'
/ ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'
/* footer for each DS2 packages or threads in PROC DS2 run */
/ ' run; quit;'
/ ' options nonotes; proc datasets lib=' DS2lib 'noprint;'
/ " modify " DS2ds "(label=""Package: &packageName. ; Type: " type "; Name: " fileshort """);"
/ ' run; quit;'
/ '))),'
/ '));'
/ " "
/ ;
end;
end;
else
do;
/* include the file with the code of the element, all other cases */
put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'; put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;';
end; end;
@@ -2823,13 +3021,19 @@ data _null_;
if upcase(type)=:'FORMAT' then if upcase(type)=:'FORMAT' then
put ' %let cherryPick_FORMAT = %eval(&cherryPick_FORMAT. + 1);'; put ' %let cherryPick_FORMAT = %eval(&cherryPick_FORMAT. + 1);';
if upcase(type)=:'DS2PCK' then
put ' %let cherryPick_DS2PCK = %eval(&cherryPick_DS2PCK. + 1);';
if upcase(type)=:'DS2THR' then
put ' %let cherryPick_DS2THR = %eval(&cherryPick_DS2THR. + 1);';
put '%end; ' /; /* Cherry Pick test1 end */ put '%end; ' /; /* Cherry Pick test1 end */
/* FOOTERS for IML, FCMP, and PROTO - start */ /* FOOTERS for PROC IML, FCMP, and PROTO - start */
if 1 = LAST.type and upcase(type) in ('FUNCTIONS' 'PROTO' 'FORMATS') then if 1 = LAST.type and upcase(type) in ('FUNCTIONS' 'PROTO' 'FORMATS') then
do; /* footer, for multiple functions in one FCMP run, one PROTO run, or one FORMAT run */ do; /* footer, for multiple functions in one FCMP run, one PROTO run, or one FORMAT run */
put "run; " / ; put "quit; " / ;
end; end;
if 1 = LAST.type and upcase(type)='IMLMODULE' then /* footer, for IML modules */ if 1 = LAST.type and upcase(type)='IMLMODULE' then /* footer, for IML modules */
do; do;
@@ -2840,7 +3044,7 @@ data _null_;
'%end; ' / '%end; ' /
"quit; " / ; "quit; " / ;
end; end;
/* FOOTERS for IML, FCMP, and PROTO - end */ /* FOOTERS for PROC IML, FCMP, and PROTO - end */
/* add the link to the functions dataset, only for the first occurrence */ /* add the link to the functions dataset, only for the first occurrence */
/*if 1 = isFunction and (upcase(type)=:'FUNCTION') then /*if 1 = isFunction and (upcase(type)=:'FUNCTION') then
@@ -2928,7 +3132,7 @@ data _null_;
%end; %end;
put +(-1) '`.;''' / put +(-1) '`.;''' /
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' / ' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
' !! '' %put with the SAS Packages Framework version 20240711.;''' / ' !! '' %put with the SAS Packages Framework version 20241014.;''' /
' !! '' %put ****************************************************************************;''' / ' !! '' %put ****************************************************************************;''' /
' !! '' %GOTO theEndOfTheMacro;''' / ' !! '' %GOTO theEndOfTheMacro;''' /
' !! '' %end;''' ; ' !! '' %end;''' ;
@@ -3093,7 +3297,7 @@ data _null_;
%end; %end;
put +(-1) '`.; '' !!' / put +(-1) '`.; '' !!' /
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' / ''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
''' %put with the SAS Packages Framework version 20240711.; '' !! ' / ''' %put with the SAS Packages Framework version 20241014.; '' !! ' /
''' %put ****************************************************************************; '' !! ' / ''' %put ****************************************************************************; '' !! ' /
''' %GOTO theEndOfTheMacro; '' !! ' / ''' %GOTO theEndOfTheMacro; '' !! ' /
''' %end; '' !! ' / ''' %end; '' !! ' /
@@ -3608,15 +3812,33 @@ data _null_;
/* put 'remove module = ' fileshort ';'; */ /* put 'remove module = ' fileshort ';'; */
end; end;
/* delete datasets */ /* delete data sets */
put "proc sql noprint;"; put "proc fedsql noprint;";
EOF = 0; EOF = 0;
do until(EOF); do until(EOF);
set &filesWithCodes. end = EOF; set &filesWithCodes. end = EOF;
if not (upcase(type)=:'DATA') then continue; if not (upcase(type) in: ('DATA')) then continue;
put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'; put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;';
put '%put NOTE- ;'; put '%put NOTE- ;';
put 'drop table ' fileshort ';' /; put 'drop table ' fileshort ' FORCE;' /;
end;
put "quit;" /;
/* delete PROC DS2 packages or threads */
put 'data _null_; call symputx("_DS2_2_del_",0,"L"); run;';
put "proc fedsql noprint;";
EOF = 0;
do until(EOF);
set &filesWithCodes. end = EOF;
if not (upcase(type) in: ('DS2PCK' 'DS2THR')) then continue;
put '%put NOTE- Element of type ' type 'generated from the file "' file +(-1) '" will be deleted;'
/ '%put NOTE- ;'
/ '%let _DS2_2_del_ = %sysfunc(open(' fileshort '));'
/ '%sysfunc(ifc(&_DS2_2_del_. AND %sysfunc(ATTRC(&_DS2_2_del_.,LABEL))='
/ '%str(' "Package: &packageName. ; Type: " type "; Name: " fileshort +(-1) '),drop table ' fileshort ' FORCE,)) ;'
/ '%let _DS2_2_del_ = %sysfunc(close(&_DS2_2_del_.));'
;
put ';' /;
end; end;
put "quit;" /; put "quit;" /;
@@ -3744,12 +3966,13 @@ data _null_;
length fileshort2 $ 256; length fileshort2 $ 256;
select; select;
when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" );
when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'" );
when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" ); when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) in ('DS2PCK' 'DS2THR')) fileshort2 = cats("'DS2", fileshort, "'" );
otherwise fileshort2 = fileshort; otherwise fileshort2 = fileshort;
end; end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2); strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -3881,7 +4104,7 @@ data _null_;
%end; %end;
put 'put " " / @3 "--------------------------------------------------------------------" / " ";' put 'put " " / @3 "--------------------------------------------------------------------" / " ";'
/ 'put @3 "*SAS package generated by SAS Package Framework, version `20240711`*";' / 'put @3 "*SAS package generated by SAS Package Framework, version `20241014`*";'
/ 'put " " / @3 "--------------------------------------------------------------------";'; / 'put " " / @3 "--------------------------------------------------------------------";';
put 'run; ' /; put 'run; ' /;
@@ -3920,13 +4143,14 @@ data _null_;
length fileshort2 $ 256; length fileshort2 $ 256;
select; select;
when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" ); when (upcase(type) in ("DATA" "LAZYDATA")) fileshort2 = cats("'", fileshort, "'" );
when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'"); when (upcase(type) =: "MACRO" ) fileshort2 = cats('''%', fileshort, "()'" );
when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "FUNCTION" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "IMLMODULE" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "PROTO" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" ); when (upcase(type) =: "FORMAT" ) fileshort2 = cats("'$", fileshort, ".'" );
when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("'", fileshort, "()'" ); when (upcase(type) =: "CASLUDF" ) fileshort2 = cats("'", fileshort, "()'" );
when (upcase(type) in ('DS2PCK' 'DS2THR')) fileshort2 = cats("'DS2", fileshort, "'" );
otherwise fileshort2 = fileshort; otherwise fileshort2 = fileshort;
end; end;
strX = catx('/', folder, order, type, file, fileshort, fileshort2); strX = catx('/', folder, order, type, file, fileshort, fileshort2);
@@ -4918,7 +5142,7 @@ data &filesWithCodes.markdown;
%end; %end;
put " " / "--------------------------------------------------------------------" / " " put " " / "--------------------------------------------------------------------" / " "
/ "*SAS package generated by SAS Package Framework, version `20240711`*" / "*SAS package generated by SAS Package Framework, version `20241014`*"
/ " " / "--------------------------------------------------------------------" / " "; / " " / "--------------------------------------------------------------------" / " ";
put "# The `&packageName.` package content"; put "# The `&packageName.` package content";
@@ -5196,7 +5420,7 @@ TODO: (in Polish)
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load multiple SAS packages at one run, version 20240711. Run %loadPackages() for help info.' des = 'Macro to load multiple SAS packages at one run, version 20241014. Run %loadPackages() for help info.'
parmbuff parmbuff
; ;
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then %if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
@@ -5212,7 +5436,7 @@ parmbuff
%put ### This is short help information for the `loadPackageS` macro #; %put ### This is short help information for the `loadPackageS` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro wrapper for the loadPackage macro, version `20240711` #; %put # Macro wrapper for the loadPackage macro, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -5309,7 +5533,7 @@ parmbuff
hashing_file() function, SAS 9.4M6 */ hashing_file() function, SAS 9.4M6 */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %verifyPackage() for help info.' des = 'Macro to verify SAS package with the hash digest, version 20241014. Run %verifyPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -5324,7 +5548,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
%put ### This is short help information for the `verifyPackage` macro #; %put ### This is short help information for the `verifyPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to verify SAS package with it hash digest, version `20240711` #; %put # Macro to verify SAS package with it hash digest, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -5379,7 +5603,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
%GOTO ENDofverifyPackage; %GOTO ENDofverifyPackage;
%end; %end;
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -5387,8 +5611,9 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -5472,7 +5697,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofverifyPackage: %ENDofverifyPackage:
%mend verifyPackage; %mend verifyPackage;
@@ -5503,7 +5728,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20240711. Run %
*/ */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to preview content of a SAS package, version 20240711. Run %previewPackage() for help info.' des = 'Macro to preview content of a SAS package, version 20241014. Run %previewPackage() for help info.'
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
%do; %do;
@@ -5518,7 +5743,7 @@ des = 'Macro to preview content of a SAS package, version 20240711. Run %preview
%put ### This is short help information for the `previewPackage` macro #; %put ### This is short help information for the `previewPackage` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to get preview of a SAS packages, version `20240711` #; %put # Macro to get preview of a SAS packages, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -5586,13 +5811,15 @@ des = 'Macro to preview content of a SAS package, version 20240711. Run %preview
%GOTO ENDofpreviewPackage; %GOTO ENDofpreviewPackage;
%end; %end;
%local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp; %local ls_tmp ps_tmp notes_tmp source_tmp msglevel_tmp mautocomploc_tmp;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
%let source_tmp = %sysfunc(getoption(source)); %let source_tmp = %sysfunc(getoption(source));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N; %let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
options NOnotes NOsource ls=MAX ps=MAX msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -5632,7 +5859,8 @@ des = 'Macro to preview content of a SAS package, version 20240711. Run %preview
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!; %else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
filename &_PackageFileref_. clear; filename &_PackageFileref_. clear;
options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp. msglevel = &msglevel_tmp.; options ls = &ls_tmp. ps = &ps_tmp. &notes_tmp. &source_tmp.
msglevel = &msglevel_tmp. &mautocomploc_tmp.;
%ENDofpreviewPackage: %ENDofpreviewPackage:
%mend previewPackage; %mend previewPackage;
@@ -5645,7 +5873,7 @@ des = 'Macro to preview content of a SAS package, version 20240711. Run %preview
when empty the "packages" value is used */ when empty the "packages" value is used */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to list directories pointed by "packages" fileref, version 20240711. Run %extendPackagesFileref(HELP) for help info.' des = 'Macro to list directories pointed by "packages" fileref, version 20241014. Run %extendPackagesFileref(HELP) for help info.'
; ;
%if %QUPCASE(&packages.) = HELP %then %if %QUPCASE(&packages.) = HELP %then
@@ -5661,7 +5889,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20240711
%put ### This is short help information for the `extendPackagesFileref` macro #; %put ### This is short help information for the `extendPackagesFileref` macro #;
%put #-----------------------------------------------------------------------------------------#;; %put #-----------------------------------------------------------------------------------------#;;
%put # #; %put # #;
%put # Macro to list directories pointed by 'packages' fileref, version `20240711` #; %put # Macro to list directories pointed by 'packages' fileref, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -5762,7 +5990,7 @@ filename packages list;
is provided in required version */ is provided in required version */
)/secure )/secure
/*** HELP END ***/ /*** HELP END ***/
des = 'Macro to load additional content for a SAS package, version 20240711. Run %loadPackageAddCnt() for help info.' des = 'Macro to load additional content for a SAS package, version 20241014. Run %loadPackageAddCnt() for help info.'
minoperator minoperator
; ;
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then %if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
@@ -5778,7 +6006,7 @@ minoperator
%put ### This is short help information for the `loadPackageAddCnt` macro #; %put ### This is short help information for the `loadPackageAddCnt` macro #;
%put #-------------------------------------------------------------------------------#; %put #-------------------------------------------------------------------------------#;
%put # #; %put # #;
%put # Macro to *load* additional content for a SAS package, version `20240711` #; %put # Macro to *load* additional content for a SAS package, version `20241014` #;
%put # #; %put # #;
%put # A SAS package is a zip file containing a group #; %put # A SAS package is a zip file containing a group #;
%put # of SAS codes (macros, functions, data steps generating #; %put # of SAS codes (macros, functions, data steps generating #;
@@ -5843,7 +6071,7 @@ minoperator
%GOTO ENDofloadPackageAddCnt; %GOTO ENDofloadPackageAddCnt;
%end; %end;
/* local variables for options */ /* local variables for options */
%local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp zip; %local ls_tmp ps_tmp notes_tmp source_tmp stimer_tmp fullstimer_tmp msglevel_tmp mautocomploc_tmp zip;
%let ls_tmp = %sysfunc(getoption(ls)); %let ls_tmp = %sysfunc(getoption(ls));
%let ps_tmp = %sysfunc(getoption(ps)); %let ps_tmp = %sysfunc(getoption(ps));
%let notes_tmp = %sysfunc(getoption(notes)); %let notes_tmp = %sysfunc(getoption(notes));
@@ -5851,10 +6079,11 @@ minoperator
%let stimer_tmp = %sysfunc(getoption(stimer)); %let stimer_tmp = %sysfunc(getoption(stimer));
%let fullstimer_tmp = %sysfunc(getoption(fullstimer)); %let fullstimer_tmp = %sysfunc(getoption(fullstimer));
%let msglevel_tmp = %sysfunc(getoption(msglevel)); %let msglevel_tmp = %sysfunc(getoption(msglevel));
%let mautocomploc_tmp = %sysfunc(getoption(mautocomploc));
%let zip = zip; %let zip = zip;
options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N; options NOnotes NOsource ls=MAX ps=MAX NOfullstimer NOstimer msglevel=N NOmautocomploc;
%local _PackageFileref_; %local _PackageFileref_;
/* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */ /* %let _PackageFileref_ = P%sysfunc(MD5(%lowcase(&packageName.)),hex7.); */
@@ -6107,7 +6336,7 @@ minoperator
options ls = &ls_tmp. ps = &ps_tmp. options ls = &ls_tmp. ps = &ps_tmp.
&notes_tmp. &source_tmp. &notes_tmp. &source_tmp.
&stimer_tmp. &fullstimer_tmp. &stimer_tmp. &fullstimer_tmp.
msglevel=&msglevel_tmp.; msglevel=&msglevel_tmp. &mautocomploc_tmp.;
%ENDofloadPackageAddCnt: %ENDofloadPackageAddCnt:
%mend loadPackageAddCnt; %mend loadPackageAddCnt;

View File

@@ -1,4 +1,4 @@
Copyright (c) 2019 - 2023 Bartosz Jablonski Copyright (c) 2019 - 2024 Bartosz Jablonski
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -24,7 +24,7 @@ run;
``` ```
SHA256 digest for SQLinDS: F*3C010734B76CA7459C4D35087C899121011CD4AA2932B56335FF11A805C8EF8D SHA256 digest for SQLinDS: F*3C010734B76CA7459C4D35087C899121011CD4AA2932B56335FF11A805C8EF8D
[Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS") [Documentation for SQLinDS](https://github.com/SASPAC/blob/main/sqlinds.md "Documentation for SQLinDS")
--- ---
@@ -57,7 +57,7 @@ run;
``` ```
SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045BEB958168 SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045BEB958168
[Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA") [Documentation for DFA](https://github.com/SASPAC/blob/main/dfa.md "Documentation for DFA")
--- ---
@@ -82,11 +82,11 @@ SHA256 digest for DFA: F*012375D87F66EB3A7BF5DDD0CC5AEE28851733EE33CC63231DF9045
``` ```
SHA256 digest for macroArray: F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790 SHA256 digest for macroArray: F*3F3893F1FCD78719543703E4353F4CC19811D247C016F220FF729B283C1AD790
[Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray") [Documentation for macroArray](https://github.com/SASPAC/blob/main/macroarray.md "Documentation for macroArray")
--- ---
- **BasePlus**\[2.0.1\] adds a bunch of functionalities I am missing in BASE SAS, such as: - **BasePlus**\[2.1.0\] adds a bunch of functionalities I am missing in BASE SAS, such as:
```sas ```sas
call arrMissToRight(myArray); call arrMissToRight(myArray);
call arrFillMiss(17, myArray); call arrFillMiss(17, myArray);
@@ -118,9 +118,9 @@ format x bool.;
%put #%expandDataSetsList(lib=sashelp,datasets=_all_)#; %put #%expandDataSetsList(lib=sashelp,datasets=_all_)#;
``` ```
SHA256 digest for BasePlus: F*FB102C9B12E870666C15A651017D48E0141E47D64C11437350D0EC75A7E9E609 SHA256 digest for BasePlus: F*DFA83F8E0D7424DEB63D49620392068BC68D766552E2804CB6B01DE8E5A87769
[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus") [Documentation for BasePlus](https://github.com/SASPAC/blob/main/baseplus.md "Documentation for BasePlus")
--- ---
@@ -135,7 +135,7 @@ SHA256 digest for BasePlus: F*FB102C9B12E870666C15A651017D48E0141E47D64C11437350
SHA256 digest for GSM: F*80197391195C3EC41BD436DF0C8802D3920E4D22B64009A7DE872FBDF8D4B86E SHA256 digest for GSM: F*80197391195C3EC41BD436DF0C8802D3920E4D22B64009A7DE872FBDF8D4B86E
[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM") [Documentation for GSM](https://github.com/SASPAC/blob/main/gsm.md "Documentation for GSM")
--- ---

View File

@@ -1,3 +1,6 @@
/* 20240909 */
BasePlus: F*DFA83F8E0D7424DEB63D49620392068BC68D766552E2804CB6B01DE8E5A87769
/* 20240724 */ /* 20240724 */
BasePlus: F*FB102C9B12E870666C15A651017D48E0141E47D64C11437350D0EC75A7E9E609 BasePlus: F*FB102C9B12E870666C15A651017D48E0141E47D64C11437350D0EC75A7E9E609

View File

@@ -9,22 +9,22 @@
### Version information: ### Version information:
- Package: BasePlus - Package: BasePlus
- Version: 2.0.1 - Version: 2.1.0
- Generated: 2024-07-24T07:58:59 - Generated: 2024-09-09T12:55:04
- Author(s): Bartosz Jablonski (yabwon@gmail.com), Quentin McMullen (qmcmullen@gmail.com) - Author(s): Bartosz Jablonski (yabwon@gmail.com), Quentin McMullen (qmcmullen@gmail.com)
- Maintainer(s): Bartosz Jablonski (yabwon@gmail.com) - Maintainer(s): Bartosz Jablonski (yabwon@gmail.com)
- License: MIT - License: MIT
- File SHA256: `F*FB102C9B12E870666C15A651017D48E0141E47D64C11437350D0EC75A7E9E609` for this version - File SHA256: `F*DFA83F8E0D7424DEB63D49620392068BC68D766552E2804CB6B01DE8E5A87769` for this version
- Content SHA256: `C*0444AC5B54150AE5424D335FF89A03D831F00F60898C99250CD59E0C5C5B0398` for this version - Content SHA256: `C*AB16F5B6538515607C3C254E401DC1ACA7293AB36990227F6E7792145CEEAB87` for this version
--- ---
# The `BasePlus` package, version: `2.0.1`; # The `BasePlus` package, version: `2.1.0`;
--- ---
# The BasePlus package [ver. 2.0.1] <a name="baseplus-package"></a> ############################################### # The BasePlus package [ver. 2.1.0] <a name="baseplus-package"></a> ###############################################
The **BasePlus** package implements useful The **BasePlus** package implements useful
functions and functionalities I miss in the BASE SAS. functions and functionalities I miss in the BASE SAS.
@@ -2035,6 +2035,9 @@ plots of kernel density estimates, jitter data values, and box-and-whiskers plot
See examples below for the details. See examples below for the details.
The "Here Comes the Rain (Cloud Plot) Again" (B. Jablonski, 2024) article
describing the macro is attached as an additional content to the package.
### SYNTAX: ################################################################### ### SYNTAX: ###################################################################
The basic syntax is the following, the `<...>` means optional parameters: The basic syntax is the following, the `<...>` means optional parameters:
@@ -2052,6 +2055,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
<,boxPlotSymbolSize=> <,boxPlotSymbolSize=>
<,boxPlotLineSize=> <,boxPlotLineSize=>
<,boxPlotFill=> <,boxPlotFill=>
<,whiskerScale=>
<,meanShiftLine=> <,meanShiftLine=>
<,meanShiftStep=> <,meanShiftStep=>
<,meanShiftColors=> <,meanShiftColors=>
@@ -2147,6 +2151,12 @@ The basic syntax is the following, the `<...>` means optional parameters:
Transparency of the box plot. Transparency of the box plot.
Ranges from 0.0 (opaque) to 1.0 (full translucent). Ranges from 0.0 (opaque) to 1.0 (full translucent).
* `whiskerScale=` - *Optional*, default value `1.5`.
It provides `WS` parameter in the `Q1 - WS*IQR`
formula and the `Q3 + WS*IQR` formula.
Provided value should be a positive number.
Otherwise it is set to 0.
* `meanShiftLine` - *Optional*, default value `0`. * `meanShiftLine` - *Optional*, default value `0`.
Indicates if a line connecting mean symbol Indicates if a line connecting mean symbol
on the Box Plot should be added. on the Box Plot should be added.
@@ -2366,12 +2376,14 @@ The basic syntax is the following, the `<...>` means optional parameters:
The box-and-whiskers plot has the following interpretation: The box-and-whiskers plot has the following interpretation:
- left vertical bar indicates the *minimum*, - left vertical bar indicates the *minimum*,
- left whisker line starts at `max(Q1 - 1.5IQR, minimum)` and ends at lower quartile (Q1), - left whisker line starts at `max(Q1 - WS*IQR, minimum)` and ends at lower quartile (Q1),
- diamond indicates mean, - diamond indicates mean,
- vertical bar inside of the box indicates median, - vertical bar inside of the box indicates median,
- right whisker line starts at upper quartile (Q3) and ends at `min(Q3 + 1.5IQR, maximum)`, - right whisker line starts at upper quartile (Q3) and ends at `min(Q3 + WS*IQR, maximum)`,
- right vertical bar indicates the *maximum*. - right vertical bar indicates the *maximum*.
The `WS` value is provided through `whiskerScale=` parameter. Default value is `1.5`.
With above setup it may happen that With above setup it may happen that
there is a gap between the minimum marker and the beginning of the left whisker there is a gap between the minimum marker and the beginning of the left whisker
or or
@@ -2533,6 +2545,7 @@ The output can be seen in the `md` file.
, vertical = 1 , vertical = 1
, title = %nrstr(title1 J=C HEIGHT=3 "The VERTICAL plotting is cool, ...";) , title = %nrstr(title1 J=C HEIGHT=3 "The VERTICAL plotting is cool, ...";)
, footnote = %nrstr(footnote1 J=L HEIGHT=2 "... isn't it?";) , footnote = %nrstr(footnote1 J=L HEIGHT=2 "... isn't it?";)
, whiskerScale = 1.5
) )
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -7585,7 +7598,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
# License <a name="license"></a> ###### # License <a name="license"></a> ######
Copyright (c) 2020 - 2023 Bartosz Jablonski Copyright (c) 2020 - 2024 Bartosz Jablonski
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

Binary file not shown.