You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
418 lines
18 KiB
Plaintext
418 lines
18 KiB
Plaintext
9 months ago
|
*! sasexe Version 2.2 dan.blanchette@duke.edu 04May2009
|
||
|
*! Center for Entrepreneurship and Innovation Duke University's Fuqua School of Business
|
||
|
* - added directory for SAS 9.2 executable
|
||
|
* - stopped having it use -shortdir- and started returning wsas in double quotes
|
||
|
* sasexe Version 2.1 dan.blanchette@duke.edu 16Mar2009
|
||
|
* - made it so saswrapper can run it
|
||
|
* sasexe Version 2.1 dan_blanchette@unc.edu 03Mar2008
|
||
|
* research computing, unc-ch
|
||
|
* - added a check for environment variable %MAINDIR% in foreach loop through users path
|
||
|
* if this variable doesn't exist then don't look for sas.exe there.
|
||
|
* - removed references to J: drive locations of SAS
|
||
|
* - added error message that -sasexe- cannot be run in Stata batch in Windows
|
||
|
* sasexe Version 2.0 dan_blanchette@unc.edu 06Sep2006
|
||
|
** the carolina population center, unc-ch
|
||
|
** - need to return what version of SAS is running
|
||
|
** - not only does sasexe look to see if sas executable file exists but also if it works
|
||
|
** and figures out what version it is.
|
||
|
** - looks in environment variable PATH as a last ditch effort to find the SAS executable file
|
||
|
** - added search for the char2fmt SAS macro file char2fmt.mac
|
||
|
** sasexe Version 1.0 dan_blanchette@unc.edu 02Sep2004
|
||
|
/* updated on 02Sep2004: added new drive specification for UNC afs pc-pkg space SAS users */
|
||
|
/* updated on 11Mar2004: added message to UNIX users on how to
|
||
|
* find their sas executable file. */
|
||
|
** sasexe Version 1.0 dan_blanchette@unc.edu 06Nov2003
|
||
|
|
||
|
|
||
|
program define sasexe, rclass
|
||
|
version 8
|
||
|
|
||
|
*** SET LOCATION OF SAS EXECUTABLE HERE ***
|
||
|
*------------------------------------------*
|
||
|
|
||
|
// set the macro var appropriate for your operating system
|
||
|
// and feel free to send me the location so that I can add it to the
|
||
|
// list of locations that -sasexe- searches through so that in future
|
||
|
// updates your executable location will already be set
|
||
|
local wsas `""' // location of windows sas executable file
|
||
|
local usas `""' // location of UNIX/Linux sas executable file
|
||
|
local rver `""' // version of sas you think you are running like v8, v9
|
||
|
// local rver `"v9"'
|
||
|
|
||
|
|
||
|
/* If you are using -savasas- and don't have SAS and just want to create a SAS program
|
||
|
* and temp data files set what version you think the SAS program will be run in here: */
|
||
|
local nosasver= `""' // this is not an option for -usesas-
|
||
|
|
||
|
|
||
|
|
||
|
*** SET LOCATION OF SAVASTATA MACRO HERE FOR USESAS ***
|
||
|
*-----------------------------------------------------*
|
||
|
/** for example:
|
||
|
local savastata "C:\ado\plus\s\savastata.sas" **/
|
||
|
local savastata ""
|
||
|
** note: if you set the location of savastata you must also set
|
||
|
* the locaton of char2fmt
|
||
|
|
||
|
*** SET LOCATION OF CHAR2FMT MACRO HERE FOR USESAS ***
|
||
|
*-----------------------------------------------------*
|
||
|
/** for example:
|
||
|
local char2fmt "C:\ado\plus\c\char2fmt.sas" **/
|
||
|
local char2fmt ""
|
||
|
** note: if you set the location of char2fmt you must also set
|
||
|
* the locaton of savastata
|
||
|
|
||
|
|
||
|
*****************************************************************
|
||
|
******* ! NO MORE EDITS SHOULD BE MADE AFTER THIS POINT ! *******
|
||
|
*****************************************************************
|
||
|
|
||
|
// the 2nd argument is the location of SAS executable if invoked by savas
|
||
|
if "`1'" == "savasas" & `"`2'"' != `""' & `"`2'"' != `"sascode"' {
|
||
|
local usas `"`2'"' // location of UNIX/Linux sas executable file
|
||
|
}
|
||
|
|
||
|
if `"`nosasver'"' == "" {
|
||
|
if "`c(os)'" == "Windows" & !missing(`"`usas'"') {
|
||
|
local usas = "" // set to missing for the logic of this program
|
||
|
}
|
||
|
else if "`c(os)'" != "Windows" & !missing(`"`wsas'"') {
|
||
|
local wsas = "" // set to missing for the logic of this program
|
||
|
}
|
||
|
** User set wsas or usas location so check it out **
|
||
|
** --------------------------------------------------------------------- **
|
||
|
if `"`wsas'"' != "" | "`usas'" != "" /* & "`2'" == "" */ { // sasexe tries to find sas executable otherwise
|
||
|
if "`c(os)'" == "Windows" {
|
||
|
if !missing(`"`wsas'"') {
|
||
|
capture confirm file `"`wsas'"'
|
||
|
if _rc==0 {
|
||
|
// find out if this works and what version
|
||
|
sasexe_ver, sasexe(`"`wsas'"')
|
||
|
if "`r(rver)'" == "" {
|
||
|
// if version wasn't figured out then sas didn't work
|
||
|
local wsas ""
|
||
|
}
|
||
|
else { // if rver is something then sas works
|
||
|
local rver "v`= int(`r(rver)')'"
|
||
|
di as res _n `"`1' has found the SAS executable file:"'
|
||
|
di as res `"`wsas'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else { // if os is not Windows (UNIX/Linux)
|
||
|
if !missing(`"`usas'"') {
|
||
|
capture confirm file `"`wsas'"'
|
||
|
if _rc==0 {
|
||
|
// find out if this works and what version
|
||
|
sasexe_ver, sasexe(`"`usas'"')
|
||
|
if "`r(rver)'" == "" {
|
||
|
// if version wasn't figured out then sas didn't work
|
||
|
local usas ""
|
||
|
}
|
||
|
else { // if rver is something then sas works
|
||
|
local rver "v`= int(`r(rver)')'"
|
||
|
di as res _n `"`1' has found the SAS executable file:"'
|
||
|
di as res `""`usas'""'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} // end of nosasver not set
|
||
|
|
||
|
** If above macros not set by user or set incorrectly **
|
||
|
** then have sasexe look in the usual locations **
|
||
|
** ---------------------------------------------------**
|
||
|
|
||
|
if "`1'"=="usesas" | "`1'"=="saswrapper" & (`"`savastata'"' == "" | `"`char2fmt'"' == "") {
|
||
|
foreach macro in savastata char2fmt {
|
||
|
capture confirm file `"x:\software/`macro'.sas"' /* network location */
|
||
|
if _rc==0 {
|
||
|
local `macro' `"x:\software/`macro'.sas"'
|
||
|
}
|
||
|
else {
|
||
|
// local set_macro `"/bigtemp/sas_macros/`macro'.sas"' /* CPC's location */
|
||
|
local set_macro `"/afs/isis/pkg/stata/.install/common/ado/updates/`macro'.sas"'
|
||
|
capture confirm file `"`set_macro'"' /* UNIX box location */
|
||
|
if _rc==0 {
|
||
|
local `macro' `"`set_macro'"'
|
||
|
}
|
||
|
else {
|
||
|
// find it in the adopath
|
||
|
capture findfile `macro'.sas
|
||
|
local cwd=`"`c(pwd)'"'
|
||
|
local dir=substr(`"`r(fn)'"',1,index(`"`r(fn)'"',"`macro'.sas")-1)
|
||
|
quietly cd `"`dir'"'
|
||
|
capture confirm file "`macro'.sas"
|
||
|
if _rc==0 {
|
||
|
local `macro' `"`c(pwd)'`c(dirsep)'`macro'.sas"'
|
||
|
}
|
||
|
quietly cd `"`cwd'"'
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} /* end of if savastata or char2fmt not set */
|
||
|
|
||
|
|
||
|
// search even if sascode requested (`2' means sascode) since version (rver) can still be figured out
|
||
|
if `"`nosasver'"' == "" & (`"`wsas'"' == "" | `"`usas'"' == "" ) /* & "`2'" == "" */ { // sasexe tries to find sas executable otherwise
|
||
|
if "`c(os)'"=="Windows" & `"`wsas'"'=="" {
|
||
|
foreach sas in "c:\progra~1\sas\sasfou~1\9.2\sas.exe" /// 9.2
|
||
|
"C:\Program Files\SAS\SAS 9.2\SASFoundation\9.2\sas.exe" ///9.2
|
||
|
"d:\progra~1\sas\sasfou~1\9.2\sas.exe" /// 9.2
|
||
|
"C:\Program Files\SAS\SASFoundation\9.2(32-bit)\sas.exe" /// 9.2
|
||
|
"d:\Program Files\SAS\SASFoundation\9.2(32-bit)\sas.exe" /// 9.2
|
||
|
"d:\SAS\SASFoundation\9.2(32-bit)\sas.exe" /// 9.2
|
||
|
"d:\sasfou~1\9.2\sas.exe" /// 9.2
|
||
|
"Y:\SASSER~1\v9\sas\sas.exe" /// Win XP
|
||
|
"Y:\SAS_SE~1\V9\SAS\SAS.EXE" /// Win 2000
|
||
|
"c:\progra~1\sas\sas9~1.1\sas.exe" ///
|
||
|
"c:\progra~1\sas\sas9~2\sas.exe" ///
|
||
|
"c:\progra~1\sasins~1\sas\v9\sas.exe" ///
|
||
|
"d:\sasv9~1.1\sas\sas.exe" ///
|
||
|
"d:\sasv9~2\sas\sas.exe" ///
|
||
|
/// now try version 8
|
||
|
"c:\progra~1\sasins~1\sas\v8\sas.exe" ///
|
||
|
"d:\sasv8~1\sas\sas.exe" ///
|
||
|
"Y:\SAS_SE~1\V8\SAS\SAS.EXE" /// Win 2000
|
||
|
"Y:\SASSER~1\V8\SAS\SAS.EXE" /* Win XP */ {
|
||
|
capture confirm file "`sas'"
|
||
|
if _rc==0 { // success!
|
||
|
local wsas `"`sas'"' /* for Windows */
|
||
|
// find out if this works and what version
|
||
|
sasexe_ver, sasexe(`"`wsas'"')
|
||
|
if "`r(rver)'" == "" {
|
||
|
// if version wasn't figured out then sas didn't work
|
||
|
local wsas ""
|
||
|
}
|
||
|
else { // if rver is something then sas works
|
||
|
local rver "v`= int(`r(rver)')'"
|
||
|
di as res _n `"`1' is going to run SAS `rver' executable: "`wsas'" "'
|
||
|
continue, break // stop looking
|
||
|
}
|
||
|
}
|
||
|
} /* end of foreach loop */
|
||
|
} /* end of if Windows */
|
||
|
|
||
|
else if "`c(os)'"=="Unix" & "`usas'"=="" {
|
||
|
if "`c(machine_type)'" == "Sun Solaris" {
|
||
|
capture confirm file `"/opt/sas9.1/sas"'
|
||
|
if _rc==0 {
|
||
|
local usas "`usas'"
|
||
|
local rver `"v9"'
|
||
|
}
|
||
|
}
|
||
|
else if "`c(machine_type)'" == "PC" { /* for Linux work stations */
|
||
|
capture confirm file `"/usr/bin/sas"'
|
||
|
if _rc==0 {
|
||
|
local usas "/usr/bin/sas"
|
||
|
// let sasexe figure out what version of SAS
|
||
|
sasexe_ver, sasexe(`"`usas'"')
|
||
|
local rver "v`= int(`r(rver)')'"
|
||
|
}
|
||
|
else {
|
||
|
capture confirm file `"/afs/isis/pkg/sas/sas"'
|
||
|
if _rc==0 {
|
||
|
/* for Linux in pkg space */
|
||
|
local usas `"/afs/isis/pkg/sas/sas"'
|
||
|
local rver `"v9"'
|
||
|
}
|
||
|
}
|
||
|
} // end if "PC" / a Linux box
|
||
|
else if "`c(machine_type)'" == "IBM RS/6000" {
|
||
|
capture confirm file `"/afs/isis/pkg/sas/sas"'
|
||
|
if _rc==0 {
|
||
|
local usas `"/afs/isis/pkg/sas/sas"' /* for UNIX */
|
||
|
local rver `"v9"'
|
||
|
}
|
||
|
}
|
||
|
} /* end of if UNIX */
|
||
|
|
||
|
if `"`wsas'"'=="" & "`usas'"=="" { // if still not set
|
||
|
// look in user's path
|
||
|
local path : environment PATH
|
||
|
local delim ":"
|
||
|
if "`c(os)'" == "Windows" local delim ";"
|
||
|
// allows for dirs to have spaces in the directory names
|
||
|
foreach dir in "`: subinstr local path "`delim'" `"" ""', all'" {
|
||
|
if `= index(`"`dir'"',"%MAINDIR%")' & `"`: environment MAINDIR'"' == "" continue
|
||
|
if "`c(os)'" == "Windows" & `"`: dir "`dir'" files sas.exe'"' == `""sas""' {
|
||
|
capture confirm file `"`dir'\sas.exe"'
|
||
|
if _rc==0 {
|
||
|
local wsas `"`dir'\sas.exe"'
|
||
|
// find out if this works and what version
|
||
|
sasexe_ver, sasexe(`"`wsas'"')
|
||
|
if "`r(rver)'" == "" {
|
||
|
// if version wasn't figured out then sas didn't work
|
||
|
local wsas ""
|
||
|
}
|
||
|
else { // if rver is something then sas works
|
||
|
local rver "v`= int(`r(rver)')'"
|
||
|
di as res _n `"`1' is going to run SAS `rver' executable: "`wsas'" "'
|
||
|
continue, break // leave loop once found sas executable
|
||
|
}
|
||
|
}
|
||
|
} // end of if Windows
|
||
|
else if `"`: dir "`dir'" files sas'"' == `""sas""' {
|
||
|
capture confirm file `"`dir'/sas"'
|
||
|
if _rc==0 {
|
||
|
local usas `"`dir'/sas"'
|
||
|
sasexe_ver, sasexe(`"`usas'"')
|
||
|
if "`r(rver)'" == "" {
|
||
|
// if version wasn't figured out then sas didn't work
|
||
|
local usas ""
|
||
|
}
|
||
|
else { // if rver is something then sas works
|
||
|
local rver "v`= int(`r(rver)')'"
|
||
|
di as res _n `"`1' is going to run SAS `rver' executable: "`usas'" "'
|
||
|
continue, break // leave loop once found sas executable
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} // end of foreach dir
|
||
|
|
||
|
if `"`wsas'"'=="" & "`usas'"=="" { // if _still_ not set
|
||
|
di "{error}Edit your sasexe.ado file to set the location *"
|
||
|
di "{error}of your SAS executable file. *"
|
||
|
which sasexe
|
||
|
di `" {stata adoedit sasexe:edit sasexe.ado} (click, to edit the sasexe.ado file, remember to save when done.)"'
|
||
|
if "`1'"=="savasas" di "{error}or use the {res}sascode {error}option in `1'. * "
|
||
|
if "`1'"=="usesas" di "{error} {help usesas:usesas} requires that you have a working version of SAS on this computer. "
|
||
|
if "`1'"=="saswrapper" di "{error} {help saswrapper:saswrapper} requires that you have a working version of SAS on this computer. "
|
||
|
if "`c(os)'"=="Unix" {
|
||
|
di `"{error} Your SAS executable is a file named "sas" not "sas.exe" and can be found by typing: *"'
|
||
|
di `"{text} which sas *"'
|
||
|
di `"{error} at a UNIX prompt. You may want to inform your UNIX administrator that *"'
|
||
|
di `"{error} you want to run SAS from Stata. * "'
|
||
|
}
|
||
|
exit 499
|
||
|
} // end of if wsas and usas _still_ empty
|
||
|
} // end of if wsas and usas still empty
|
||
|
|
||
|
} // end of if "`wsas'"=="" & "`usas'"=="" i.e. not set
|
||
|
|
||
|
/********* this block of code should not be needed anymore, it should not ever happen ****/
|
||
|
// check that if wsas or usas was set by user that they did it correctly
|
||
|
if `"`wsas'"'!="" & "`c(os)'"=="Windows" & "`2'"=="" { // `2' is if sascode requested
|
||
|
capture confirm file `"`wsas'"'
|
||
|
if _rc!=0 {
|
||
|
di `"{error}This is not the correct location of your SAS executable: "'
|
||
|
di `"{res}`wsas' "'
|
||
|
di "{error}Edit your sasexe.ado file to set the location of your sas.exe file. "
|
||
|
which sasexe
|
||
|
di `" {stata adoedit sasexe:edit sasexe.ado} (click, to edit the sasexe.ado file, remember to save when done.)"'
|
||
|
|
||
|
if "`1'"=="savasas" di "{error}or use the {res}sascode {error}option in `1'. "
|
||
|
exit 499
|
||
|
}
|
||
|
} /* end of if wsas not correctly set */
|
||
|
else if "`usas'"!="" & "`c(os)'"=="Unix" & "`2'"=="" { // `2' is if sascode requested
|
||
|
capture confirm file `"`usas'"'
|
||
|
if _rc!=0 {
|
||
|
di `"{error}This is not the correct location of your SAS executable: *"'
|
||
|
di `"{res}"`usas'" *"'
|
||
|
di "{error}Edit your sasexe.ado file to set the location *"
|
||
|
di "{error}of your sas executable file. *"
|
||
|
which sasexe
|
||
|
di `" {stata adoedit sasexe:edit sasexe.ado} (click, to edit the sasexe.ado file, remember to save when done.)"'
|
||
|
if "`1'"=="savasas" di "{error}or use the {res}sascode {error}option in `1'. *"
|
||
|
exit 499
|
||
|
}
|
||
|
} /* end of if usas not correctly set */
|
||
|
/****** (end) this block of code should not be needed anymore, it should not ever happen **/
|
||
|
|
||
|
if "`1'"=="usesas" | "`1'"=="saswrapper" {
|
||
|
foreach macro in savastata char2fmt {
|
||
|
capture confirm file `"``macro''"'
|
||
|
if _rc!=0 {
|
||
|
if `"``macro''"' != "" {
|
||
|
di `"{error}This is not the correct location of your `macro' macro: "'
|
||
|
di `"{res}``macro'' "'
|
||
|
}
|
||
|
else di `"{error}The file `macro'.sas was not found. {help `1':`1'} needs this file to run."'
|
||
|
di "{error}Edit your sasexe.ado file to set the location of your `macro'.sas file. "
|
||
|
which sasexe
|
||
|
di `" {stata adoedit sasexe:edit sasexe.ado} (click, to edit the sasexe.ado file, remember to save when done.)"'
|
||
|
exit 499
|
||
|
}
|
||
|
return local `macro' ``macro''
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// if person knows they don't have sas and chooses what version to run, and is using
|
||
|
// the sascode option then replace rver with nosasver
|
||
|
if `"`nosasver'"' != "" & `"`2'"' != "" local rver=`"`nosasver'"'
|
||
|
|
||
|
// make sure v8.2 or v9.1.3 is not used as it's not necessary to be that exact
|
||
|
if index("`rver'","8") local rver = "v8"
|
||
|
else if index("`rver'","9") local rver = "v9"
|
||
|
else if index("`rver'","10") local rver = "v10"
|
||
|
else if index("`rver'","11") local rver = "v11"
|
||
|
else if index("`rver'","12") local rver = "v12"
|
||
|
|
||
|
if "`rver'" == "" & "`2'" == "" { // `2' is if sascode requested
|
||
|
di as error "`1' was unable to figure out what version of SAS you are running. *"
|
||
|
di as error "Please edit your {stata adoedit sasexe:sasexe.ado} file and specify the location of your SAS *"
|
||
|
di as error "executable file and the version of SAS you are running. *"
|
||
|
if "`usas'" != "" & "`c(os)'" != "Windows" {
|
||
|
di as res `"`1' found your SAS executable file here: "`usas'""'
|
||
|
}
|
||
|
else if `"`wsas'"' != "" & "`c(os)'" == "Windows" {
|
||
|
di as res `"`1' found your SAS executable file here: "`wsas'""'
|
||
|
}
|
||
|
exit 499
|
||
|
} // end of if rver still empty
|
||
|
else if "`rver'" == "" & "`2'" != "" { // `2' is if sascode requested
|
||
|
local rver "v9"
|
||
|
di as error _n `"{help savasas:savasas} is choosing to write code appropriate for SAS version 9. *"'
|
||
|
di as error `"If an alternate version of SAS is desired, please edit your {stata adoedit sasexe:sasexe.ado} file. *"'
|
||
|
|
||
|
}
|
||
|
|
||
|
return local rver "`rver'"
|
||
|
return local wsas `"`""`wsas'""'"'
|
||
|
return local usas `usas'
|
||
|
|
||
|
end
|
||
|
|
||
|
|
||
|
capture program drop sasexe_ver
|
||
|
program sasexe_ver, rclass
|
||
|
version 8
|
||
|
syntax, sasexe(string)
|
||
|
if "`c(os)'"=="Windows" & "`c(mode)'" == "batch" {
|
||
|
di as err "sasexe cannot be run in batch mode on Windows"
|
||
|
exit 499
|
||
|
}
|
||
|
|
||
|
tempfile sas_ver
|
||
|
quietly file open sasvfile using "`sas_ver'_version.sas", replace text write
|
||
|
file write sasvfile `"** program to figure out if SAS works and what version is running **;"' _n ///
|
||
|
`" data _null_; "' _n `" file "`sas_ver'_version.do";"' _n ///
|
||
|
`" put "capture program drop sas_rver"; "' _n ///
|
||
|
`" put "program sas_rver, rclass"; "' _n ///
|
||
|
`" put "return local rver ""&sysver."""; "' _n ///
|
||
|
`" put "end";"' _n ///
|
||
|
`" run; "'
|
||
|
file close sasvfile
|
||
|
capture confirm file `"`sas_ver'_version.sas"'
|
||
|
if _rc==0 {
|
||
|
local nologo = "-nologo"
|
||
|
// -nologo is not an option for UNIX/Linux SAS
|
||
|
if "`c(os)'"=="Unix" /* or Linux */ local nologo = ""
|
||
|
|
||
|
shell "`sasexe'" "`sas_ver'_version.sas" `nologo' -log "`sas_ver'_version.log"
|
||
|
capture confirm file `"`sas_ver'_version.do"'
|
||
|
if _rc==0 {
|
||
|
run `"`sas_ver'_version.do"'
|
||
|
sas_rver
|
||
|
return local rver "`r(rver)'"
|
||
|
}
|
||
|
capture erase `"`sas_ver'_version.sas"'
|
||
|
capture erase `"`sas_ver'_version.log"'
|
||
|
capture erase `"`sas_ver'_version.do"'
|
||
|
}
|
||
|
|
||
|
end
|