概要
TDV Server上で公開したデータサービス(データベース)に対し、Spotfire Serverからインフォメーションリンク(JDBC)で接続し、データを取得するだけでなく、追加(INSERT)・更新(UPDATE)・削除(DELETE)を実行する方法について説明します。
Spotfireのインフォメーションリンクでは、接続先データソース(今回はTDV Server)に対して、SELECT文以外のクエリを実行することができないため、INSERT・UPDATE・DELETE用のプロシージャを作成することで対応します。
検証環境
| 製品 | バージョン | 備考 |
|---|---|---|
| TDV Server |
8.5.5 |
Windows Server 2019環境で実行 |
| TDV Studio | ||
| TIBCO Spotfire |
12.0.2 |
物理データソース
本記事では、TDV Serverから接続可能なPostgreSQLデータベース上にある以下のようなシンプルなテーブルを利用します。
TDVリソース
TDV Server上で事前に作成済みのリソースについて説明します。
全体像は以下のリネージュのとおりです。
右端の4つのリソースが公開リソース(データサービス)です。
データソース
先述のPostgreSQLデータソースをイントロスペクトします。
ビューおよびプロシージャ
データソースを入力とするビューおよびプロシージャを作成します。
ビュー
イントロスペクトした状態のままビュー化します。
INSERT用プロシージャ
username と comment の内容を引数として受け付けるINSERT用プロシージャです。
プロシージャの内容はサンプルのため簡便なものとしています。
UPDATE用プロシージャ
id 、username 、comment の内容を引数として受け付けるUPDATE用プロシージャです。
プロシージャの内容はサンプルのため簡便なものとしています。
DELETE用プロシージャ
複数のidをカンマで連携させた文字列(想定)を引数として受け付けるDELETE用プロシージャです。
プロシージャの内容はサンプルのため簡便なものとしています。
データサービス
1件のビューと3件のプロシージャをanalysisデータベース配下に公開します。
analysis直下には dev カタログを、さらにその下に sample スキーマを切り、その直下にビューとプロシージャを配置しています。
Spotfire インフォメーションリンク
Configuration Tool で TDVデータソーステンプレートを設定後、Spotfire Analyst(クライアントアプリケーション)から Spotfire Server に接続し、インフォメーションデザイナー上でインフォメーションリンクの設定を行います。
※TDV側でプロシージャを作成・公開するタイミングが前後しているため、以降、一部のプロシージャがスクリーンショット内に表示されていない場合がありますが、記事を読み進める上では問題ありません。
TDVデータソーステンプレート
Configuration Toolを起動し、TDV用のデータソーステンプレートを設定します。
以下の例は、標準的なID/Password認証でTDV Serverに接続するためのテンプレートです。
設定後はSpotfire Serverサービスを再起動する必要があります。
XMLは以下のとおりです。
<jdbc-type-settings>
<type-name>Composite</type-name>
<driver>cs.jdbc.driver.CompositeDriver</driver>
<connection-url-pattern>jdbc:compositesw:dbapi@<server>:<port9401>?domain=<domain>&dataSource=<data_source></connection-url-pattern>
<supports-catalogs>true</supports-catalogs>
<supports-schemas>true</supports-schemas>
<use-ansii-style-outer-join>true</use-ansii-style-outer-join>
<metadata-provider>com.spotfire.ws.im.ds.sql.composite.CompositeMetadataProvider</metadata-provider>
<supports-procedures>true</supports-procedures>
</jdbc-type-settings>
データソース
任意のフォルダ内に新規にデータソースを作成します。
データソース設定画面が表示されるので、以下の項目を入力し、保存をクリックします。
| 項目 | 内容 |
|---|---|
| 名前 | 任意のデータソースの名前 |
| タイプ | データソースのタイプ 今回は事前にデータソーステンプレートとして設定済みの TIBCO Data Virtualization を指定 |
| 接続URL | データソース(TDV Server)へ接続するためのJDBC Connection String 今回は jdbc:compositesw:dbapi@tdv.nttcoms.com:9401?domain=tad.nttcoms.com&dataSource=analysisを指定ホスト:tdv.nttcoms.com ドメイン:tad.nttcoms.com データソース:analysis |
| 認証方法 | データソースへ接続時に利用する認証方式 今回はユーザー名とパスワードを指定 |
| ユーザー名 | データソース(TDV Server)へ接続する時に利用するユーザー名 |
| パスワード | ユーザーのパスワード |
正常に接続できれば、以下のように保存されます。
インフォメーションリンク:sample_comments
sample_comments テーブルにSELECT文を実行し、データを取得するためのインフォメーションリンクを作成します。
インフォメーションリンク作成
データソース中の sample_comments テーブルを選択し、既定のインフォメーションモデルの作成 をクリックします。
保存先の任意のフォルダを選択します。
OKをクリックします。
カラム(sample_comments フォルダ)と sample_comments インフォメーションリンク が作成されます。
動作確認
ライブラリーに保存されている sample_comments インフォメーションリンクを開きます。
取込方式(ここではインポートを選択します)を選択し、OKをクリックします。
ビジュアライゼーション一覧からテーブルを選択し、取り込まれたデータテーブルの内容を確認します。
TDV Serverからデータが正常に取得されていることを確認します。
インフォメーションリンク:insert_comment
sample_comments テーブルに新規レコードをINSERTするためのプロシージャを実行するするためのインフォメーションリンクを作成します。
プロシージャ作成
データソース中の insert_comment プロシージャを選択し、新規 > プロシージャ をクリックします。
プロシージャ要素設定画面が表示されるので、以下の項目を入力し、保存をクリックします。
| 項目 | 内容 |
|---|---|
| 名前 | 任意のデータソースの名前 |
| プロシージャタイプ | Pre を選択します。 この後にこのプロシージャをインフォメーションリンク内で実行させるように設定しますが、このプロシージャはデータを返却せず、また、インフォメーションリンク内で最初に実行させることが目的です。 |
| パラメータの入力 | プロシージャにパラメータをわたすパラメータです。 ここでは、 username と comment をパラメータとして設定します。 |
同じ名前を指定し、保存先として任意のフォルダを指定します。
インフォメーションリンク作成
insert_comment プロシージャを実行するためのインフォメーションリンクを作成します。
要素に先ほど作成した insert_comment プロシージャを追加します。
sample_comments テーブルのカラムも要素として追加します。
このインフォメーションリンクを実行すると、データテーブルが作成されるのですが、そのデータテーブルにおいて取得されるデータのカラムをここで定義しています。
インフォメーションリンクには、結果カラムが含まれている必要があり、そのためにsample_comments テーブルのカラムも追加します。
パラメータでデータをフィルターします。
ここでは、INSERTした1行のみがデータテーブルとして作成されるように設定しています。
フィルターを設定しない場合は、sample_comments テーブルの全行が取得されます。
設定後に保存をクリックします。
プロシージャと同じ名前で任意のフォルダに指定します。
動作確認
作成したinsert_comment インフォメーションリンクを開き、データのオープン をクリックします。
プロンプトが表示されるので、各パラメータに値を入力して、OKをクリックします。
TDV Studio で sample_comments ビューを実行し、1行追加されていることを確認します。
Spotfire Analystにおいても、作成されたデータテーブルを確認するために、テーブルビジュアライゼーションを作成します。
フィルタに設定したように、INSERTした1件のみが表示されていることが確認できます。
インフォメーションリンク:update_comment
sample_comments テーブル上の既存レコードをUPDATEするためのプロシージャを実行するするためのインフォメーションリンクを作成します。
プロシージャ作成
データソース中の update_comment プロシージャを選択し、新規 > プロシージャ をクリックします。
プロシージャ要素設定画面が表示されるので、以下の項目を入力し、保存をクリックします。
| 項目 | 内容 |
|---|---|
| 名前 | 任意のデータソースの名前 |
| プロシージャタイプ | Pre を選択します。 この後にこのプロシージャをインフォメーションリンク内で実行させるように設定しますが、このプロシージャはデータを返却せず、また、インフォメーションリンク内で最初に実行させることが目的です。 |
| パラメータの入力 | プロシージャにパラメータをわたすパラメータです。 ここでは、 id、 username 、 comment をパラメータとして設定します。 |
同じ名前を指定し、保存先として任意のフォルダを指定します。
インフォメーションリンク作成
update_comment プロシージャを実行するためのインフォメーションリンクを作成します。
要素に先ほど作成したupdate_comment プロシージャを追加します。
sample_comments テーブルのカラムも要素として追加します。
このインフォメーションリンクを実行すると、データテーブルが作成されるのですが、そのデータテーブルにおいて取得されるデータのカラムをここで定義しています。
パラメータでデータをフィルターします。
ここでは、UPDATEした1行のみがデータテーブルとして作成されるように設定しています。
フィルターを設定しない場合は、sample_comments テーブルの全行が取得されます。
設定後に保存をクリックします。
設定後に保存をクリックします。
プロシージャと同じ名前で任意のフォルダに保存します。
動作確認
作成したupdate_comment インフォメーションリンクを開き、データのオープン をクリックします。
プロンプトが表示されるので、各パラメータに値を入力して、OKをクリックします。
TDV Studio で sample_comments ビューを実行し、id = 2 の内容が変更されていることを確認します。
Spotfire Analystにおいても、作成されたデータテーブルを確認するために、テーブルビジュアライゼーションを作成します。
フィルタに設定したように、UPDATEした1件のみが表示されていることが確認できます。
インフォメーションリンク:delete_comments
sample_comments テーブル上の既存レコードをDELETEするためのプロシージャを実行するするためのインフォメーションを作成します。
プロシージャ作成
データソース中の delete_comment プロシージャを選択し、新規 > プロシージャ をクリックします。
プロシージャ要素設定画面が表示されるので、以下の項目を入力し、保存をクリックします。
| 項目 | 内容 |
|---|---|
| 名前 | 任意のデータソースの名前 |
| プロシージャタイプ | Pre を選択します。 この後にこのプロシージャをインフォメーションリンク内で実行させるように設定しますが、このプロシージャはデータを返却せず、また、インフォメーションリンク内で最初に実行させることが目的です。 |
| パラメータの入力 | プロシージャにパラメータをわたすパラメータです。 ここでは、 ids をパラメータとして設定します。 |
同じ名前を指定し、保存先として任意のフォルダを指定します。
インフォメーションリンク作成
delete_comments プロシージャを実行するためのインフォメーションリンクを作成します。
要素に先ほど作成したdelte_comments プロシージャを追加します。
sample_comments テーブルのカラムも要素として追加します。
このインフォメーションリンクを実行すると、データテーブルが作成されるのですが、そのデータテーブルにおいて取得されるデータのカラムをここで定義しています。
設定後に保存をクリックします。
プロシージャと同じ名前で任意のフォルダに保存します。
動作確認
作成したdelete_comments インフォメーションリンクを開き、データのオープン をクリックします。
プロンプトが表示されるので、各パラメータに値を入力して、OKをクリックします。
TDV Studio で sample_comments ビューを実行し、id = 1 と id = 3 の行が削除されていることを確認します。
Spotfire Analystにおいても、作成されたデータテーブルを確認するために、テーブルビジュアライゼーションを作成します。
DELETEが実行された後のデータが表示されていることが確認できます。
サンプル)データ登録・更新・削除フォーム
これまでに説明したインフォメーションリンクを利用することで、以下のようなデータを登録・更新・削除するためのフォームをSpotfireダッシュボード上で実現することも可能です。
注:以降の説明において紹介するスクリプトは例外処理などを十分に実装していないデモレベルの内容であることにはご留意ください。
Spotfire Analyst の API詳細については API Reference – Spotfire® Analyst などのドキュメントをご参照ください。
デモダッシュボード上のコンポーネントとインフォメーションリンクとの対応は以下のとおりです。
デモ
コメント登録
コメント登録フォームにユーザ名とコメントを入力し、登録ボタンをクリックすることで新規コメントを登録します。
コメント更新
更新対象のコメントを選択した状態でコメント更新フォームにユーザ名とコメントを入力し、更新ボタンをクリックすることでコメントを更新します。
コメント削除
削除対象のコメントを選択した状態で、削除ボタンをクリックすることでコメントを削除します。
文書プロパティ
各インフォメーションリンクには、文書のプロパティで定義された複数の値をわたしており、フォームに入力された値や、sample_comments テーブル(左側)でマークされたレコードによって動的に変更されるようになっています。
データテーブル
sample_commentsテーブル
ダッシュボード上にデータを表示するための sample_comments テーブルです。
sample_comments インフォメーションリンクの実行結果です。
スクリプト(IronPython)
コメント登録
登録ボタンクリック時に実行されるスクリプトです。
スクリプト例:
from Spotfire.Dxp.Data.Import import *
from System import Guid, Array, Object
from Spotfire.Dxp.Framework.ApplicationModel import NotificationService
import datetime
ilDataSource = InformationLinkDataSource(Guid('<インフォメーションリンクのGuid>'))
# List to save information link parameters
ilParameters = []
# Create parameter
ilParameter = InformationLinkParameter.CreateNamedParameter("username", Array[Object]([Document.Properties['InsertUsername']]))
ilParameters.append(ilParameter)
ilParameter = InformationLinkParameter.CreateNamedParameter("comment", Array[Object]([Document.Properties['InsertComment']]))
ilParameters.append(ilParameter)
# Get current datetime
tstamp = datetime.datetime.now().strftime("%Y/%m/%d %H:%m:%S")
if (str(Document.Properties['InsertUsername']) == '') & (str(Document.Properties['InsertComment']) == ''):
# Show warning notification
ns = Application.GetService[NotificationService]()
ns.AddWarningNotification('コメントを登録できませんでした。 (' + tstamp + ')' ,'ユーザー名 と コメント がどちらも空です。','')
else:
# For multiple parameters repeat this and append to the list
# Assign the parameters
ilDataSource.Parameters = ilParameters
Document.Data.Tables.Add("Parameterized-IL",ilDataSource)
Document.Data.Tables.Remove("Parameterized-IL")
# Reload data table
table.ReloadAllData()
# Show information notification
ns = Application.GetService[NotificationService]()
ns.AddInformationNotification('コメントの登録が完了しました。 (' + tstamp + ')' , 'username: ' + str(Document.Properties['InsertUsername']) + '\ncomment: ' + str(Document.Properties['InsertComment']) ,'')
コメント更新
更新ボタンクリック時に実行されるスクリプトです。
スクリプト例:
from Spotfire.Dxp.Data.Import import *
from Spotfire.Dxp.Data import *
from System import Guid, Array, Object
from Spotfire.Dxp.Framework.ApplicationModel import NotificationService
import datetime
ilDataSource = InformationLinkDataSource(Guid('<インフォメーションリンクのGuid>'))
# List to save information link parameters
ilParameters = []
#create parameter
ilParameter = InformationLinkParameter.CreateNamedParameter("id", Array[Object]([Document.Properties['UpdateId']]))
ilParameters.append(ilParameter)
ilParameter = InformationLinkParameter.CreateNamedParameter("username", Array[Object]([Document.Properties['UpdateUsername']]))
ilParameters.append(ilParameter)
ilParameter = InformationLinkParameter.CreateNamedParameter("comment", Array[Object]([Document.Properties['UpdateComment']]))
ilParameters.append(ilParameter)
# Get current datetime
tstamp = datetime.datetime.now().strftime("%Y/%m/%d %H:%m:%S")
if (str(Document.Properties['UpdateUsername']) == '') & (str(Document.Properties['UpdateComment']) == ''):
# Show warning notification
ns = Application.GetService[NotificationService]()
ns.AddWarningNotification('コメントを更新できませんでした。 (' + tstamp + ')' ,'コメントが選択されていないか、 ユーザー名 と コメント がどちらも空です。','')
else:
# For multiple parameters repeat this and append to the list
# Assign the parameters
ilDataSource.Parameters = ilParameters
Document.Data.Tables.Add("Parameterized-IL",ilDataSource)
Document.Data.Tables.Remove("Parameterized-IL")
# Reload table
table.ReloadAllData()
# Mark updated row
cf = DataValueCursor.CreateFormatted(table.Columns['id'])
idx = -1
for i in table.GetRows(cf):
idx = idx + 1
if cf.CurrentDataValue.ValidValue == Document.Properties['UpdateId']:
break
print idx
ids = IndexSet(table.RowCount, False)
ids.AddIndex(idx)
rs = RowSelection(ids)
Document.ActiveMarkingSelectionReference.SetSelection(rs, table)
# Show information notification
ns = Application.GetService[NotificationService]()
ns.AddInformationNotification('コメントの更新が完了しました。 (' + tstamp + ')' , 'id: ' + str(Document.Properties['UpdateId']) + '\nusername: ' + str(Document.Properties['UpdateUsername']) + '\ncomment: ' + str(Document.Properties['UpdateComment']) ,'')
コメント削除
削除ボタンクリック時に実行されるスクリプトです。
スクリプト例:
from Spotfire.Dxp.Data.Import import *
from System import Guid, Array, Object
from Spotfire.Dxp.Framework.ApplicationModel import NotificationService
import datetime
ilDataSource = InformationLinkDataSource(Guid('<インフォメーションリンクのGuid>'))
# List to save information link parameters
ilParameters = []
# Create parameter
ilParameter = InformationLinkParameter.CreateNamedParameter("ids", Array[Object]([Document.Properties['DeleteIds']]))
ilParameters.append(ilParameter)
# Get current datetime
tstamp = datetime.datetime.now().strftime("%Y/%m/%d %H:%m:%S")
if '選択した行の id が表示されます。' in str(Document.Properties['DeleteIds']):
# Show warning notification
ns = Application.GetService[NotificationService]()
ns.AddWarningNotification('コメントを削除できませんでした。 (' + tstamp + ')' , 'コメントが選択されていません。','')
else:
# For multiple parameters repeat this and append to the list
# Assign the parameters
ilDataSource.Parameters = ilParameters
Document.Data.Tables.Add("Parameterized-IL",ilDataSource)
Document.Data.Tables.Remove("Parameterized-IL")
# Reload table
table.ReloadAllData()
# Show information notification
ns = Application.GetService[NotificationService]()
ns.AddInformationNotification('コメントの削除が完了しました。 (' + tstamp + ')' , 'ids: ' + str(Document.Properties['DeleteIds']),'')
データ関数
コメント更新・削除時に利用するパラメータを作成するためのデータ関数 SelectComments を以下のように定義します。
参考)ライセンス設定
上記のようなダッシュボードをWeb Playerで利用した場合に、スクリプトが信頼されておらず正常に実行できない場合は、作業ユーザーが所属するグループをScript Authorグループに所属させた状態で、当該ダッシュボードを再度保存することで、スクリプトが信頼されます。
以下は、Administratorグループに所属しているユーザーを利用している場合の例です。
また、以下のようにCustom Query Authorグループにも所属させておくことで、今後カスタムクエリを実行する場合に権限エラーを回避することができます。