简介 程序员常问哪一种语言能访问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对象的根对象为SASworkspace 其对应了OLE的 SASapplication对象 VB程序员的IT工具 包含IOMSAS workspace managerIOM数据提供者IOM bridge for COMscripto 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 _ SASWorkspaceManagerWorkspaceManager Dim obSAS As SASWorkspace Dim xmlInfo As String This creates a SAS Server running on the local machine Set obSAS = obWsMgrWorkspacesCreateWorkspaceByServer ( VisibilityNone nothing xmlInfo) 例子提交代码 有种方式可以提交代码到SAS SERVER 方式使用LanguageService obSASLanguageServiceSubmit _ data a; do x= to ; y=x*x*x; & _ output;end;run; MsgBox obSASLanguageServiceFlushLog() 方式使用 StoredProcessService 这种方式请求SAS文件存放在已知的目录中且能过通过宏的方式传参数给文件而在SAS文件中要想接收参数信息需使用这样的语法 *ProcessBody; 它会自动把传入的参数转换为宏 如有多个参数在传入的时候用【空格】分隔 例如 Run the SAS program at c:\temp\looperSAS Dim obStoredProcessService As _ SASStoredProcessService Set obStoredProcessService = _ obSASLanguageServiceStoredProcessService obStoredProcessServiceRepository = _ file:c:\temp obStoredProcessServiceExecute looper _ loopTimes= MsgBox obSASLanguageServiceFlushLog() loopersas文件内容如下 %let loopTimes=; *ProcessBody; data a; do x= to &loopTimes; y=x*x*x; output; end; run; 例子执行代码 Async属性如果为false则为同步执行否为异步执行可以通过事件获得是否已成功执行完成 如下定义一个错误发生事件 Public WithEvents obSASLanguage As _ SASLanguageService To enable events you must associate the obSASLanguage interface with the same LanguageService interface used to make calls Set obLanguage = obSASLanguageService obLanguageSubmit this is an error;run; Private Sub obLanguage_StepError() An error has occurred Dump the log DebugPrint obLanguageFlushLog() End Sub 例子获得输出 SAS会输出多种类型的信息供用户使用如下 IOM Data Provider 能够提供二进制数据访问给用户 LanguageService的FlushList FlushListLines方法可以获得SAS的窗口输出 如果想获得ODS输出可以通过文件引用的方式SAS提供的FileService提供这样的服务 下面演示如何通用FileService方式获得输出 Dim obFileref As SASFileref Dim obTextStream As SASTextStream Dim obFileSystem As New ScriptingFileSystemObject Dim obFile As ScriptingTextStream Set obFile = obFileSystemCreateTextFile (c:\temp\ True) obSASLanguageServiceSubmit filename fref TEMP; & ods html body=fref; & proc corr data=sashelpclass; & run; & ods html close; Set obFileref =obSASFileServiceUseFileref(fref) Set obTextStream = obFilerefOpenTextStream (StreamOpenModeForReading ) sOdsOutput = obTextStreamRead() While (Len(sOdsOutput) > ) Do something with the read text here obFileWrite sOdsOutput sOdsOutput = obTextStreamRead() Wend WebBrowserNavigate c:\temp\ 其实在单机环境中就没有必要这样做了 ) 使用ResultPackageService也可获得输出它可以通过WorkspaceUtilitiesResultPackageService引用 你可以使用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 SASResultPackage Dim obFileEntry As SASResultPackageFileEntry Dim obRPS as SASResultPackageService Set obRPS = obSASUtilitiesResultPackageService Set obResultPackage = obRPSBrowseResultPackage( ARCHIVE c:\temp\archivespk props) Set obFileEntry = obResultPackageGetEntry() Set obTextStream = obFileEntryOpen (StreamOpenModeForReading ) sOdsOutput = obTextStreamRead() While (Len(sOdsOutput) > ) Do something with the read text here obFileWrite sOdsOutput sOdsOutput = obTextStreamRead() Wend WebBrowserNavigate c:\temp\ 关于SAS Workspace Manager 它是一个完成下面功能的ACTIVEX控件 它同SAS建立连接并返回工作空间 它提供 |