[an error occurred while processing this directive] [an error occurred while processing this directive]


プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









COM経由でCache' Objectを使用する

Use Cache' Object by COM.

Cache' オブジェクトはCOM経由でのアクセスが可能とのことで、VBやExcelからCOMを経由してアクセスすることができるようです。
最近、個人的に操作の自動化で使用することが多いuwscもCOMが使えるとのことで、uwscのCOMからCache'のオブジェクトにアクセスすることができるのか試してみました。

uwscの簡単な導入

uwscをダウンロードし、解凍ソフトで解凍します。 uwsc.exeを実行します。
開くボタンからsample.uwsを開くと、サンプル動作を見ることができます。

uwscの使い方やサンプルは、Cache'と違ってネット上に沢山公開されていますので情報に困ることはないと思います。

Cache’への接続

テキストファイルを新規作成し、ファイル名をcache_test.uwsに変更します。
次に メモ帳などのテキストエディタで以下のように記述します。
cfa = CreateOleObj("CacheActiveX.Factory")  // Cache接続のCOMオブジェクトを作成
str = cfa.ConnectDlg()  // Cacheへの接続ダイアログを表示
MsgBox(str)    //接続ダイアログの結果をメッセージボックスで表示
uwscからcache_test.uwsを開くと、Cache'の接続ダイアログが表示されます。 (COMにアクセスするために、Cache'のクライアントキットがインストールされている必要があります。)
Cacheの接続ダイアログが表示されます。
この画面で接続先を選択し[OK]を押すと、メッセージボックスが表示されます。

Cache'への接続文字列この文字列はcache'への接続文字列となり、VisMの接続文字列と同一のようです。

接続先が決まっている場合は、接続文字列をConnect()関数に渡すことでダイアログを出すことなく接続が可能です。

Cache'Objectへアクセス

Cache' COMオブジェクトの説明はドキュメント内、Caché ActiveX API リファレンスにあります。
リファレンスによると、オブジェクトインスタンスの新規作成(New)、検索(DynamicSQL, ResultSet)、開く(OpenId)、変更(インスタンスプロパティの値を変更)、保存(インスタンスを%Save) とひと通りの操作がこれでできるようです。

いくつかの操作を試すuwscマクロを記述してみました。
cfa=CreateOleObj("CacheActiveX.Factory")
//s=cfa.ConnectDlg() // -> cn_iptcp:localhost[1972]:TEST1
rev=cfa.Connect("cn_iptcp:localhost[1972]:SAMPLES") //引数はConnectDlg()の戻り値
ifb rev=false then
  MsgBox("接続に失敗"); EXIT
endif

//クエリの実行
crs=cfa.ResultSet("Cinema.Film","TopFilms")
rev=crs.Execute()
ifb rev="True" then //戻り値がなぜか文字列
 
while crs.Next()
    PRINT crs.Get("ID") + " :: " + crs.Get("Description")  //PRINTで結果表示
  wend
endif
cfa.Disconnect()
SLEEP(10)
EXIT
このuwscマクロを実行してみると以下のようにCinema.FilmオブジェクトのTopFilmsクエリの結果が表示されます。


システム管理ポータルから同じTopFilmsクエリを実行してみます。
システム管理ポータルでの実行結果。同じ結果が得られていることが確認できる。
同じ結果が表示されていることから、正しく動作していることが確認できました。

ダイナミックSQLの実行

以下のような記述で、ダイナミックSQLを実行することができました。
//ダイナミックSQLの実行
crs=cfa.DynamicSQL("SELECT COUNT(*) as CNT FROM Cinema.Film WHERE Title='CARS'")
rev=crs.Execute()
ifb rev="True" then //戻り値がなぜか文字列?
 while crs.Next()
  Count=crs.Get("CNT")
  PRINT "Count : " + Count
 wend
endif

インスタンスの作成・保存・削除

以下のような記述で、インスタンスの新規作成・保存・削除を行うことができました。
// インスタンスの作成、保存、削除
PRINT "新規作成中"
film = cfa.New("Cinema.Film")  // 新規インスタンス film
// 各プロパティに値を設定

film.Title = "CARS"
film.Description = "2006 American animated family film produced by Pixar and directed by both John Lasseter and Joe Ranft."
film.Category = 2
film.Length = 90

rev=film.%Save()     // 保存を実行
ifb rev<>"" then
  MSGBOX(rev)
else
  id = film.%Id()  // IDを取得
  film=""          // インスタンスを解放
  PRINT "保存成功 id = "+id
  
  // クラスメソッドの実行 -- オブジェクトの削除
  classmethod = cfa.Static("Cinema.Film")
  rev=classmethod.%DeleteId(id)
  PRINT "削除:" + rev
endif

 COMはOfficeマクロ、Visual Studio、各開発環境などで利用できるので、(Windows環境では) ものすごく利用範囲が広いとおもいます。



[an error occurred while processing this directive] [an error occurred while processing this directive]
2014/02/04Update