建立同SAS交互的开发式VB客户端

 

 简介

  程序员常问哪一种语言能访问SAS,那就是用SAS的IT机制,它容许开发式客户访问SAS,程序员能用不同的语言快速的建立同SAS交互的强壮的应用,此文主要介绍大家如何用VB同SAS交互

  读前需知

  该文假设读者对VB/COM/SAS知识有一定的了解

  SAS IT的组件

  SAS IT是一个中间件,是为用户提供访问SAS和呈现数据的接口,它包含下面功能

  1、LDAP(轻量级目录访问协议)目录集成

  LDAP是一个分布式存储数据的工业标准,程序员可以使用微软的ADSI(动态目录服务接口)访问LDAP目录,你可以把LDAP认为一个可以通过TCP/IP访问的数据库,通常,一个组织会有一个单一的LDAP 服务器,并被该组织的所有机器共享

  2、发布/订阅

  这种积极的信息传送机制能使你制造SAS输出(发布者)到那些对这些输出感兴趣的人(订阅者)

  这种机制是由IOM(整合对象模型)接口、SAS语言调用语法和LDAP对象组成并协同工作的

  3、消息队列

  SAS可以把输出信息输出到消息队列,这样客户端没有必要等待SAS执行完成

  关于消息队列的详细用法情参考:

  http://www.sas.com/rnd/itech/doc/messageq/index.htm

  4、IOM(综合对象模型)

  IOM是一组COM对象的集合,其中大多数通常被VB使用

  SAS IT比以前版本提供的OLE接口的优势

  IT是以前OLE的延伸,下面比较一下三种主要的不同

  1、IT提供了多层次的接口,而OLE只提供了单一的接口

  2、IT是跨平台(SAS所能支持的平台,如:WIN/UNIX/OS等)的,VB应用能通过远端调用IT对象,而OLE只能运行于WIN平台

  3、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是一个对象模型,因为它暴露了一组对象供用户使用

  这些对象可以用来实现2个目标:提交代码给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)

  例子1:提交代码

  有2种方式可以提交代码到SAS SERVER

  方式1:使用LanguageService

  obSAS.LanguageService.Submit _

  "data a; do x= 1 to 10; y=x*x*x;" & _

  "output;end;run;"

  MsgBox obSAS.LanguageService.FlushLog(100000)

  方式2:使用 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=10"

  MsgBox obSAS.LanguageService.FlushLog(100000)

  looper.sas文件内容如下:

  %let loopTimes=3;

  *ProcessBody;

  data a;

  do x= 1 to &loopTimes;

  y=x*x*x;

  output;

  end;

  run;

  例子2:执行代码

  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(100000)

  End Sub

  例子3:获得输出

  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/sasOutput.htm", 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, 10000)

  sOdsOutput = obTextStream.Read(100000)

  While (Len(sOdsOutput) > 0)

  ' Do something with the read text here

  obFile.Write sOdsOutput

  sOdsOutput = obTextStream.Read(100000)

  Wend

  WebBrowser1.Navigate "c:/temp/sasOutput.htm"

  其实在单机环境中就没有必要这样做了 :)

  使用ResultPackageService也可获得输出,它可以通过Workspace.Utilities.ResultPackageService引用

  你可以使用ResultPackageService提供的接口建立ResultPackage,当然也可以通过SAS语言的CALL语法

  一个ResultPackage可以是任意的SAS输出,如文件,数据集,ODS输出、图片等

  下面这个例子显示如何建立一个 ResultPackage

  %macro CheckRC(rc);

  if rc ne 0 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(0)

  Set obTextStream = obFileEntry.Open (StreamOpenModeForReading, 100000)

  sOdsOutput = obTextStream.Read(100000)

  While (Len(sOdsOutput) > 0)

  ' Do something with the read text here

  obFile.Write sOdsOutput

  sOdsOutput = obTextStream.Read(100000)

  Wend

  WebBrowser1.Navigate "c:/temp/sasOutput.htm"

  关于SAS Workspace Manager

  它是一个完成下面功能的ACTIVEX控件

  1、它同SAS建立连接,并返回工作空间

  2、它提供


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值