2013-07-18 11 views
6

Spero che qualcuno possa aiutarti. Sto cercando di creare una subroutine per avviare SAS da VBA. Lo sto facendo con SAS Workspace Manager. Mentre sto passeggiando molto lontano dalla mia zona di comfort, ho seguito principalmente ciò che ho trovato in questi twosources. Ecco quello che mi è venuto in mente finora in VBA:Esegui SAS da VBA con accesso completo

Public Sub SubmitSasProg(usrid As String, passid As String, path As String, sasprog As String, varinput As String, Optional logreturn) 
    Dim obWsMgr As New SASWorkspaceManager.WorkspaceManager 

Dim obSAS As SAS.Workspace 
Dim xmlInfo As String 

Set obSAS = obWsMgr.Workspaces.CreateWorkspaceByServer("Local", VisibilityProcess, Nothing, usrid, passid, xmlInfo) 

Dim obStoredProcessService As SAS.StoredProcessService 
Set obStoredProcessService = obSAS.LanguageService.StoredProcessService 

obStoredProcessService.Repository = "file:" & path 
obStoredProcessService.Execute sasprog, varinput 

If IsMissing(logreturn) Then logreturn = 100000 
MsgBox obSAS.LanguageService.FlushLog(logreturn) 

End Sub 

E io stesso ho un piccolo programma SAS, chiamiamolo "Test.sas":

%let loopTimes=3; 
*ProcessBody; 
data a; 
do x= 1 to &loopTimes; 
y=x*x*x; 
output; 
end; 
run; 

Ora questa linea funzionerà juste bene :

Call SubmitSasProg("myuserid", "mypassword", "somepath", "Test", "loopTimes=10") 

Ma ogni volta che provo ad eseguire un proceedure SAS che modifica i file/libnames ecc Prendo un o una "operazione non valida per questa sessione SAS" o "utente non dispone di accesso". Si prega di notare che sto usando SAS localmente, non su un server. Quindi immagino di non aver effettuato correttamente l'accesso con la mia sessione SAS e di non avere il permesso. Ho pensato che i parametri userId e password in CreateWorkspaceByServer dovessero connettermi.

Quindi la mia domanda sarebbe come avviare con successo la sessione SAS con le mie credenziali sul mio computer locale e avere tutto il normale accesso che avrei aprendo l'ambiente finestra.

Giusto per chiarire, questo processo SAS avrebbe funzionato bene nel environement finestra:

Data _NULL_; 
     *x del C:\WINDOWS; 
     x mkdir C:\Users\Myname\Desktop\NewFolder; 
    run; 

ma sarebbe fallire con un "Operazione non valida per questa SAS sessione" codice se iniziata da VBA. Qualcosa di simile accade se provo a scrivere dataset SAS.

Ho cercato un po 'di tempo ma la maggior parte dei thread riguarda le sessioni del server SAS. Qualsiasi aiuto sarebbe apprezzato.

+0

Wow ... questo è piuttosto il caso limite. La mia ipotesi è che il processo SAS sia in esecuzione con i diritti del processo che l'ha avviato e che il processo VBA abbia diritti limitati (per impedire che script dannosi incorporati in documenti dall'aspetto innocuo prendano il controllo del computer). – JDB

+0

Quale versione di SAS e OS è in esecuzione, per favore? –

+0

Quello sarebbe Base SAS 9.2 e Win 7 32b. Potrebbe anche valere la pena notare che non ho un account amministratore su questa macchina, sebbene ciò non infastidisca l'ambiente con finestra SAS. Cercherò la fortuna con un account amministratore ... chissà. – Pane

risposta

2

Beh, sembra che la maggior parte dei miei problemi derivano dal fatto che io non sono un amministratore sul mio sistema. Sono riuscito a scrivere set di dati con la tecnica di cui sopra dato che ho i privilegi di scrittura sulla directory con il mio account (duuh). Tutto sommato, il comando x è testardo e non funzionerà per non ottenere un account amministratore. Quindi, due scelte per «risolvere» questo problema: 1. Ottieni i privilegi di amministratore. o 2. Dimenticare il gestore dell'area di lavoro. Usa OleObjects.

Mentre meno elegante e forse richiede più tempo per l'esecuzione (non testato) OleObject mi consentirà di utilizzare SAS in tutta la sua estensione. Ecco il codice VBA:

Dim OleSAS As Object 
Set OleSAS = CreateObject("SAS.Application") 
OleSAS.Visible = True 
OleSAS.Top = 1 
OleSAS.Title = "Automation Server" 
OleSAS.Wait = True 
OleSAS.Submit(yourSAScode) 
OleSAS.Quit 
Set OleSAS = Nothing 

Se si desidera eseguire un processo specifico e modificare alcune variabili macro come con * ProcessBody; basta fare OleSAS.Submit ("% let" & nome_variabile & "=" & "yourValue") e OleSAS.Submit ("% include" & your_program).

In ogni caso, sono piuttosto triste di perdere il rapporto del rapporto restituito che avevo con il gestore Worspace, è stato davvero ottimo per il debug veloce. Spero che questo sia stato utile.

0

So che in precedenza ho avuto problemi con SAS/Intrnet che non ha l'impostazione delle politiche di sicurezza richieste. Non posso garantire che questo sarà risolvere il problema, ma è un posto per iniziare la ricerca:

Pannello di controllo-> Strumenti di amministrazione-> Criteri di protezione locali

Sicurezza Impostazioni-> Criteri locali-> Diritti utente Assignments-> Accedere come lavoro batch

Assicurarsi che l'account che SAS utilizzerà per eseguire i lavori abbia questo diritto.

Inoltre, stai dicendo che il tuo programma test.sas ha esito negativo perché prova a scrivere un set di dati?

Inoltre, potrebbe trattarsi di alcuni degli stessi problemi che ho avuto qui:

Using SAS and mkdir to create a directory structure in windows