今回は、Sharperlightであるテーブルにクエリをかける前にその対象テーブルのデータを更新したい場合の解決方法を投稿してみようと思います。
幾つか方法はあるとは思いますが、この記事ではSharperlightデータモデルを使用します。
簡単な例として日付フィールドをもつテーブルとその日付フィールドを更新するストアドプロシジャーを用います。
要するにそのテーブルがクエリされる前にそのストアドプロシジャーを動作させてデータを更新させましょうということです。
とりあえずMicrosoft SQL Managerを利用して、空のデータベースを作成します。
その中にテーブルとストアドプロシジャーを準備します。
CREATE TABLE [dbo].[Qiita_OnPreProcess_Refresh](
[RefreshedDateTime] [datetime] NOT NULL
)
CREATE PROCEDURE Qiita_Refresh
AS
IF NOT EXISTS (SELECT 1 FROM [dbo].[Qiita_OnPreProcess_Refresh])
BEGIN
INSERT INTO [dbo].[Qiita_OnPreProcess_Refresh] ([RefreshedDateTime]) VALUES(getdate());
END
ELSE
BEGIN
UPDATE [dbo].[Qiita_OnPreProcess_Refresh] SET [RefreshedDateTime] = getdate();
END
GO
動作確認を行います。
EXEC Qiita_Refresh
SELECT [RefreshedDateTime]
FROM [Miscellaneous].[dbo].[Qiita_OnPreProcess_Refresh]
データモデルの準備
ではSharperlightがそのテーブルにアクセスできるようデータモデルを準備します。
既存のデータモデルを使用する場合は、この手順は必要ありません。
Sharperlightアプリケーションメニューからスタジオを選択します。
Newアイコンをクリックし、新しいデータモデルの作成を開始します。
New Productダイアログが表示されます。Description、Unique CodeとTarget Platformを以下のように設定します。
OK
ボタンで先に進みます。
データベースへの接続情報を要求されるので、このように設定し接続ボタンで接続が正しく行われるかチェックします。
OK
ボタンで先に進みます。
テーブル情報を読み込みますかという問い合わせが開くので、Yes
で先に進みます。
Import Objectsダイアログが表示されます。
Get Tables
ボタンでテーブル情報を読み取り表示させます。
OK
ボタンで先に進みます。テーブル情報がデータモデルに読み込まれました。
ダイアログ左下部のテーブル
をクリックし、テーブルの一覧を左側の領域に表示させます。
左上部のテーブルツリービューで、今回のテーブルをダブルクリックで選択します。
中央の領域には選択されたテーブルのフィールド情報が、右側の領域には、テーブル/フィールドのプロパティ情報が表示されます。
これで完了、このデータモデルを保存します。データモデルの保存先を問われるので、デフォルトの場所、つまり C:\ProgramData\SharperLight\MetaData\
に保存します。
Sharperlightアプリケーション用にデータベース接続情報を入力します。(先ほどのはデータモデル用でした)
Yes
で先に進みます。
クライアントのセットアップが表示されます。
接続情報を入力し、テスト接続を実行し、正常に動作したならOK
ボタンで先に進みます。
Sharperlightスタジオも閉じます。
以上でSharperlightアプリケーションを用いて、そのデータベース及びテーブルにアクセス可能となりました。
Sharperlightクエリビルダをアプリケーションメニューから開き、動作確認してみます。
製品(データモデル)、テーブルを指定し、表示されたフィールドを出力領域に設定します。
プレビュー
ボタンでクエリを実行。正常に動きました。
次はいよいよ本題です。
このままでは、最初に書き込んだ日付と時間がただクエリされるだけです。
データモデルを少し編集して、クエリが実行される前にストアドプロシジャーを実行させ、日付と時間を更新させます。
On Pre-processの設定
先ほどのデータモデルを開き、テーブル情報を表示させます。
右側のプロパティ欄でOn Pre-process属性を見つけます。
ここにデータモデル内で定義するプロセス名を記入すれば、このテーブルがクエリされる前(Pre-process)に、その指定したプロセスが実行されます。
そしてそのプロセスでは、先に作成しておいたストアドプロシジャーをコールすればいいわけです。
では早速作業に取り掛かります。
Processの定義
Sharperlightスタジオを起動して先ほど作成したデータモデルを開きます。
下部左側のProcessesを選び、Custom Events
の右クリックメニューからNew Processを選択します。
初期値のSP0001が作成されます。コード初期値SP0001をP1に変更します。
中央の表示域ではまだSP0001が表示されているかもしれません。中央の表示域の右角のX
ボタンで消して、再度選択しなおすと、新しいコードP1が表示されます。
次に、P1の右クリックメニューからNew SQL Commandを選択します。
コードをExecSPと変更します。
ExecSPを選択し、中央下部テキスト領域を表示させます。
そのテキスト領域にストアドプロシジャーを実行するコマンドを記入します。
Processの指定
今度は、テーブル定義に移動。On Pre-process属性を選択し、検索ボタンを表示させます。
検索ダイログを表示し、先ほど作成したプロセスP1を選択します。
このよな感じになります。
以上で完成。データモデルを保存します。
動作確認
Sharperlightアプリケーションメニューからクエリビルダを起動します。
製品(データモデル)、テーブルを選択し、日付時間フィールドを出力アイテムに設定。プレビュー
ボタンでクエリを実行します。
実行結果が表示されます。最初は、ストアドプロシジャーが実行されたかどうかは不明ですね。
今の結果を記録して、更新ボタンで再度クエリを実行。
どうですか結果は?時間が変更されているはずです。
数回試してみてください。ストアドプロシジャーが動作していることが確認できるはずです。
おわりに
今回は、時間を更新するだけといった極簡単なサンプルで紹介しましたが、日々の業務の中で、レポートを更新する前に最新の情報で対象テーブルを更新したいといった事が多々発生すると思われます。そういった場合にこのようなオプションは便利かもしれませんね。