建立同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、它提供了一个池保证每个工作空间在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,其会安装必要的文件通过网络

时间: 2024-08-02 19:27:18

建立同SAS交互的开发式VB客户端的相关文章

请问,Java用何种技术架构编写服务端,能让VB客户端访问?

问题描述 各位大哥大姐,小弟菜鸟一只,只会点JAVA和VB.今日心血来潮,想向各位请教个问题.Java用何种技术架构编写服务端,能让VB客户端高效安全的访问?Webservice,COM+,CORBA?这些名词都听说过,可惜小弟才疏学浅,闻其名,却不知其意.请各位指教.非常谢谢. 解决方案 本帖最后由 skill_job 于 2011-07-16 01:22:45 编辑

客户端交互设计:手机平台客户端UI设计

文章描述:客户端UI设计之手机平台之争. 1. 当前手机平台的争锋     为了占领移动互联网的制高点,当前的几大IT巨头都以手机平台为基础展开争夺.占领移动平台就是占领了用户的移动桌面,也就为自身的移动服务争取到了最佳位置.       微软公司推出windows phone 7, 曝光了windows 8:苹果公司也开了iOS 5的发布会:谷歌的Android 3.0的发布,Android 2.4 的若隐若现等等:大家都在努力提升平台体验.另外,惠普的Web OS.黑莓公司也都在研制和发布新

ajax交互Struts2的action(客户端/服务器端)

1.客户端网页代码 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=G

扬扬的J2EE学习笔记(二)J2EE的客户端/服务器

j2ee|笔记|服务器|客户端 每周学一些J2EE,作点笔记. 目标:能熟练使用Websphere做J2EE的开发工作. 加油!加油!!加油!!! 图3 J2EE场景 图三里须注意的是: 1.Tier integration is the center of the J2EE programming model. 2.用户使用Browser方式访问:      1) Browser:使用HTML,HTTP,XML.可能经过防火墙      2) Web container:使用JSP,Serve

用VB学做“黑客”程序

只要掌握了原理,你也能写出一个所谓的"黑客"程序.下面笔者带领大家用VB亲自编写一个远程控制程序.从而揭开它的神秘面纱. 一.所用控件 在程序中将使用Winsock控件.Winsock控件是一个ActiveX控件,使用TCP协议或UDP协 议连接到远程计算机上并与之交换数据.和定时器控件一样,Winsock控件在运行时是不可见的.Winsock的工作原理是:客户端向服务器端发出连接请求,服务器端则不停地监听客户端的请求,当两者的协议沟通时,客户端和服务器端之间就建立了连接,这时客户端和

[WSE]Web Service与Windows Service通过WSE2.0建立订阅/发布关系[更新版]

[WSE]Web Service与Windows Service通过WSE2.0建立订阅/发布关系   编写者:郑昀@UltraPower 编写日期:2005-04-13 修改日期:2005-05 目的: 我们建立这种交互关系的目的是,在Web Service和Windows Service(或者其他Windows应用)之间建立起一种稳固的可扩展的不受地域限制的交互关系.  优点: 这种交互关系的优点是: 完全异步: Web service和Windows service/windows for

消息总线重构之简化客户端

这段时间对消息总线进行了再次重构.本次重构主要针对消息总线的pubsub组件以及对client的简化,同时谈谈对消息总线的一些想法. 简化client的复杂度 之前的client需要同时连接两个分布式组件.消息总线的访问需要用户提供pubsuberHost,pubsuberPort参数,因此它首先连接的就是pubsuber.而消息总线是基于RabbitMQ构建的,因此它必然还需要连接RabbitMQ.而之所以没有需要用户程序提供RabbitMQ Server的地址信息,是因为它是通过pubsub

一家商业数据分析公司SAS,如何保持了40年的持续增长?

有这样一家神奇的软件公司,从40年前创业伊始,就专注于创造数据分析的商用消费市场,为此开发了一整套软件平台以及230多种软件产品,把深奥数学原理广泛用于各类商业决策,让没有数学背景的人也能很容易用上数据分析. 这家叫做SAS的公司,最早起源于美国北卡罗来纳州立大学1966年的一项研究,即开发数据分析软件用于农业数据研究,那还是只有IBM大机的时代.40年后的今天,根据IDC的数据,SAS占全球高级和预测分析市场33.3%的份额,比前10名中其它9家相关厂商营收的总合还要多. SAS公司创业40年

实例:利用Javascript建立Web应用

javascript|web 随着Internet/Intranet应用普及,越来越多的用户在设计上采用Client/Server结构,建立自己的Internet/Intranet应用.客户端程序负责向Web服务器发送请求,并负责从Web服务器接受和解释显示超文本.如果要生成动态. 交互式Web页面,就必须通过公共网关接口(CGI),CGI程序可采用Perl,C++,JavaScript等编写,而目前流行的方法是采用Java或JavaScript.一.JavaScript简介 JavaScrip