mirror of
https://github.com/yabwon/SAS_PACKAGES.git
synced 2025-12-11 11:14:35 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
af94d49a79 | ||
|
|
4069f066aa | ||
|
|
266a1fe1a7 | ||
|
|
3111b6667e | ||
|
|
e3b86f1157 | ||
|
|
c9b388b661 | ||
|
|
82681a3f91 | ||
|
|
cb4f82eac9 | ||
|
|
98e2125028 |
26
README.md
26
README.md
@@ -10,11 +10,13 @@ The *purpose of a package* is to be a simple, and easy to access, code sharing m
|
||||
|
||||
In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages.
|
||||
|
||||
Don't forget to **STAR** (:star:) the repository! :-)
|
||||
|
||||
---
|
||||
|
||||
### Current version:
|
||||
|
||||
**The latest version** of SPF is **`20230520`**.
|
||||
**The latest version** of SPF is **`20231009`**.
|
||||
|
||||
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).
|
||||
|
||||
@@ -51,7 +53,7 @@ The first step to use a package with the SAS Packages Framework:
|
||||
|
||||
- Create a folder for your packages, under Windows OS family e.g., `C:/SAS_PACKAGES` or under Linux/UNIX OS family e.g., `/home/<username>/SAS_PACKAGES`.
|
||||
|
||||
and then either:
|
||||
Then either:
|
||||
|
||||
- Manually download the `SPFinit.sas` file (the SAS Packages Framework) into the local packages folder.
|
||||
- \[Optional\] Manually download the `<packageName>.zip` file into the local packages folder.
|
||||
@@ -88,6 +90,13 @@ or do it pragmatically:
|
||||
```sas
|
||||
filename SPFinit url "https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas";
|
||||
%include SPFinit; /* enable the framework */
|
||||
```
|
||||
|
||||
or (shorter) with:
|
||||
|
||||
```sas
|
||||
filename SPFinit url "https://bit.ly/SPFinit";
|
||||
%include SPFinit; /* enable the framework */
|
||||
```
|
||||
|
||||
- Install the framework on your machine in the folder you created:
|
||||
@@ -97,7 +106,7 @@ filename packages "<directory/containing/packages/>";
|
||||
%installPackage(SPFinit) /* install the framework */
|
||||
```
|
||||
|
||||
- And from now on run it like this:
|
||||
- From now on run it like this:
|
||||
|
||||
```sas
|
||||
filename packages "<directory/containing/packages/>";
|
||||
@@ -109,7 +118,8 @@ filename packages "<directory/containing/packages/>";
|
||||
```
|
||||
|
||||
---
|
||||
The "Workshop video for the User" got outdated (in general). Newer version is comming soon, in the mean time see some of the vedeos from the "Recordings and Presentations" section above.
|
||||
|
||||
The "Workshop video for the User" got outdated (in general). Newer version is coming soon, in the mean time see some of the videos from the "Recordings and Presentations" section above.
|
||||
(You can watch the workshop if you wish, link is working and some parts are still valid source of information e.g., "`ICE` loading" or "`disk` loading")
|
||||
|
||||
<s>[**Workshop video for the User**](https://youtu.be/qX_-HJ76g8Y) \[May 6th, 2020\] [~86 minutes, outdated (installPackage macro was not there yet) but gives the idea how it works especially load, help, unload, ICEload, and other details]</s>
|
||||
@@ -128,7 +138,7 @@ To create your own package:
|
||||
|
||||
- Read the **`My First SAS Package: A How-To - Paper 1079-2021`** article available at communities.sas.com [**`here`**](https://communities.sas.com/t5/SAS-Global-Forum-Proceedings/My-First-SAS-Package-A-How-To/ta-p/726319 "My First SAS Package: A How-To") or locally [**`here`**](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/Documentation/Paper_1079-2021/My%20First%20SAS%20Package%20-%20a%20How%20To.pdf "My First SAS Package: A How-To")
|
||||
|
||||
The SAS Packages Framework [(short) documetation](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/SPFinit.md) to quickly see macros options and parametera.
|
||||
The SAS Packages Framework [(short) documentation](https://github.com/yabwon/SAS_PACKAGES/blob/main/SPF/SPFinit.md) to quickly see macros options and parameters.
|
||||
|
||||
---
|
||||
|
||||
@@ -138,9 +148,9 @@ The SAS Packages Framework [(short) documetation](https://github.com/yabwon/SAS_
|
||||
|
||||
### Updates worth mentioning:
|
||||
|
||||
**Update**\[February 7th, 2023\]**:** `ADDCNT` ** type for *additional content* feature and ** `%loadPackageAddCnt()` **macro added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20230207 "Additional Content"))**.
|
||||
**Update**\[February 7th, 2023\]**:** `ADDCNT` **type for *additional content* feature and ** `%loadPackageAddCnt()` **macro added to the framework. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20230207 "Additional Content"))**.
|
||||
|
||||
**Update**\[December 12th, 2022\]**:** `CASLUDF` ** type for CASL user defined functions added to the framework. Utility macros for for loading content in proc IML and proc CAS added. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221212 "New Type and Utility macros"))**.
|
||||
**Update**\[December 12th, 2022\]**:** `CASLUDF` **type for CASL user defined functions added to the framework. Utility macros for for loading content in proc IML and proc CAS added. (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221212 "New Type and Utility macros"))**.
|
||||
|
||||
**Update**\[November 21st, 2022\]**:** `%loadPackage()` **macro allows Cherry Picking of content (see [here](https://github.com/yabwon/SAS_PACKAGES/releases/tag/20221121 "Cherry Picking"))**.
|
||||
|
||||
@@ -166,7 +176,7 @@ This is a list of locations where the SAS Packages Framework is used:
|
||||
|
||||
If you want to share that you are using the SPF let me know and I'll update the list.
|
||||
|
||||
If you find the SPF useful **share info** about it or **give it a [star](https://github.com/yabwon/SAS_PACKAGES/stargazers)** so more people will know.
|
||||
If you find the SPF useful **share info** about it or **give it a [star (:star:)](https://github.com/yabwon/SAS_PACKAGES/stargazers)** so more people will know.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Binary file not shown.
@@ -6,7 +6,7 @@
|
||||
when empty the "packages" value is used */
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to list directories pointed by "packages" fileref, version 20230520. Run %extendPackagesFileref(HELP) for help info.'
|
||||
des = 'Macro to list directories pointed by "packages" fileref, version 20231009. Run %extendPackagesFileref(HELP) for help info.'
|
||||
;
|
||||
|
||||
%if %QUPCASE(&packages.) = HELP %then
|
||||
@@ -22,7 +22,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20230520
|
||||
%put ### This is short help information for the `extendPackagesFileref` macro #;
|
||||
%put #-----------------------------------------------------------------------------------------#;;
|
||||
%put # #;
|
||||
%put # Macro to list directories pointed by 'packages' fileref, version `20230520` #;
|
||||
%put # Macro to list directories pointed by 'packages' fileref, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
default value 1 means "delete tests work" */
|
||||
)/ secure minoperator
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to generate SAS packages, version 20230520. Run %generatePackage() for help info.'
|
||||
des = 'Macro to generate SAS packages, version 20231009. Run %generatePackage() for help info.'
|
||||
;
|
||||
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
|
||||
%do;
|
||||
@@ -38,7 +38,7 @@ des = 'Macro to generate SAS packages, version 20230520. Run %generatePackage()
|
||||
%put ### This is short help information for the `generatePackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to generate SAS packages, version `20230520` #;
|
||||
%put # Macro to generate SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -71,6 +71,7 @@ des = 'Macro to generate SAS packages, version 20230520. Run %generatePackage()
|
||||
%put # if there are dependencies in loading the package. #;
|
||||
%put # Has to be a single directory, if more than one are #;
|
||||
%put # provided than only the first is used. #;
|
||||
%put # If path to location contains spaces it should be quoted! #;
|
||||
%put # #;
|
||||
%put # - `testResults=` Location where tests results should be stored, #;
|
||||
%put # if null (the default) then the session WORK is used. #;
|
||||
@@ -714,6 +715,34 @@ data _null_;
|
||||
end;
|
||||
run;
|
||||
|
||||
|
||||
/*======== test for duplicated names of the same type ========*/
|
||||
proc sort
|
||||
data = &filesWithCodes.
|
||||
out = &filesWithCodes._DUPSCHECK
|
||||
;
|
||||
by type file order;
|
||||
run;
|
||||
|
||||
data _null_;
|
||||
set &filesWithCodes._DUPSCHECK;
|
||||
by type file;
|
||||
|
||||
if first.file NE last.file then
|
||||
do;
|
||||
if 0 = warnPrinted then
|
||||
do;
|
||||
put "WARNING: The following names are duplicated:";
|
||||
warnPrinted+1;
|
||||
end;
|
||||
put "WARNING- " type= file= folder=;
|
||||
end;
|
||||
|
||||
run;
|
||||
proc delete data = &filesWithCodes._DUPSCHECK;
|
||||
run;
|
||||
/*=============================================================*/
|
||||
|
||||
%if %superq(additionalContent) NE %then
|
||||
%do;
|
||||
/* code inspired by Kurt Bremser's "Talking to Your Host" article */
|
||||
@@ -781,6 +810,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
|
||||
title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */
|
||||
%end;
|
||||
|
||||
footnote1 "SAS Packages Framework, version 20231009";
|
||||
|
||||
proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent);
|
||||
run;
|
||||
@@ -807,6 +837,7 @@ title;
|
||||
%end;
|
||||
|
||||
title;
|
||||
footnote;
|
||||
options ¬esSourceOptions.;
|
||||
|
||||
|
||||
@@ -936,7 +967,8 @@ data _null_;
|
||||
put ' , options = %str(LOWCASE_MEMNAME) /* possible options for ZIP */ ';
|
||||
put ' , zip = zip /* file ext. */ ';
|
||||
put ' , requiredVersion = . /* required version */ ';
|
||||
put ' , source2 = /* source2*/ ';
|
||||
put ' , source2 = /* source2 */ ';
|
||||
put ' , suppressExec = 0 /* suppress execs */ ';
|
||||
put ' )/secure; ';
|
||||
put ' %PUT ** NOTE: Package ' "&packageName." ' loaded in ICE mode **; ';
|
||||
put ' %local _PackageFileref_; ';
|
||||
@@ -980,6 +1012,9 @@ data _null_;
|
||||
put ' %local tempLoad_minoperator; ';
|
||||
put ' %let tempLoad_minoperator = %sysfunc(getoption(minoperator)); ';
|
||||
put ' options minoperator; ';
|
||||
|
||||
put ' %if %superq(suppressExec) NE 1 %then %let suppressExec = 0; ';
|
||||
|
||||
put ' %include &_PackageFileref_.(load.sas) / &source2.; ';
|
||||
put ' options &tempLoad_minoperator.; ';
|
||||
|
||||
@@ -1345,22 +1380,33 @@ data _null_;
|
||||
"exist. It will be overwritten by the macro from the &packageName. package, ));";
|
||||
|
||||
if upcase(type)=:'EXEC' then
|
||||
do;
|
||||
put ' %put NOTE- ;';
|
||||
put ' %put NOTE- Executing the following code: ;';
|
||||
put ' %put NOTE- *****************************;';
|
||||
put ' data _null_;';
|
||||
put " infile &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') lrecl=32767;';
|
||||
put ' input;';
|
||||
put ' putlog "*> " _infile_;';
|
||||
put ' run;';
|
||||
put ' %put NOTE- *****************************;';
|
||||
put ' %put NOTE- ;';
|
||||
end;
|
||||
|
||||
/* include the file with the code of the element */
|
||||
put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;';
|
||||
|
||||
do;
|
||||
/* User can suppress running the exec files */
|
||||
put ' %sysfunc(ifc(1 = %superq(suppressExec)'
|
||||
/ ' ,%nrstr(%%put INFO: Inclusion of EXEC files is suppressed!;)'
|
||||
/ ' ,%str('
|
||||
/ ' data _null_;'
|
||||
/ ' if _N_=1 then'
|
||||
/ ' put "NOTE- " /'
|
||||
/ ' "NOTE- Executing the following code:" /'
|
||||
/ ' "NOTE- *****************************" / ;'
|
||||
/ " infile &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') lrecl=32767 end=EOF;'
|
||||
/ ' input;'
|
||||
/ ' putlog "*> " _infile_;'
|
||||
/ ' if EOF=1 then'
|
||||
/ ' put "NOTE- *****************************" /'
|
||||
/ ' "NOTE- " / ;'
|
||||
/ ' run;'
|
||||
/ ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'
|
||||
/ ' )));'
|
||||
;
|
||||
end;
|
||||
else
|
||||
do;
|
||||
/* include the file with the code of the element */
|
||||
put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;';
|
||||
end;
|
||||
|
||||
if upcase(type)=:'IMLMODULE' then
|
||||
put ' %let cherryPick_IML = %eval(&cherryPick_IML. + 1);';
|
||||
|
||||
@@ -1478,7 +1524,7 @@ data _null_;
|
||||
%end;
|
||||
put +(-1) '`.;''' /
|
||||
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
|
||||
' !! '' %put with the SAS Packages Framework version 20230520.;''' /
|
||||
' !! '' %put with the SAS Packages Framework version 20231009.;''' /
|
||||
' !! '' %put ****************************************************************************;''' /
|
||||
' !! '' %GOTO theEndOfTheMacro;''' /
|
||||
' !! '' %end;''' ;
|
||||
@@ -1651,7 +1697,7 @@ data _null_;
|
||||
%end;
|
||||
put +(-1) '`.; '' !!' /
|
||||
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
|
||||
''' %put with the SAS Packages Framework version 20230520.; '' !! ' /
|
||||
''' %put with the SAS Packages Framework version 20231009.; '' !! ' /
|
||||
''' %put ****************************************************************************; '' !! ' /
|
||||
''' %GOTO theEndOfTheMacro; '' !! ' /
|
||||
''' %end; '' !! ' /
|
||||
@@ -2267,7 +2313,7 @@ data _null_;
|
||||
put "put @3 'localization (only if additional content was deployed during the installation process).';" / "put ;";
|
||||
%end;
|
||||
|
||||
put 'put "***"; put "* SAS package generated by generatePackage, version 20230520 *"; put "***";';
|
||||
put 'put "***"; put "* SAS package generated by generatePackage, version 20231009 *"; put "***";';
|
||||
|
||||
put 'run; ' /;
|
||||
|
||||
@@ -2361,15 +2407,37 @@ data _null_;
|
||||
put " stop; ";
|
||||
put "run; ";
|
||||
|
||||
/* cleanup */
|
||||
/* clean up */
|
||||
put "proc delete data = WORK._last_; ";
|
||||
put "run; ";
|
||||
put 'options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; ' /;
|
||||
|
||||
|
||||
/* generate dataset witch content information */
|
||||
put 'data &packageContentDS. _NULL_; '
|
||||
/ ' if "&packageContentDS." = " " then stop; '
|
||||
/ ' infile cards4 dlm = "/"; '
|
||||
/ ' input (folder order type file fileshort) (: $ 256.); '
|
||||
/ ' output; '
|
||||
/ 'cards4; '
|
||||
;
|
||||
|
||||
EOFDS = 0;
|
||||
do until(EOFDS);
|
||||
/* content is created during package creation */
|
||||
set &filesWithCodes. end = EOFDS;
|
||||
if upcase(type) in: ('TEST') then continue; /* exclude tests */
|
||||
strX = catx('/', folder, order, type, file, fileshort);
|
||||
put strX;
|
||||
end;
|
||||
|
||||
put ";;;;"
|
||||
/ "run;"
|
||||
/ 'options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; '
|
||||
/ ;
|
||||
|
||||
put '%put NOTE: '"Help for package &packageName., version &packageVersion., license &packageLicense.;";
|
||||
put '%put NOTE- *** END ***;' /;
|
||||
put "/* help.sas end */";
|
||||
|
||||
|
||||
stop;
|
||||
run;
|
||||
|
||||
@@ -2638,7 +2706,20 @@ filename &zipReferrence. clear;
|
||||
%put NOTE-;
|
||||
/* in case the packages macrovariable is multi-directory the first directory will be selected */
|
||||
data _null_;
|
||||
call symputX("packages", dequote(kscanx(resolve(symget("packages")), 1, "()", "QS")) ,"L");
|
||||
length packages $ 32767;
|
||||
packages = resolve(symget("packages"));
|
||||
|
||||
/* check if path contains quotes */
|
||||
quotes = lengthn(compress(packages,"""'","K"));
|
||||
|
||||
/* issue error for unmatched quotes */
|
||||
if mod(quotes,2) then
|
||||
put "ERROR: Unbalanced quotes in the PACKAGES= parameter." / "ERROR- " PACKAGES= ;
|
||||
|
||||
if quotes > 0 then
|
||||
call symputX("packages", dequote(kscanx(packages, 1, "()", "QS")) ,"L");
|
||||
else
|
||||
call symputX("packages", packages ,"L");
|
||||
run;
|
||||
|
||||
/* check if systask is available */
|
||||
@@ -2654,7 +2735,9 @@ run;
|
||||
put 'NOTE-';
|
||||
|
||||
n=6;
|
||||
put @n "filename packages '&packages.';" /;
|
||||
length packages $ 32767;
|
||||
packages = quote(dequote(strip(symget('packages'))));
|
||||
put @n "filename packages " packages ";" /;
|
||||
|
||||
if fileexist("&packages./SPFinit.sas") then
|
||||
put @n '%include packages(SPFinit.sas);' /;
|
||||
|
||||
@@ -20,11 +20,15 @@
|
||||
if the zip is not available use a folder
|
||||
unpack data to "pipackage.disk" folder
|
||||
and use helpPackage in the form:
|
||||
%helpPackage(PiPackage, *, zip=disk, options=)
|
||||
*/
|
||||
%helpPackage(PiPackage, *, zip=disk, options=) */
|
||||
, packageContentDS = 0 /* indicates if a data set with package
|
||||
content should be generated in WORK,
|
||||
if set to 1 then WORK.packageName_content
|
||||
dataset is created
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage() for help info.'
|
||||
des = 'Macro to get help about SAS package, version 20231009. Run %helpPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -39,7 +43,7 @@ des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage()
|
||||
%put ### This is short help information for the `helpPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to get help about SAS packages, version `20230520` #;
|
||||
%put # Macro to get help about SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -80,6 +84,11 @@ des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage()
|
||||
%put # and use helpPackage in the following form: #;
|
||||
%put # `%nrstr(%%helpPackage(PiPackage, ,zip=disk, options=))` #;
|
||||
%put # #;
|
||||
%put # - `packageContentDS=` *Optional.* Indicates if a data set with package #;
|
||||
%put # content should be generated in `WORK`, #;
|
||||
%put # with default value (`0`) the dataset is not produced, #;
|
||||
%put # if set to `1` then `WORK.packageName_content`. #;
|
||||
%put # #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||
@@ -153,6 +162,9 @@ des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage()
|
||||
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||
%else utf8 ;
|
||||
;
|
||||
%if 1=%superq(packageContentDS) %then %let packageContentDS=work.&packageName._content;
|
||||
%else %let packageContentDS=;
|
||||
|
||||
%include &_PackageFileref_.(help.sas) / &source2.;
|
||||
%end;
|
||||
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
|
||||
@@ -169,7 +181,7 @@ TODO:
|
||||
- add MD5(&packageName.) value hash instead "package" word in filenames [DONE]
|
||||
*/
|
||||
|
||||
/* Macros to install SAS packages, version 20230520 */
|
||||
/* Macros to install SAS packages, version 20231009 */
|
||||
/* A SAS package is a zip file containing a group of files
|
||||
with SAS code (macros, functions, data steps generating
|
||||
data, etc.) wrapped up together and %INCLUDEed by
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
/secure
|
||||
minoperator
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to install SAS package, version 20230520. Run %%installPackage() for help info.'
|
||||
des = 'Macro to install SAS package, version 20231009. Run %%installPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
|
||||
%do;
|
||||
@@ -31,7 +31,7 @@ des = 'Macro to install SAS package, version 20230520. Run %%installPackage() fo
|
||||
%put ### This is short help information for the `installPackage` macro #;
|
||||
%put #--------------------------------------------------------------------------------------------#;;
|
||||
%put # #;
|
||||
%put # Macro to install SAS packages, version `20230520` #;
|
||||
%put # Macro to install SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -483,7 +483,7 @@ des = 'Macro to install SAS package, version 20230520. Run %%installPackage() fo
|
||||
|
||||
/* Macro to list SAS packages in packages folder.
|
||||
|
||||
Version 20230520
|
||||
Version 20231009
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*+listPackages+*/
|
||||
|
||||
%macro listPackages()/secure PARMBUFF
|
||||
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20230520.'
|
||||
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20231009.'
|
||||
;
|
||||
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
|
||||
%do;
|
||||
@@ -16,7 +16,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE
|
||||
%put ### This is short help information for the `listPackages` macro #;
|
||||
%put #-----------------------------------------------------------------------------------------#;;
|
||||
%put # #;
|
||||
%put # Macro to list available SAS packages, version `20230520` #;
|
||||
%put # Macro to list available SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -166,7 +166,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
|
||||
/* Macro to generate SAS packages.
|
||||
|
||||
Version 20230520
|
||||
Version 20231009
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
|
||||
@@ -23,17 +23,18 @@
|
||||
if the zip is not available use a folder
|
||||
unpack data to "pipackage.disk" folder
|
||||
and use loadPackage in the form:
|
||||
%loadPackage(PiPackage, zip=disk, options=)
|
||||
*/
|
||||
%loadPackage(PiPackage, zip=disk, options=) */
|
||||
, cherryPick=* /* space separated list of selected elements of the package
|
||||
to be loaded into the session, default value "*" means
|
||||
"load all elements of the package"
|
||||
*/
|
||||
"load all elements of the package" */
|
||||
, loadAddCnt=0 /* should the additional content be loaded?
|
||||
default is 0 - means No, 1 means Yes */
|
||||
, suppressExec=0 /* indicates if loading of exec files
|
||||
should be suppressed, 1=suppress
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to load SAS package, version 20230520. Run %loadPackage() for help info.'
|
||||
des = 'Macro to load SAS package, version 20231009. Run %loadPackage() for help info.'
|
||||
minoperator
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
@@ -49,7 +50,7 @@ minoperator
|
||||
%put ### This is short help information for the `loadPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to *load* SAS packages, version `20230520` #;
|
||||
%put # Macro to *load* SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -105,6 +106,10 @@ minoperator
|
||||
%put # directory in `<packageName>_AdditionalContent` folder. #;
|
||||
%put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #;
|
||||
%put # #;
|
||||
%put # - `suppressExec=` *Optional.* Indicates if loading of `exec` type files #;
|
||||
%put # should be suppressed, default value is `0`, #;
|
||||
%put # when set to `1` `exec` files are *not* loaded #;
|
||||
%put # #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||
@@ -201,6 +206,11 @@ minoperator
|
||||
%let loadAddCnt = 0;
|
||||
%end;
|
||||
|
||||
%if %superq(suppressExec) NE 1 %then
|
||||
%do;
|
||||
%let suppressExec = 0;
|
||||
%end;
|
||||
|
||||
filename &_PackageFileref_. &ZIP.
|
||||
/* put location of package myPackageFile.zip here */
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
is provided in required version */
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to load additional content for a SAS package, version 20230520. Run %loadPackageAddCnt() for help info.'
|
||||
des = 'Macro to load additional content for a SAS package, version 20231009. Run %loadPackageAddCnt() for help info.'
|
||||
minoperator
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
@@ -35,7 +35,7 @@ minoperator
|
||||
%put ### This is short help information for the `loadPackageAddCnt` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to *load* additional content for a SAS package, version `20230520` #;
|
||||
%put # Macro to *load* additional content for a SAS package, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to load multiple SAS packages at one run, version 20230520. Run %loadPackages() for help info.'
|
||||
des = 'Macro to load multiple SAS packages at one run, version 20231009. Run %loadPackages() for help info.'
|
||||
parmbuff
|
||||
;
|
||||
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
|
||||
@@ -27,7 +27,7 @@ parmbuff
|
||||
%put ### This is short help information for the `loadPackageS` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro wrapper for the loadPackage macro, version `20230520` #;
|
||||
%put # Macro wrapper for the loadPackage macro, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to preview content of a SAS package, version 20230520. Run %previewPackage() for help info.'
|
||||
des = 'Macro to preview content of a SAS package, version 20231009. Run %previewPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -38,7 +38,7 @@ des = 'Macro to preview content of a SAS package, version 20230520. Run %preview
|
||||
%put ### This is short help information for the `previewPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to get previwe of a SAS packages, version `20230520` #;
|
||||
%put # Macro to get previwe of a SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to unload SAS package, version 20230520. Run %unloadPackage() for help info.'
|
||||
des = 'Macro to unload SAS package, version 20231009. Run %unloadPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -35,7 +35,7 @@ des = 'Macro to unload SAS package, version 20230520. Run %unloadPackage() for h
|
||||
%put ### This is short help information for the `unloadPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to unload SAS packages, version `20230520` #;
|
||||
%put # Macro to unload SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
hashing_file() function, SAS 9.4M6 */
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to verify SAS package with the hash digest, version 20230520. Run %verifyPackage() for help info.'
|
||||
des = 'Macro to verify SAS package with the hash digest, version 20231009. Run %verifyPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -28,7 +28,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20230520. Run %
|
||||
%put ### This is short help information for the `verifyPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to verify SAS package with it hash digest, version `20230520` #;
|
||||
%put # Macro to verify SAS package with it hash digest, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
|
||||
@@ -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.
|
||||
|
||||
In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20230520`**.
|
||||
In this repository we are presenting the **SAS Packages Framework** which allows to develop and use SAS packages. The latest version of SPF is **`20231009`**.
|
||||
|
||||
**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>
|
||||
--------------------------------------------------------------------------------------------
|
||||
|
||||
Macro to install SAS packages, version `20230520`
|
||||
Macro to install SAS packages, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -149,7 +149,7 @@ filename packages "C:/SAS_PACKAGES";
|
||||
## This is short help information for the `helpPackage` macro <a name="helppackage"></a>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro to get help about SAS packages, version `20230520`
|
||||
Macro to get help about SAS packages, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -190,6 +190,11 @@ filename packages "C:/SAS_PACKAGES";
|
||||
and use helpPackage in the following form:
|
||||
`%helpPackage(PiPackage, , zip=disk, options=)`
|
||||
|
||||
- `packageContentDS=` *Optional.* Indicates if a data set with package
|
||||
content should be generated in `WORK`,
|
||||
with default value (`0`) the dataset is not produced,
|
||||
if set to `1` then `WORK.packageName_content`.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation`
|
||||
@@ -220,7 +225,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
## This is short help information for the `loadPackage` macro <a name="loadpackage"></a>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro to *load* SAS packages, version `20230520`
|
||||
Macro to *load* SAS packages, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -276,6 +281,10 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
directory in `<packageName>_AdditionalContent` folder.
|
||||
For other locations use `%loadPackageAddCnt()` macro.
|
||||
|
||||
- `suppressExec=` *Optional.* Indicates if loading of `exec` type files
|
||||
should be suppressed, default value is `0`,
|
||||
when set to `1` `exec` files are *not* loaded
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation`
|
||||
@@ -368,7 +377,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>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro wrapper for the loadPackage macro, version `20230520`
|
||||
Macro wrapper for the loadPackage macro, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -417,7 +426,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
## This is short help information for the `unloadPackage` macro <a name="unloadpackage"></a>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro to unload SAS packages, version `20230520`
|
||||
Macro to unload SAS packages, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -482,7 +491,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
## This is short help information for the `listPackages` macro <a name="listpackages"></a>
|
||||
-----------------------------------------------------------------------------------------
|
||||
|
||||
Macro to list available SAS packages, version `20230520`
|
||||
Macro to list available SAS packages, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -523,7 +532,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
## This is short help information for the `verifyPackage` macro <a name="verifypackage"></a>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro to verify SAS package with it hash digest, version `20230520`
|
||||
Macro to verify SAS package with it hash digest, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -577,7 +586,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>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro to get previwe of a SAS packages, version `20230520`
|
||||
Macro to get previwe of a SAS packages, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -644,7 +653,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
## This is short help information for the `generatePackage` macro <a name="generatepackage"></a>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro to generate SAS packages, version `20230520`
|
||||
Macro to generate SAS packages, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -657,7 +666,7 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation`
|
||||
Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation`
|
||||
to read about the details of package generation process.
|
||||
|
||||
### Parameters:
|
||||
@@ -676,23 +685,24 @@ filename packages "C:/SAS_PACKAGES"; %* setup a directory for packages;
|
||||
- `packages=` Location of other packages for testing
|
||||
if there are dependencies in loading the package.
|
||||
Has to be a single directory, if more than one are
|
||||
provided than only the first is used.
|
||||
provided than only the first is used.
|
||||
If path to location contains spaces it should be quoted!
|
||||
|
||||
- `testResults=` Location where tests results should be stored,
|
||||
if null (the default) then the session WORK is used.
|
||||
- `testResults=` Location where tests results should be stored,
|
||||
if null (the default) then the session WORK is used.
|
||||
|
||||
- `sasexe=` Location of a DIRECTORY where the SAS binary is located,
|
||||
if null (the default) then the `!SASROOT` is used.
|
||||
|
||||
- `sascfgFile=` Location of a FILE with testing session configuration
|
||||
parameters, if null (the default) then no config file
|
||||
is pointed during the SAS invocation,
|
||||
if set to `DEF` then the `!SASROOT/sasv9.cfg` is used.
|
||||
|
||||
- `delTestWork=` Indicates if `WORK` directories generated by user tests
|
||||
should be deleted, i.e. the (NO)WORKTERM option is set.
|
||||
The default value: `1` means "delete tests work".
|
||||
Available values are `0` and `1`.
|
||||
- `sasexe=` Location of a DIRECTORY where the SAS binary is located,
|
||||
if null (the default) then the `!SASROOT` is used.
|
||||
|
||||
- `sascfgFile=` Location of a FILE with testing session configuration
|
||||
parameters, if null (the default) then no config file
|
||||
is pointed during the SAS invocation,
|
||||
if set to `DEF` then the `!SASROOT/sasv9.cfg` is used.
|
||||
|
||||
- `delTestWork=` Indicates if `WORK` directories generated by user tests
|
||||
should be deleted, i.e. the (NO)WORKTERM option is set.
|
||||
The default value: `1` means "delete tests work".
|
||||
Available values are `0` and `1`.
|
||||
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
@@ -837,7 +847,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>
|
||||
-----------------------------------------------------------------------------------------
|
||||
|
||||
Macro to list directories pointed by 'packages' fileref, version `20230520`
|
||||
Macro to list directories pointed by 'packages' fileref, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -877,7 +887,7 @@ filename packages ("D:/NEW_DIR" %extendPackagesFileref()); %* add new directory;
|
||||
## This is short help information for the `loadPackageAddCnt` macro <a name="loadpackageaddcnt"></a>
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
Macro to load *additional content* for a SAS package, version `20230520`
|
||||
Macro to load *additional content* for a SAS package, version `20231009`
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
|
||||
221
SPF/SPFinit.sas
221
SPF/SPFinit.sas
@@ -42,7 +42,7 @@
|
||||
- to unload, or
|
||||
- to generate SAS packages.
|
||||
|
||||
Version 20230520.
|
||||
Version 20231009.
|
||||
See examples below.
|
||||
|
||||
A SAS package is a zip file containing a group of files
|
||||
@@ -78,17 +78,18 @@
|
||||
if the zip is not available use a folder
|
||||
unpack data to "pipackage.disk" folder
|
||||
and use loadPackage in the form:
|
||||
%loadPackage(PiPackage, zip=disk, options=)
|
||||
*/
|
||||
%loadPackage(PiPackage, zip=disk, options=) */
|
||||
, cherryPick=* /* space separated list of selected elements of the package
|
||||
to be loaded into the session, default value "*" means
|
||||
"load all elements of the package"
|
||||
*/
|
||||
"load all elements of the package" */
|
||||
, loadAddCnt=0 /* should the additional content be loaded?
|
||||
default is 0 - means No, 1 means Yes */
|
||||
, suppressExec=0 /* indicates if loading of exec files
|
||||
should be suppressed, 1=suppress
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to load SAS package, version 20230520. Run %loadPackage() for help info.'
|
||||
des = 'Macro to load SAS package, version 20231009. Run %loadPackage() for help info.'
|
||||
minoperator
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
@@ -104,7 +105,7 @@ minoperator
|
||||
%put ### This is short help information for the `loadPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to *load* SAS packages, version `20230520` #;
|
||||
%put # Macro to *load* SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -160,6 +161,10 @@ minoperator
|
||||
%put # directory in `<packageName>_AdditionalContent` folder. #;
|
||||
%put # For other locations use `%nrstr(%%loadPackageAddCnt())` macro. #;
|
||||
%put # #;
|
||||
%put # - `suppressExec=` *Optional.* Indicates if loading of `exec` type files #;
|
||||
%put # should be suppressed, default value is `0`, #;
|
||||
%put # when set to `1` `exec` files are *not* loaded #;
|
||||
%put # #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||
@@ -256,6 +261,11 @@ minoperator
|
||||
%let loadAddCnt = 0;
|
||||
%end;
|
||||
|
||||
%if %superq(suppressExec) NE 1 %then
|
||||
%do;
|
||||
%let suppressExec = 0;
|
||||
%end;
|
||||
|
||||
filename &_PackageFileref_. &ZIP.
|
||||
/* put location of package myPackageFile.zip here */
|
||||
"&path./%lowcase(&packageName.).&zip." %unquote(&options.)
|
||||
@@ -350,7 +360,7 @@ minoperator
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to unload SAS package, version 20230520. Run %unloadPackage() for help info.'
|
||||
des = 'Macro to unload SAS package, version 20231009. Run %unloadPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -365,7 +375,7 @@ des = 'Macro to unload SAS package, version 20230520. Run %unloadPackage() for h
|
||||
%put ### This is short help information for the `unloadPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to unload SAS packages, version `20230520` #;
|
||||
%put # Macro to unload SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -506,11 +516,15 @@ des = 'Macro to unload SAS package, version 20230520. Run %unloadPackage() for h
|
||||
if the zip is not available use a folder
|
||||
unpack data to "pipackage.disk" folder
|
||||
and use helpPackage in the form:
|
||||
%helpPackage(PiPackage, *, zip=disk, options=)
|
||||
*/
|
||||
%helpPackage(PiPackage, *, zip=disk, options=) */
|
||||
, packageContentDS = 0 /* indicates if a data set with package
|
||||
content should be generated in WORK,
|
||||
if set to 1 then WORK.packageName_content
|
||||
dataset is created
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage() for help info.'
|
||||
des = 'Macro to get help about SAS package, version 20231009. Run %helpPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -525,7 +539,7 @@ des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage()
|
||||
%put ### This is short help information for the `helpPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to get help about SAS packages, version `20230520` #;
|
||||
%put # Macro to get help about SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -566,6 +580,11 @@ des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage()
|
||||
%put # and use helpPackage in the following form: #;
|
||||
%put # `%nrstr(%%helpPackage(PiPackage, ,zip=disk, options=))` #;
|
||||
%put # #;
|
||||
%put # - `packageContentDS=` *Optional.* Indicates if a data set with package #;
|
||||
%put # content should be generated in `WORK`, #;
|
||||
%put # with default value (`0`) the dataset is not produced, #;
|
||||
%put # if set to `1` then `WORK.packageName_content`. #;
|
||||
%put # #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Visit: `https://github.com/yabwon/SAS_PACKAGES/tree/main/SPF/Documentation` #;
|
||||
@@ -639,6 +658,9 @@ des = 'Macro to get help about SAS package, version 20230520. Run %helpPackage()
|
||||
%if %bquote(&packageEncoding.) NE %then &packageEncoding. ;
|
||||
%else utf8 ;
|
||||
;
|
||||
%if 1=%superq(packageContentDS) %then %let packageContentDS=work.&packageName._content;
|
||||
%else %let packageContentDS=;
|
||||
|
||||
%include &_PackageFileref_.(help.sas) / &source2.;
|
||||
%end;
|
||||
%else %put ERROR:[&sysmacroname] File "&path./&packageName..&zip." does not exist!;
|
||||
@@ -655,7 +677,7 @@ TODO:
|
||||
- add MD5(&packageName.) value hash instead "package" word in filenames [DONE]
|
||||
*/
|
||||
|
||||
/* Macros to install SAS packages, version 20230520 */
|
||||
/* Macros to install SAS packages, version 20231009 */
|
||||
/* A SAS package is a zip file containing a group of files
|
||||
with SAS code (macros, functions, data steps generating
|
||||
data, etc.) wrapped up together and %INCLUDEed by
|
||||
@@ -680,7 +702,7 @@ TODO:
|
||||
/secure
|
||||
minoperator
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to install SAS package, version 20230520. Run %%installPackage() for help info.'
|
||||
des = 'Macro to install SAS package, version 20231009. Run %%installPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
|
||||
%do;
|
||||
@@ -695,7 +717,7 @@ des = 'Macro to install SAS package, version 20230520. Run %%installPackage() fo
|
||||
%put ### This is short help information for the `installPackage` macro #;
|
||||
%put #--------------------------------------------------------------------------------------------#;;
|
||||
%put # #;
|
||||
%put # Macro to install SAS packages, version `20230520` #;
|
||||
%put # Macro to install SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -1147,7 +1169,7 @@ des = 'Macro to install SAS package, version 20230520. Run %%installPackage() fo
|
||||
|
||||
/* Macro to list SAS packages in packages folder.
|
||||
|
||||
Version 20230520
|
||||
Version 20231009
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -1168,7 +1190,7 @@ des = 'Macro to install SAS package, version 20230520. Run %%installPackage() fo
|
||||
/*+listPackages+*/
|
||||
|
||||
%macro listPackages()/secure PARMBUFF
|
||||
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20230520.'
|
||||
des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HELP) for help, version 20231009.'
|
||||
;
|
||||
%if %QUPCASE(&SYSPBUFF.) = %str(%(HELP%)) %then
|
||||
%do;
|
||||
@@ -1183,7 +1205,7 @@ des = 'Macro to list SAS packages from `packages` fileref, type %listPackages(HE
|
||||
%put ### This is short help information for the `listPackages` macro #;
|
||||
%put #-----------------------------------------------------------------------------------------#;;
|
||||
%put # #;
|
||||
%put # Macro to list available SAS packages, version `20230520` #;
|
||||
%put # Macro to list available SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -1333,7 +1355,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
|
||||
/* Macro to generate SAS packages.
|
||||
|
||||
Version 20230520
|
||||
Version 20231009
|
||||
|
||||
A SAS package is a zip file containing a group
|
||||
of SAS codes (macros, functions, data steps generating
|
||||
@@ -1370,7 +1392,7 @@ options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.;
|
||||
default value 1 means "delete tests work" */
|
||||
)/ secure minoperator
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to generate SAS packages, version 20230520. Run %generatePackage() for help info.'
|
||||
des = 'Macro to generate SAS packages, version 20231009. Run %generatePackage() for help info.'
|
||||
;
|
||||
%if (%superq(filesLocation) = ) OR (%qupcase(&filesLocation.) = HELP) %then
|
||||
%do;
|
||||
@@ -1385,7 +1407,7 @@ des = 'Macro to generate SAS packages, version 20230520. Run %generatePackage()
|
||||
%put ### This is short help information for the `generatePackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to generate SAS packages, version `20230520` #;
|
||||
%put # Macro to generate SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -1418,6 +1440,7 @@ des = 'Macro to generate SAS packages, version 20230520. Run %generatePackage()
|
||||
%put # if there are dependencies in loading the package. #;
|
||||
%put # Has to be a single directory, if more than one are #;
|
||||
%put # provided than only the first is used. #;
|
||||
%put # If path to location contains spaces it should be quoted! #;
|
||||
%put # #;
|
||||
%put # - `testResults=` Location where tests results should be stored, #;
|
||||
%put # if null (the default) then the session WORK is used. #;
|
||||
@@ -2061,6 +2084,34 @@ data _null_;
|
||||
end;
|
||||
run;
|
||||
|
||||
|
||||
/*======== test for duplicated names of the same type ========*/
|
||||
proc sort
|
||||
data = &filesWithCodes.
|
||||
out = &filesWithCodes._DUPSCHECK
|
||||
;
|
||||
by type file order;
|
||||
run;
|
||||
|
||||
data _null_;
|
||||
set &filesWithCodes._DUPSCHECK;
|
||||
by type file;
|
||||
|
||||
if first.file NE last.file then
|
||||
do;
|
||||
if 0 = warnPrinted then
|
||||
do;
|
||||
put "WARNING: The following names are duplicated:";
|
||||
warnPrinted+1;
|
||||
end;
|
||||
put "WARNING- " type= file= folder=;
|
||||
end;
|
||||
|
||||
run;
|
||||
proc delete data = &filesWithCodes._DUPSCHECK;
|
||||
run;
|
||||
/*=============================================================*/
|
||||
|
||||
%if %superq(additionalContent) NE %then
|
||||
%do;
|
||||
/* code inspired by Kurt Bremser's "Talking to Your Host" article */
|
||||
@@ -2128,6 +2179,7 @@ title6 "MD5 hashed fileref of package lowcase name: &_PackageFileref_.";
|
||||
title8 "Required SAS packages: %qsysfunc(compress(%superq(packageReqPackages),%str(%'%")))" ; /* " */
|
||||
%end;
|
||||
|
||||
footnote1 "SAS Packages Framework, version 20231009";
|
||||
|
||||
proc print data = &filesWithCodes.(drop=base folderRef fileRef rc folderid _abort_ fileId additionalContent);
|
||||
run;
|
||||
@@ -2154,6 +2206,7 @@ title;
|
||||
%end;
|
||||
|
||||
title;
|
||||
footnote;
|
||||
options ¬esSourceOptions.;
|
||||
|
||||
|
||||
@@ -2283,7 +2336,8 @@ data _null_;
|
||||
put ' , options = %str(LOWCASE_MEMNAME) /* possible options for ZIP */ ';
|
||||
put ' , zip = zip /* file ext. */ ';
|
||||
put ' , requiredVersion = . /* required version */ ';
|
||||
put ' , source2 = /* source2*/ ';
|
||||
put ' , source2 = /* source2 */ ';
|
||||
put ' , suppressExec = 0 /* suppress execs */ ';
|
||||
put ' )/secure; ';
|
||||
put ' %PUT ** NOTE: Package ' "&packageName." ' loaded in ICE mode **; ';
|
||||
put ' %local _PackageFileref_; ';
|
||||
@@ -2327,6 +2381,9 @@ data _null_;
|
||||
put ' %local tempLoad_minoperator; ';
|
||||
put ' %let tempLoad_minoperator = %sysfunc(getoption(minoperator)); ';
|
||||
put ' options minoperator; ';
|
||||
|
||||
put ' %if %superq(suppressExec) NE 1 %then %let suppressExec = 0; ';
|
||||
|
||||
put ' %include &_PackageFileref_.(load.sas) / &source2.; ';
|
||||
put ' options &tempLoad_minoperator.; ';
|
||||
|
||||
@@ -2692,22 +2749,33 @@ data _null_;
|
||||
"exist. It will be overwritten by the macro from the &packageName. package, ));";
|
||||
|
||||
if upcase(type)=:'EXEC' then
|
||||
do;
|
||||
put ' %put NOTE- ;';
|
||||
put ' %put NOTE- Executing the following code: ;';
|
||||
put ' %put NOTE- *****************************;';
|
||||
put ' data _null_;';
|
||||
put " infile &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') lrecl=32767;';
|
||||
put ' input;';
|
||||
put ' putlog "*> " _infile_;';
|
||||
put ' run;';
|
||||
put ' %put NOTE- *****************************;';
|
||||
put ' %put NOTE- ;';
|
||||
end;
|
||||
|
||||
/* include the file with the code of the element */
|
||||
put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;';
|
||||
|
||||
do;
|
||||
/* User can suppress running the exec files */
|
||||
put ' %sysfunc(ifc(1 = %superq(suppressExec)'
|
||||
/ ' ,%nrstr(%%put INFO: Inclusion of EXEC files is suppressed!;)'
|
||||
/ ' ,%str('
|
||||
/ ' data _null_;'
|
||||
/ ' if _N_=1 then'
|
||||
/ ' put "NOTE- " /'
|
||||
/ ' "NOTE- Executing the following code:" /'
|
||||
/ ' "NOTE- *****************************" / ;'
|
||||
/ " infile &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') lrecl=32767 end=EOF;'
|
||||
/ ' input;'
|
||||
/ ' putlog "*> " _infile_;'
|
||||
/ ' if EOF=1 then'
|
||||
/ ' put "NOTE- *****************************" /'
|
||||
/ ' "NOTE- " / ;'
|
||||
/ ' run;'
|
||||
/ ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;'
|
||||
/ ' )));'
|
||||
;
|
||||
end;
|
||||
else
|
||||
do;
|
||||
/* include the file with the code of the element */
|
||||
put ' %include' " &_PackageFileref_.(_" folder +(-1) "." file +(-1) ') / nosource2;';
|
||||
end;
|
||||
|
||||
if upcase(type)=:'IMLMODULE' then
|
||||
put ' %let cherryPick_IML = %eval(&cherryPick_IML. + 1);';
|
||||
|
||||
@@ -2825,7 +2893,7 @@ data _null_;
|
||||
%end;
|
||||
put +(-1) '`.;''' /
|
||||
' !! '' %put The macro generated: '' !! put(dtCASLudf, E8601DT19.-L) !! ";"' /
|
||||
' !! '' %put with the SAS Packages Framework version 20230520.;''' /
|
||||
' !! '' %put with the SAS Packages Framework version 20231009.;''' /
|
||||
' !! '' %put ****************************************************************************;''' /
|
||||
' !! '' %GOTO theEndOfTheMacro;''' /
|
||||
' !! '' %end;''' ;
|
||||
@@ -2998,7 +3066,7 @@ data _null_;
|
||||
%end;
|
||||
put +(-1) '`.; '' !!' /
|
||||
''' %put The macro generated: ''' " !! put(dtIML, E8601DT19.-L) !! " '''; '' !!' /
|
||||
''' %put with the SAS Packages Framework version 20230520.; '' !! ' /
|
||||
''' %put with the SAS Packages Framework version 20231009.; '' !! ' /
|
||||
''' %put ****************************************************************************; '' !! ' /
|
||||
''' %GOTO theEndOfTheMacro; '' !! ' /
|
||||
''' %end; '' !! ' /
|
||||
@@ -3614,7 +3682,7 @@ data _null_;
|
||||
put "put @3 'localization (only if additional content was deployed during the installation process).';" / "put ;";
|
||||
%end;
|
||||
|
||||
put 'put "***"; put "* SAS package generated by generatePackage, version 20230520 *"; put "***";';
|
||||
put 'put "***"; put "* SAS package generated by generatePackage, version 20231009 *"; put "***";';
|
||||
|
||||
put 'run; ' /;
|
||||
|
||||
@@ -3708,15 +3776,37 @@ data _null_;
|
||||
put " stop; ";
|
||||
put "run; ";
|
||||
|
||||
/* cleanup */
|
||||
/* clean up */
|
||||
put "proc delete data = WORK._last_; ";
|
||||
put "run; ";
|
||||
put 'options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; ' /;
|
||||
|
||||
|
||||
/* generate dataset witch content information */
|
||||
put 'data &packageContentDS. _NULL_; '
|
||||
/ ' if "&packageContentDS." = " " then stop; '
|
||||
/ ' infile cards4 dlm = "/"; '
|
||||
/ ' input (folder order type file fileshort) (: $ 256.); '
|
||||
/ ' output; '
|
||||
/ 'cards4; '
|
||||
;
|
||||
|
||||
EOFDS = 0;
|
||||
do until(EOFDS);
|
||||
/* content is created during package creation */
|
||||
set &filesWithCodes. end = EOFDS;
|
||||
if upcase(type) in: ('TEST') then continue; /* exclude tests */
|
||||
strX = catx('/', folder, order, type, file, fileshort);
|
||||
put strX;
|
||||
end;
|
||||
|
||||
put ";;;;"
|
||||
/ "run;"
|
||||
/ 'options ls = &ls_tmp. ps = &ps_tmp. ¬es_tmp. &source_tmp.; '
|
||||
/ ;
|
||||
|
||||
put '%put NOTE: '"Help for package &packageName., version &packageVersion., license &packageLicense.;";
|
||||
put '%put NOTE- *** END ***;' /;
|
||||
put "/* help.sas end */";
|
||||
|
||||
|
||||
stop;
|
||||
run;
|
||||
|
||||
@@ -3985,7 +4075,20 @@ filename &zipReferrence. clear;
|
||||
%put NOTE-;
|
||||
/* in case the packages macrovariable is multi-directory the first directory will be selected */
|
||||
data _null_;
|
||||
call symputX("packages", dequote(kscanx(resolve(symget("packages")), 1, "()", "QS")) ,"L");
|
||||
length packages $ 32767;
|
||||
packages = resolve(symget("packages"));
|
||||
|
||||
/* check if path contains quotes */
|
||||
quotes = lengthn(compress(packages,"""'","K"));
|
||||
|
||||
/* issue error for unmatched quotes */
|
||||
if mod(quotes,2) then
|
||||
put "ERROR: Unbalanced quotes in the PACKAGES= parameter." / "ERROR- " PACKAGES= ;
|
||||
|
||||
if quotes > 0 then
|
||||
call symputX("packages", dequote(kscanx(packages, 1, "()", "QS")) ,"L");
|
||||
else
|
||||
call symputX("packages", packages ,"L");
|
||||
run;
|
||||
|
||||
/* check if systask is available */
|
||||
@@ -4001,7 +4104,9 @@ run;
|
||||
put 'NOTE-';
|
||||
|
||||
n=6;
|
||||
put @n "filename packages '&packages.';" /;
|
||||
length packages $ 32767;
|
||||
packages = quote(dequote(strip(symget('packages'))));
|
||||
put @n "filename packages " packages ";" /;
|
||||
|
||||
if fileexist("&packages./SPFinit.sas") then
|
||||
put @n '%include packages(SPFinit.sas);' /;
|
||||
@@ -4598,7 +4703,7 @@ TODO: (in Polish)
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to load multiple SAS packages at one run, version 20230520. Run %loadPackages() for help info.'
|
||||
des = 'Macro to load multiple SAS packages at one run, version 20231009. Run %loadPackages() for help info.'
|
||||
parmbuff
|
||||
;
|
||||
%if (%superq(packagesNames) = ) OR (%qupcase(&packagesNames.) = HELP) %then
|
||||
@@ -4614,7 +4719,7 @@ parmbuff
|
||||
%put ### This is short help information for the `loadPackageS` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro wrapper for the loadPackage macro, version `20230520` #;
|
||||
%put # Macro wrapper for the loadPackage macro, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -4711,7 +4816,7 @@ parmbuff
|
||||
hashing_file() function, SAS 9.4M6 */
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to verify SAS package with the hash digest, version 20230520. Run %verifyPackage() for help info.'
|
||||
des = 'Macro to verify SAS package with the hash digest, version 20231009. Run %verifyPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -4726,7 +4831,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20230520. Run %
|
||||
%put ### This is short help information for the `verifyPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to verify SAS package with it hash digest, version `20230520` #;
|
||||
%put # Macro to verify SAS package with it hash digest, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -4905,7 +5010,7 @@ des = 'Macro to verify SAS package with the hash digest, version 20230520. Run %
|
||||
*/
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to preview content of a SAS package, version 20230520. Run %previewPackage() for help info.'
|
||||
des = 'Macro to preview content of a SAS package, version 20231009. Run %previewPackage() for help info.'
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
%do;
|
||||
@@ -4920,7 +5025,7 @@ des = 'Macro to preview content of a SAS package, version 20230520. Run %preview
|
||||
%put ### This is short help information for the `previewPackage` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to get previwe of a SAS packages, version `20230520` #;
|
||||
%put # Macro to get previwe of a SAS packages, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -5047,7 +5152,7 @@ des = 'Macro to preview content of a SAS package, version 20230520. Run %preview
|
||||
when empty the "packages" value is used */
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to list directories pointed by "packages" fileref, version 20230520. Run %extendPackagesFileref(HELP) for help info.'
|
||||
des = 'Macro to list directories pointed by "packages" fileref, version 20231009. Run %extendPackagesFileref(HELP) for help info.'
|
||||
;
|
||||
|
||||
%if %QUPCASE(&packages.) = HELP %then
|
||||
@@ -5063,7 +5168,7 @@ des = 'Macro to list directories pointed by "packages" fileref, version 20230520
|
||||
%put ### This is short help information for the `extendPackagesFileref` macro #;
|
||||
%put #-----------------------------------------------------------------------------------------#;;
|
||||
%put # #;
|
||||
%put # Macro to list directories pointed by 'packages' fileref, version `20230520` #;
|
||||
%put # Macro to list directories pointed by 'packages' fileref, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
@@ -5164,7 +5269,7 @@ filename packages list;
|
||||
is provided in required version */
|
||||
)/secure
|
||||
/*** HELP END ***/
|
||||
des = 'Macro to load additional content for a SAS package, version 20230520. Run %loadPackageAddCnt() for help info.'
|
||||
des = 'Macro to load additional content for a SAS package, version 20231009. Run %loadPackageAddCnt() for help info.'
|
||||
minoperator
|
||||
;
|
||||
%if (%superq(packageName) = ) OR (%qupcase(&packageName.) = HELP) %then
|
||||
@@ -5180,7 +5285,7 @@ minoperator
|
||||
%put ### This is short help information for the `loadPackageAddCnt` macro #;
|
||||
%put #-------------------------------------------------------------------------------#;
|
||||
%put # #;
|
||||
%put # Macro to *load* additional content for a SAS package, version `20230520` #;
|
||||
%put # Macro to *load* additional content for a SAS package, version `20231009` #;
|
||||
%put # #;
|
||||
%put # A SAS package is a zip file containing a group #;
|
||||
%put # of SAS codes (macros, functions, data steps generating #;
|
||||
|
||||
@@ -10,7 +10,7 @@ Packages:
|
||||
|
||||
---
|
||||
|
||||
- **SQLinDS**\[2.2.6\], based on Mike Rhoads' article *Use the Full Power of SAS in Your Function-Style Macros*. The package allows to write SQL queries in the data step, e.g.
|
||||
- **SQLinDS**\[2.2.7\], based on Mike Rhoads' article *Use the Full Power of SAS in Your Function-Style Macros*. The package allows to write SQL queries in the data step, e.g.
|
||||
```sas
|
||||
data class;
|
||||
set %SQL(
|
||||
@@ -22,13 +22,13 @@ data class;
|
||||
WH = weight + height;
|
||||
run;
|
||||
```
|
||||
SHA256 digest for SQLinDS: F*3BB422E8C94515DEE9E13E674A0D119794F464D9597C28D5D536E71F64EB5298
|
||||
SHA256 digest for SQLinDS: F*42DC179E1D2B946AD519C4EC04A068061B312E021C3F4BC4826D2775E116E1B9
|
||||
|
||||
[Documentation for SQLinDS](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/sqlinds.md "Documentation for SQLinDS")
|
||||
|
||||
---
|
||||
|
||||
- **DFA** (Dynamic Function Arrays)\[0.5.5\], contains set of macros and FCMP functions which implement: a dynamically allocated array, a stack, a fifo queue, an ordered stack, and a priority queue, run `%helpPackage(DFA,createDFArray)` to find examples.
|
||||
- **DFA** (Dynamic Function Arrays)\[0.5.6\], contains set of macros and FCMP functions which implement: a dynamically allocated array, a stack, a fifo queue, an ordered stack, and a priority queue, run `%helpPackage(DFA,createDFArray)` to find examples.
|
||||
```sas
|
||||
%createDFArray(ArrDynamic, resizefactor=17);
|
||||
|
||||
@@ -55,13 +55,13 @@ data _null_;
|
||||
end;
|
||||
run;
|
||||
```
|
||||
SHA256 digest for DFA: F*924711C77E413B8CFC18336DDA2293A9F5294D02E267C1BB7BC876B4AF0AABE4
|
||||
SHA256 digest for DFA: F*09EA5201360922A91A9EEE72F4567792E9CFDFB591BA33419E2BF2B31D9B7C62
|
||||
|
||||
[Documentation for DFA](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/dfa.md "Documentation for DFA")
|
||||
|
||||
---
|
||||
|
||||
- **macroArray**\[1.0.5\], implementation of an array concept in a macro language, e.g.
|
||||
- **macroArray**\[1.1.1\], implementation of an array concept in a macro language, e.g.
|
||||
```sas
|
||||
%array(ABC[17] (111:127), macarray=Y);
|
||||
|
||||
@@ -80,13 +80,13 @@ SHA256 digest for DFA: F*924711C77E413B8CFC18336DDA2293A9F5294D02E267C1BB7BC876B
|
||||
which = 1:H:2
|
||||
);
|
||||
```
|
||||
SHA256 digest for macroArray: F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B4555A963180D767160
|
||||
SHA256 digest for macroArray: F*E9C0C58FB36AC40C76A518066B8C6F9942202A9DB2C2D737E95D2BB6E4ECED50
|
||||
|
||||
[Documentation for macroArray](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/macroarray.md "Documentation for macroArray")
|
||||
|
||||
---
|
||||
|
||||
- **BasePlus**\[1.29.0\] adds a bunch of functionalities I am missing in BASE SAS, such as:
|
||||
- **BasePlus**\[1.30.0\] adds a bunch of functionalities I am missing in BASE SAS, such as:
|
||||
```sas
|
||||
call arrMissToRight(myArray);
|
||||
call arrFillMiss(17, myArray);
|
||||
@@ -110,25 +110,25 @@ format x bool.;
|
||||
|
||||
%put %repeatTxt(#,15,s=$) HELLO SAS! %repeatTxt(#,15,s=$);
|
||||
```
|
||||
SHA256 digest for BasePlus: F*9EEE4F4B99EA725B60141645AB6A50BFEBA32CE54848593F8D832D907D63CAD7
|
||||
SHA256 digest for BasePlus: F*B91771D45C781B6806DBB44A3B491A0784D7698B9F3BBBE1A86EE5594834315F
|
||||
|
||||
[Documentation for BasePlus](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/baseplus.md "Documentation for BasePlus")
|
||||
|
||||
---
|
||||
|
||||
- **GSM** (Generate Secure Macros)\[0.21.0\], package allows
|
||||
- **GSM** (Generate Secure Macros)\[0.21.1\], package allows
|
||||
to create secured macros stored in SAS Proc FCMP functions.
|
||||
The dataset with functions can be shared between different operating systems
|
||||
and allows to generate macros on site without showing their code.
|
||||
|
||||
SHA256 digest for GSM: F*56DC0DCCE06B4281BF3FA6FA3875CBA87772BDA7FAB601B06740A7980FFB0E07
|
||||
SHA256 digest for GSM: F*2FECDDB568B38E206CA4ADA6FDEF5209C0A08B99401A1510D777BABF9DA54682
|
||||
|
||||
[Documentation for GSM](https://github.com/yabwon/SAS_PACKAGES/blob/main/packages/gsm.md "Documentation for GSM")
|
||||
|
||||
---
|
||||
|
||||
- **dynMacroArray**\[0.2.5\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA). Development of this package is currently on hold.
|
||||
- **dynMacroArray**\[0.2.6\], set of macros (wrappers for a hash table) emulating dynamic array in the data step (macro predecessor of DFA). Development of this package is currently on hold.
|
||||
|
||||
SHA256 digest for dynMacroArray: F*6E087F38BB39B93CBF983124272812E14693C4EF5EE0A3A218BD2BAA069A74BF
|
||||
SHA256 digest for dynMacroArray: F*F50BEDB542D96B07C763EAB7549FBC5F08ED389DC2338BFAAEBFBD1FD20E22B6
|
||||
|
||||
---
|
||||
|
||||
@@ -1,3 +1,20 @@
|
||||
/* 20230921 */
|
||||
macroArray: F*E9C0C58FB36AC40C76A518066B8C6F9942202A9DB2C2D737E95D2BB6E4ECED50
|
||||
|
||||
/* 20230919 */
|
||||
BasePlus: F*B91771D45C781B6806DBB44A3B491A0784D7698B9F3BBBE1A86EE5594834315F
|
||||
|
||||
/* 20230906 */
|
||||
macroArray: F*6A22A01868F4203862B3685F543D723C7DB8E9AB3C1A6357D2BFA030971B0D3C
|
||||
|
||||
/* 20230904 */
|
||||
BasePlus: F*2FE68DD9B3692B9D46EF85B82F63C7E65010BF9E89D670FD1779F4670FA03F31
|
||||
DFA: F*09EA5201360922A91A9EEE72F4567792E9CFDFB591BA33419E2BF2B31D9B7C62
|
||||
dynMacroArray: F*F50BEDB542D96B07C763EAB7549FBC5F08ED389DC2338BFAAEBFBD1FD20E22B6
|
||||
GSM: F*2FECDDB568B38E206CA4ADA6FDEF5209C0A08B99401A1510D777BABF9DA54682
|
||||
macroArray: F*4FAAEE7DF2854EA31933AE017A89C1615C7291A66A07CCE345041EB0D587ED4E
|
||||
SQLinDS: F*42DC179E1D2B946AD519C4EC04A068061B312E021C3F4BC4826D2775E116E1B9
|
||||
|
||||
/* 20230824 */
|
||||
BasePlus: F*9EEE4F4B99EA725B60141645AB6A50BFEBA32CE54848593F8D832D907D63CAD7
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
* [`%bpPIPE()` macro](#bppipe-macro)
|
||||
* [`%dirsAndFiles()` macro](#dirsandfiles-macro)
|
||||
* [`%repeatTxt()` macro](#repeattxt-macro)
|
||||
* [`%repList()` macro](#replist-macro)
|
||||
* [`%intsList()` macro](#intslist-macro)
|
||||
* [`%letters()` macro](#letters-macro)
|
||||
* [`%splitDSIntoBlocks()` macro](#splitdsintoblocks-macro)
|
||||
@@ -72,7 +73,7 @@
|
||||
|
||||
---
|
||||
|
||||
# The BasePlus package [ver. 1.29.0] <a name="baseplus-package"></a> ###############################################
|
||||
# The BasePlus package [ver. 1.30.0] <a name="baseplus-package"></a> ###############################################
|
||||
|
||||
The **BasePlus** package implements useful
|
||||
functions and functionalities I miss in the BASE SAS.
|
||||
@@ -309,6 +310,33 @@ run;
|
||||
run;
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**EXAMPLE 22** Repeating texts and lists:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
options mprint;
|
||||
|
||||
data work.A;
|
||||
x=17;
|
||||
data work.B;
|
||||
x=42;
|
||||
data work.C;
|
||||
x=303;
|
||||
run;
|
||||
|
||||
data work.test5;
|
||||
set
|
||||
%repeatTxt(work.A work.B work.C, 5)
|
||||
;
|
||||
run;
|
||||
|
||||
|
||||
data Times2_A3B4C5;
|
||||
set
|
||||
%repList(work.A work.B work.C, times = 2, each = 3 4 5)
|
||||
;
|
||||
run;
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
---
|
||||
|
||||
Package contains:
|
||||
@@ -375,9 +403,11 @@ Package contains:
|
||||
61. macro letters
|
||||
62. macro libpath
|
||||
63. macro minclude
|
||||
64. macro translate
|
||||
65. macro tranwrd
|
||||
66. macro workpath
|
||||
64. macro replist
|
||||
65. macro translate
|
||||
66. macro tranwrd
|
||||
67. macro workpath
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -385,10 +415,10 @@ Package contains additional content, run: %loadPackageAddCnt(BasePlus) to load
|
||||
or look for the baseplus_AdditionalContent directory in the Packages fileref
|
||||
localization (only if additional content was deployed during the installation process).
|
||||
|
||||
* SAS package generated by generatePackage, version 20230520 *
|
||||
* SAS package generated by generatePackage, version 20230905 *
|
||||
|
||||
The SHA256 hash digest for package BasePlus:
|
||||
`F*9EEE4F4B99EA725B60141645AB6A50BFEBA32CE54848593F8D832D907D63CAD7`
|
||||
`F*B91771D45C781B6806DBB44A3B491A0784D7698B9F3BBBE1A86EE5594834315F`
|
||||
|
||||
---
|
||||
# Content description ############################################################################################
|
||||
@@ -4399,6 +4429,118 @@ run;
|
||||
|
||||
---
|
||||
|
||||
## >>> `%repList()` macro: <<< <a name="replist-macro"></a> #######################
|
||||
|
||||
The repList() macro function allows to repeat `T`
|
||||
times elements of a `L` list, possibly `E` times each element,
|
||||
separated by string `S`.
|
||||
|
||||
See examples below for the details.
|
||||
|
||||
The `%repList()` macro executes like a pure macro code.
|
||||
|
||||
### SYNTAX: ###################################################################
|
||||
|
||||
The basic syntax is the following, the `<...>` means optional parameters:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%repList(
|
||||
list
|
||||
<,times=>
|
||||
<,each=>
|
||||
<,lenghtOut=>
|
||||
<,sep=>
|
||||
)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**Arguments description**:
|
||||
|
||||
1. `list` - *Required*, a list of elements to be repeated.
|
||||
List can be space or comma separated.
|
||||
Elements can be in quotes.
|
||||
For comma separated list add brackets
|
||||
e.g., `%repList((A,B,C,D),times=5)`.
|
||||
The list separators are: `<{[( ,;)]}>`.
|
||||
|
||||
* `times=` - *Optional*, An integer indicating
|
||||
the number of repetitions.
|
||||
By default set to `1`.
|
||||
|
||||
|
||||
* `each=` - *Optional*, A list of integers indicating
|
||||
the number of repetitions of each element of the list
|
||||
e.g., for a list `A B C` and the `each=2 4` the result
|
||||
is `A A B B B B C C`. If the number of integers is less
|
||||
then the length of the list values are recycled from
|
||||
the beginning.
|
||||
By default set to `1`.
|
||||
|
||||
* `lenghtOut=` - *Optional*, An integer indicating
|
||||
after what the number of repetitions process will stop.
|
||||
By default set to `0` which means "do not stop".
|
||||
|
||||
* `sep=` - *Optional*, it is a separator printed between
|
||||
repeated elements. Mnemonics for *space* is `s`,
|
||||
for *comma* is `c`, and for semicolon in `q`.
|
||||
Default value is a single space.
|
||||
|
||||
|
||||
### EXAMPLES AND USECASES: ####################################################
|
||||
|
||||
**EXAMPLE 1.** Simple repetition of all elements:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%put %repList((A,B,C,D), times=3);
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
**EXAMPLE 2.** Simple repetition of each element:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%put %repList(("A",'B',"C",'D'), each=3);
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
**EXAMPLE 3.** Simple repetition with a separator:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%put %repList(A10;B20;C30, times=3, each=2, sep=Q);
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
**EXAMPLE 4.** Recycle elements up to 8 with a comma as a separator:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%put %repList(1 2 3, lenghtOut=8, sep=c);
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**EXAMPLE 5.** Separate number of repetitions for each element:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%put [%repList([D][C][B][A], each = 2 3 5 7, sep=] [)];
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**EXAMPLE 6.** "ASCII art" butterflies:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%put {>%repList(! $ |, times = 2, each =2 1, sep=<} ... {>)<};
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
**EXAMPLE 7.** Data repeating:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
data A;
|
||||
x=17;
|
||||
data B;
|
||||
x=42;
|
||||
data C;
|
||||
x=303;
|
||||
run;
|
||||
|
||||
data Times2_A10B11C12;
|
||||
set
|
||||
%repList(A B C, times = 2, each =10 11 12)
|
||||
;
|
||||
run;
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
---
|
||||
|
||||
|
||||
## >>> `%intsList()` macro: <<< <a name="intslist-macro"></a> #######################
|
||||
|
||||
The intsList() macro function allows to print a list of
|
||||
|
||||
Binary file not shown.
@@ -18,7 +18,7 @@
|
||||
|
||||
---
|
||||
|
||||
# The DFA package [ver. 0.5.5] <a name="dfa-package"></a> ###############################################
|
||||
# The DFA package [ver. 0.5.6] <a name="dfa-package"></a> ###############################################
|
||||
|
||||
The **DFA** (a.k.a. *Dynamic Function Array*) package implements:
|
||||
- dynamic numeric and character arrays,
|
||||
@@ -52,10 +52,10 @@ Package contains:
|
||||
12. exec generatearrays
|
||||
13. clean generatearrays
|
||||
|
||||
*SAS package generated by generatePackage, version 20230411*
|
||||
*SAS package generated by generatePackage, version 20230905*
|
||||
|
||||
The SHA256 hash digest for package BasePlus:
|
||||
`F*924711C77E413B8CFC18336DDA2293A9F5294D02E267C1BB7BC876B4AF0AABE4`
|
||||
The SHA256 hash digest for package DFA:
|
||||
`F*09EA5201360922A91A9EEE72F4567792E9CFDFB591BA33419E2BF2B31D9B7C62`
|
||||
|
||||
---
|
||||
# Content description ############################################################################################
|
||||
|
||||
BIN
packages/dfa.zip
BIN
packages/dfa.zip
Binary file not shown.
Binary file not shown.
@@ -8,7 +8,7 @@
|
||||
---
|
||||
|
||||
|
||||
# The GSM package [ver. 0.21.0] <a name="gsm-package"></a> ###############################################
|
||||
# The GSM package [ver. 0.21.1] <a name="gsm-package"></a> ###############################################
|
||||
|
||||
The **GSM** (a.k.a. *Generate Secure Macros*) package allows
|
||||
to create secured macros stored in SAS Proc FCMP functions.
|
||||
@@ -91,10 +91,10 @@ Package contains:
|
||||
Required SAS Components:
|
||||
`Base SAS Software`
|
||||
|
||||
*SAS package generated by generatePackage, version 20230520*
|
||||
*SAS package generated by generatePackage, version 20230905*
|
||||
|
||||
The SHA256 hash digest for package GSM:
|
||||
`F*56DC0DCCE06B4281BF3FA6FA3875CBA87772BDA7FAB601B06740A7980FFB0E07`
|
||||
`F*2FECDDB568B38E206CA4ADA6FDEF5209C0A08B99401A1510D777BABF9DA54682`
|
||||
|
||||
|
||||
## >>> `%GSM()` macro: <<< <a name="gsm-macro"></a> #######################
|
||||
|
||||
BIN
packages/gsm.zip
BIN
packages/gsm.zip
Binary file not shown.
@@ -19,7 +19,7 @@
|
||||
|
||||
---
|
||||
|
||||
# The macroArray package [ver. 1.0.5] <a name="macroarray-package"></a> ###############################################
|
||||
# The macroArray package [ver. 1.1.1] <a name="macroarray-package"></a> ###############################################
|
||||
|
||||
The **macroArray** package implements a macro array facility:
|
||||
- `%array()`,
|
||||
@@ -75,10 +75,10 @@ Package contains:
|
||||
Required SAS Components:
|
||||
*Base SAS Software*
|
||||
|
||||
*SAS package generated by generatePackage, version 20230411*
|
||||
*SAS package generated by generatePackage, version 20230904*
|
||||
|
||||
The SHA256 hash digest for package macroArray:
|
||||
`F*85E3BE4D163AC5223B6EC9D3C25C46564A656E3830998B4555A963180D767160`
|
||||
`F*E9C0C58FB36AC40C76A518066B8C6F9942202A9DB2C2D737E95D2BB6E4ECED50`
|
||||
|
||||
---
|
||||
# Content description ############################################################################################
|
||||
@@ -278,6 +278,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
<,macarray=N>
|
||||
<,ds=>
|
||||
<,vars=>
|
||||
<,q=>
|
||||
)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -312,8 +313,8 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
`%array(myArr[*] x1-x3 (4:6), vnames=Y)`
|
||||
will use `x1`, `x2`, and `x3` as values instead `4`, `5`, and `6`.
|
||||
|
||||
* `macarray=N` - *Optional*, default value `N`, if set to `Y`/`YES` then macro named with array
|
||||
name is compiled to create convenient envelope for multiple ampersands, e.g.
|
||||
* `macarray=N` - *Optional*, default value `N`, if set to `Y`/`YES` then a macro, named with the array
|
||||
name, is compiled to create convenient envelope for multiple ampersands, e.g.
|
||||
`%array(myArr[*] x1-x3 (4:6), macarray=Y)`
|
||||
will create `%myArr(J)` macro which will allow to extract "data"
|
||||
from macroarray like:
|
||||
@@ -325,8 +326,8 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
macrovariables with prefix like the array name and numeric suffixes,
|
||||
then the minimum and the maximum index is determined
|
||||
and all not existing global macrovariables are created and
|
||||
a macro is generated in the same way as for the `Y` value
|
||||
|
||||
a macro is generated in the same way as for the `Y` value.
|
||||
|
||||
* `ds=` - *Optional*, use a dataset as a basis for a macroarray data,
|
||||
if used by default overwrites use of the `array` parameter, honors `macarray=`
|
||||
argument, dataset options are allowed, e.g. `sashelp.class(obs=5)`
|
||||
@@ -343,23 +344,27 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
2) macroarray "WEIGHT" with ALL(no separator is equivalent to #)
|
||||
values of variable "weight" <br>
|
||||
3) macroarray "W" with UNIQUE(|) values of variable "weight" and <br>
|
||||
4) macroarray "AGE" with UNIQUE(|) values of variable "age",
|
||||
|
||||
4) macroarray "AGE" with UNIQUE(|) values of variable "age".
|
||||
|
||||
* `q=` - *Optional*, indicates (when set to `1`) if the value be surrounded by quotes.
|
||||
It uses `quote(cats(...))` combo under the hood. Default value is `0`.
|
||||
Ignored for `macarray=M`.
|
||||
|
||||
|
||||
---
|
||||
|
||||
### EXAMPLES AND USECASES: ####################################################
|
||||
|
||||
|
||||
**EXAMPLE 1.** Basic use-case.
|
||||
Creating macroarray like in the array statement;
|
||||
values are used by default;
|
||||
different types of brackets are allowed;
|
||||
Creating macroarray like in the array statement.
|
||||
Values not variables names are used by default.
|
||||
Different types of brackets are allowed.
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%array(a[*] x1-x5 (1:5))
|
||||
|
||||
%array(b{5} (5*17))
|
||||
%array(b{5} (5*17), q=1)
|
||||
|
||||
%* Mind the $ since it is a character array!;
|
||||
%array(c(3) $ 10 ("a A" "b,B" "c;C"))
|
||||
@@ -405,7 +410,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
%put &=g0. &=g1. &=g2.;
|
||||
|
||||
%* Or something more complex;
|
||||
%array(gg[0:11] $ 11, function = put(intnx("MONTH", '1jun2018'd, _I_, "E"), yymmn.))
|
||||
%array(gg[0:11] $ 11, function = put(intnx("MONTH", '1jun2018'd, _I_, "E"), yymmn.), q=1)
|
||||
%put &=ggLBOUND. &=ggHBOUND. &=ggN.;
|
||||
%put &=gg0 &=gg1 &=gg2 ... &=gg11;
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
@@ -433,10 +438,10 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
**EXAMPLE 6a.** "Uppercas Letters"
|
||||
**EXAMPLE 6a.** Quoted "Uppercas Letters"
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%array(UL[26] $, function = byte(rank("A")+_I_-1) )
|
||||
%array(UL[26] $, function = byte(rank("A")+_I_-1) , q=1)
|
||||
%put &=UL1 &=UL2 ... &=UL25 &=UL26;
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -451,7 +456,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
|
||||
%* The range handling, warning;
|
||||
%put *%ll(265)*;
|
||||
|
||||
|
||||
%* The input mode;
|
||||
%put *before:*%ll(2)*;
|
||||
%let %ll(2,I) = bbbbb;
|
||||
@@ -576,10 +581,10 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
Currently the only separator in VARS is a space.
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~sas
|
||||
%array(ds = sashelp.class, vars = height#h weight weight|w age|)
|
||||
%array(ds = sashelp.class, vars = height#h weight weight|w age|, q=1)
|
||||
%put _user_;
|
||||
|
||||
%array(ds = sashelp.class, vars = height#hght weight weight|wght age|, macarray=Y)
|
||||
%array(ds = sashelp.class, vars = height#hght weight weight|wght age|, macarray=Y, q=1)
|
||||
%put *%hght(&hghtLBOUND.)**%weight(2)**%wght(&wghtHBOUND.)**%age(3)*;
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -599,7 +604,7 @@ The basic syntax is the following, the `<...>` means optional parameters:
|
||||
%let myTest6 = 16;
|
||||
%let myTest9 = 19;
|
||||
|
||||
%array(myTest, macarray=M)
|
||||
%array(myTest, macarray=M, q=1)
|
||||
%do_over(myTest, phrase = %nrstr(%put *&_I_.*%myTest(&_I_.)*;))
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
Binary file not shown.
@@ -8,7 +8,7 @@
|
||||
|
||||
---
|
||||
|
||||
# The SQLinDS package [ver. 2.2.6] <a name="sqlinds-package"></a> ###############################################
|
||||
# The SQLinDS package [ver. 2.2.7] <a name="sqlinds-package"></a> ###############################################
|
||||
|
||||
The **SQLinDS** package is an implementation of
|
||||
the *macro-function-sandwich* concept introduced in the
|
||||
@@ -49,10 +49,10 @@ Package contains:
|
||||
Required SAS Components:
|
||||
*Base SAS Software*
|
||||
|
||||
*SAS package generated by generatePackage, version 20230411*
|
||||
*SAS package generated by generatePackage, version 20230905*
|
||||
|
||||
The SHA256 hash digest for package SQLinDS:
|
||||
`F*3BB422E8C94515DEE9E13E674A0D119794F464D9597C28D5D536E71F64EB5298`
|
||||
`F*42DC179E1D2B946AD519C4EC04A068061B312E021C3F4BC4826D2775E116E1B9`
|
||||
|
||||
---
|
||||
# Content description ############################################################################################
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user