6

我希望有人能帮帮忙。我正在尝试构建一个子程序来从 VBA 启动 SAS。我一直在使用 SAS Workspace Manager。当我在离舒适区很远的地方漫步时,我主要关注的是我在这两个 来源中发现的内容。到目前为止,这是我在 VBA 中想到的:

    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

我自己有一个小 SAS 程序,我们称之为“Test.sas”:

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

现在这条线可以正常工作:

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

但是,每当我尝试执行修改文件/库名称等的 SAS 程序时,我都会得到“此 SAS 会话的无效操作”或“用户无权访问”。 请注意,我在本地使用 SAS,而不是在服务器上。 所以我猜我没有正确登录我的 SAS 工作会话并且没有权限。我认为 CreateWorkspaceByServer 中的 userId 和 password 参数应该让我登录。

所以我的问题是如何在本地计算机上使用我的凭据成功启动 SAS 会话,并通过打开窗口环境获得所有正常访问权限。

澄清一下,这个 SAS 流程在窗口环境中可以正常工作:

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

但如果从 VBA 启动,它将失败并显示“此 SAS 会话的无效操作”代码。如果我尝试编写 SAS 数据集,也会发生类似的事情。

我一直在寻找一段时间,但大多数线程都是关于 SAS 服务器会话的。任何帮助,将不胜感激。

4

2 回答 2

2

好吧,看起来我的大部分问题都源于我不是系统管理员这一事实。鉴于我使用我的帐户(duuh)对目录具有写入权限,因此我已经设法使用上述技术编写数据集。唉, x 命令是顽固的,不会工作,以免我给自己一个管理员帐户。所以,有两个选择来“解决”这个问题: 1. 获得管理员权限。或 2. 忘记工作区管理器。使用 OleObjects。

虽然在执行时不太优雅并且可能更耗时(未经测试),但 OleObject 将让我充分利用 SAS。这是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

如果你想运行一个特定的进程并改变一些宏变量,就像 *ProcessBody; 只需执行 OleSAS.Submit("%let "& variable_name & "=" & "yourValue") 和 OleSAS.Submit("%include" & your_program)。

无论如何,我很遗憾失去了 Worspace Manager 的日志报告返回,这对于快速调试来说真的很棒。希望这很有用。

于 2013-07-22T18:12:40.983 回答
0

我知道以前我遇到过 SAS/Intrnet 没有设置所需的安全策略的问题。我不能保证这会解决它,但它是开始寻找的地方:

控制面板->管理工具->本地安全策略

安全设置->本地策略->用户权限分配->作为批处理作业登录

确保 SAS 将用于运行作业的帐户具有此权限。

另外,您是说您的 test.sas 程序失败是因为它试图编写数据集吗?

此外,您可能会遇到我在这里遇到的一些相同问题:

windows下使用SAS和mkdir创建目录结构

于 2013-07-18T22:01:18.720 回答