电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2024/2/17
 

简介

程序员常问哪一种语言能访问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建立连接并返回工作空间

它提供

上一篇:VC实现系统热键激活后台服务程序

下一篇:也谈值类型与null的判等比较