分享
 
 
 

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

王朝c#·作者佚名  2006-12-17
窄屏简体版  字體: |||超大  

简介

程序员常问哪一种语言能访问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、它提供了一个池保证每个工作空间在WEB环境中是安全的

3、自动保持同SAS的连接

你可以使用以下2种方式建立同SAS的连接

非被管理模式(所有连接信息保留在客户端)

被管理模式 (所以连接信息保留在文件或者LDAP中)

这些连接信息包含 连接到哪台机器、用什么协议、使用什么端口或者服务名字、用户名、用户ID等,同时DCOM或者IOM支持加密的SESSION

例子1:建立连接,非被管理模式

Dim obWSMgr As New _

SASWorkspaceManager.WorkspaceManager

Dim obSAS As SAS.Workspace

Dim xmlInfo As String

Dim obServer As New _

SASWorkspaceManager.ServerDef

obServer.MachineDNSName = "remote.sas.com"

Set obSAS = _

obWSMgr.Workspaces.CreateWorkspaceByServer _

("", VisibilityNone, obServer, "", "", _

xmlInfo)

xmlInfo参数返回服务器实际上使用的值

关于IOM Data Provider

IOM Data Provider是一个使用IOM DataService读写数据的OLE DB的数据提供者

你可以使用ADO读写数据

例如:

Set obSAS = _

obWSMgr.Workspaces.CreateWorkspaceByServer _

("",VisibilityProcess,obServer,"","", _

xmlInfo)

Dim obConnection As New ADODB.Connection

obConnection.Open _

"provider=sas.iomprovider.1;" & _

"SAS Workspace ID=" & obSAS.UniqueIdentifier

Dim obRS As New ADODB.Recordset

obRS.Open "sashelp.class", obConnection, _

adOpenDynamic, adLockReadOnly, _

adCmdTableDirect

Set MSChart1.DataSource = obRS

关于IOM COM桥

当SAS运行window上时,你可以使用COM或者DCOM,然而当SAS运行于UNIX或者OS上时,则不能使用COM技术调用SAS,SAS提供了IOM COM桥,它一方便呈现COM接口给客户端,一方面使用TCP/IP跟SAS进行通信

关于Scripto

Scripto 是一个用于脚本应用的ACITVEX对象,其使用解决了脚本同SAS组件对象交互使用的几个限制,如VBSCRIPT只能返回一个单一参数;VBSCRIPT请求所有变量为VARIANT,故数祖也被处理为VARIANT,Scripto就解决这2个问题,容许返回多个参数,可以使用数组进行传输

' Scripto will do 2 things:

' 1) It will convert the 3 returned arrays to arrays of variants instead of arrays of

' longs so vbscript can handle them

' 2) It allows more than 1 return parameter

set obSAS = CreateObject("SAS.Workspace")

Set obScripto = _

CreateObject("SASScripto.Scripto")

obSAS.LanguageService.Submit _

"proc options;run;"

obScripto.SetInterface obSAS.LanguageService

' obSAS.LanguageService.FlushLogLines 1000, carriageControls, linetypes, logLines

Dim flushLogLinesParams(3)

flushLogLinesParams(3) = 1000

obScripto.InvokeMethod "FlushLogLines", _

flushLogLinesParams

' flushLogLinesParams(0) now has logLines

' flushLogLinesParams(1) has lineTypes

' flushLogLinesParams(2) has carriageCtrls

' This prints the first line

wscript.echo flushLogLinesParams(0)(0)

关于IT客户端

你需要在客户端安装和注册几个文件

IT客户端的必要文件是自动安装执行的,通过调用inttech.exe,其会安装必要的文件通过网络

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有