簡介 程序員常問哪一種語言能訪問SAS
那就是用SAS的IT機制
它容許開發式客戶訪問SAS
程序員能用不同的語言快速的建立同SAS交互的強壯的應用
此文主要介紹大家如何用VB同SAS交互
讀前需知 該文假設讀者對VB/COM/SAS知識有一定的了解
SAS IT的組件
SAS IT是一個中間件
是為用戶提供訪問SAS和呈現數據的接口
它包含下面功能
LDAP(輕量級目錄訪問協議)目錄集成
LDAP是一個分布式存儲數據的工業標准
程序員可以使用微軟的ADSI(動態目錄服務接口)訪問LDAP目錄
你可以把LDAP認為一個可以通過TCP/IP訪問的數據庫
通常
一個組織會有一個單一的LDAP 服務器
並被該組織的所有機器共享
發布/訂閱
這種積極的信息傳送機制能使你制造SAS輸出(發布者)到那些對這些輸出感興趣的人(訂閱者)
這種機制是由IOM(整合對象模型)接口
SAS語言調用語法和LDAP對象組成並協同工作的
消息隊列
SAS可以把輸出信息輸出到消息隊列
這樣客戶端沒有必要等待SAS執行完成
關於消息隊列的詳細用法情參考:
IOM(綜合對象模型)
IOM是一組COM對象的集合
其中大多數通常被VB使用
SAS IT比以前版本提供的OLE接口的優勢
IT是以前OLE的延伸
下面比較一下三種主要的不同
IT提供了多層次的接口
而OLE只提供了單一的接口
IT是跨平台(SAS所能支持的平台
如:WIN/UNIX/OS等)的
VB應用能通過遠端調用IT對象
而OLE只能運行於WIN平台
IT對象容許SAS 程序異步運行
而OLE不能
注
IT對象的根對象為
SAS
workspace
其對應了OLE的
SAS
application
對象
VB程序員的IT工具
包含IOM
SAS workspace manager
IOM數據提供者
IOM bridge for COM
scripto
IOM
客戶端可以通過多種連接方式連接到IOM 服務器
如CORBA/JDBC/COM/OMG等
而沒有必要附加代碼到客戶端
IOM是一個對象模型
因為它暴露了一組對象供用戶使用
這些對象可以用來實現
個目標
提交代碼給SAS和獲得SAS的輸出
在所以IOM對象中
數組被廣泛的使用
所以所有請求是被同時返回的
所需注意的是
如果沒有SAS IT產品的授權
IOM接口只能被本地COM使用
如過有授權
則可以通過網絡訪問遠端的IOM接口
IOM對象層次上的根對象是workspace
每個這樣的對象都有它自己的WORK庫
workspace對象提供了下面可用的對象
dataservice對象
返回一個操作SAS庫的接口
它同時也提供了一個讀寫SAS數據的接口
但VB程序員不能直接使用
只能通過SAS 數據提供者間接調用
fileservice對象
返回一個讀寫SAS服務器文件和文件引用的接口
getapplication對象
返回一個有SAS/AF建立的自定義接口
languageservice 對象
返回一個提交SAS代碼並獲得輸出的接口
IOM使用例子
假設下面代碼已經被執行
Dim obWsMgr As New _
SASWorkspaceManager
WorkspaceManager
Dim obSAS As SAS
Workspace
Dim xmlInfo As String
This creates a SAS Server running on the
local machine
Set obSAS = obWsMgr
Workspaces
CreateWorkspaceByServer (
VisibilityNone
nothing
xmlInfo)
例子
提交代碼
有
種方式可以提交代碼到SAS SERVER
方式
使用LanguageService
obSAS
LanguageService
Submit _
data a; do x=
to
; y=x*x*x;
& _
output;end;run;
MsgBox obSAS
LanguageService
FlushLog(
)
方式
使用 StoredProcessService
這種方式請求SAS文件存放在已知的目錄中
且能過通過宏的方式傳參數給文件
而在SAS文件中要想接收參數信息
需使用這樣的語法
*ProcessBody;
它會自動把傳入的參數轉換為宏
如有多個參數
在傳入的時候用【空格】分隔
例如
Run the SAS program at c:\temp\looper
SAS
Dim obStoredProcessService As _
SAS
StoredProcessService
Set obStoredProcessService = _
obSAS
LanguageService
StoredProcessService
obStoredProcessService
Repository = _
file:c:\temp
obStoredProcessService
Execute
looper
_
loopTimes=
MsgBox obSAS
LanguageService
FlushLog(
)
looper
sas文件內容如下
%let loopTimes=
;
*ProcessBody;
data a;
do x=
to &loopTimes;
y=x*x*x;
output;
end;
run;
例子
執行代碼
Async屬性
如果為false
則為同步執行
否
為異步執行
可以通過事件獲得是否已成功執行完成
如下定義一個錯誤發生事件
Public WithEvents obSASLanguage As _ SAS
LanguageService
To enable events
you must associate the
obSASLanguage
interface with the same LanguageService
interface used to make calls
Set obLanguage = obSAS
LanguageService
obLanguage
Submit
this is an error;run;
Private Sub obLanguage_StepError()
An error has occurred
Dump the log
Debug
Print obLanguage
FlushLog(
)
End Sub
例子
獲得輸出
SAS會輸出多種類型的信息供用戶使用
如下
IOM Data Provider 能夠提供二進制數據訪問給用戶
LanguageService的FlushList FlushListLines方法可以獲得SAS的窗口輸出
如果想獲得ODS輸出
可以通過文件引用的方式
SAS提供的FileService提供這樣的服務
下面演示如何通用FileService方式獲得輸出
Dim obFileref As SAS
Fileref
Dim obTextStream As SAS
TextStream
Dim obFileSystem As New Scripting
FileSystemObject
Dim obFile As Scripting
TextStream
Set obFile = obFileSystem
CreateTextFile (
c:\temp\
True)
obSAS
LanguageService
Submit
filename fref TEMP;
&
ods html body=fref;
&
proc corr data=sashelp
class;
&
run;
&
ods html close;
Set obFileref = obSAS
FileService
UseFileref(
fref
)
Set obTextStream = obFileref
OpenTextStream (StreamOpenModeForReading
)
sOdsOutput = obTextStream
Read(
)
While (Len(sOdsOutput) >
)
Do something with the read text here
obFile
Write sOdsOutput
sOdsOutput = obTextStream
Read(
)
Wend
WebBrowser
Navigate
c:\temp\
其實在單機環境中就沒有必要這樣做了
)
使用ResultPackageService也可獲得輸出
它可以通過Workspace
Utilities
ResultPackageService引用
你可以使用ResultPackageService提供的接口建立ResultPackage
當然也可以通過SAS語言的CALL語法
一個ResultPackage可以是任意的SAS輸出
如文件
數據集
ODS輸出
圖片等
下面這個例子顯示如何建立一個 ResultPackage
%macro CheckRC(rc);
if rc ne
then do;
msg = sysmsg();
put msg;
ABORT;
end;
%mend;
data _null_;
call PACKAGE_BEGIN(pid
desc
nameval
rc);
%CheckRC(rc);
call INSERT_FILE(pid
FILEREF:fref
TEXT
text/html
Some ODS Output
rc);
%CheckRC(rc);
/* Nothing in the package actually gets
* written out until we call publish
* So
if you modify any filerefs after
* calling insert but before calling
* this
then you will get the
* modified fileref
*/
call PACKAGE_PUBLISH(pid
TO_ARCHIVE
rc
archive_path
archive_name
c:\temp
archive
);
%CheckRC(rc);
/* You could call PACKAGE_PUBLISH as many
* times as you want for any given package
* as long as you
* do so before calling PACKAGE_END
*/
call PACKAGE_END(pid
rc);
%CheckRC(rc);
run;
下面顯示如何讀這個 ResultPackage
Dim props() As String
Dim obResultPackage As SAS
ResultPackage
Dim obFileEntry As SAS
ResultPackageFileEntry
Dim obRPS as SAS
ResultPackageService
Set obRPS = obSAS
Utilities
ResultPackageService
Set obResultPackage = obRPS
BrowseResultPackage(
ARCHIVE
c:\temp\archive
spk
props)
Set obFileEntry = obResultPackage
GetEntry(
)
Set obTextStream = obFileEntry
Open (StreamOpenModeForReading
)
sOdsOutput = obTextStream
Read(
)
While (Len(sOdsOutput) >
)
Do something with the read text here
obFile
Write sOdsOutput
sOdsOutput = obTextStream
Read(
)
Wend
WebBrowser
Navigate
c:\temp\
關於SAS Workspace Manager
它是一個完成下面功能的ACTIVEX控件
它同SAS建立連接
並返回工作空間
它提供
From:http://tw.wingwit.com/Article/program/net/201311/13888.html