熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

建立同SAS交互的開發式VB客戶端

2013-11-13 10:31:20  來源: .NET編程 

  簡介
  程序員常問哪一種語言能訪問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建立連接並返回工作空間
  它提供
From:http://tw.wingwit.com/Article/program/net/201311/13888.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.