LoginSignup
0
0

【データモデル】On Pre-Process for a tableを使ってみる

Last updated at Posted at 2023-11-07

今回は、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]

結果はこうなればOKです。
image.png

データモデルの準備

ではSharperlightがそのテーブルにアクセスできるようデータモデルを準備します。
既存のデータモデルを使用する場合は、この手順は必要ありません。
Sharperlightアプリケーションメニューからスタジオを選択します。
Newアイコンをクリックし、新しいデータモデルの作成を開始します。
New Productダイアログが表示されます。DescriptionUnique CodeTarget Platformを以下のように設定します。
image.png
OKボタンで先に進みます。
データベースへの接続情報を要求されるので、このように設定し接続ボタンで接続が正しく行われるかチェックします。
image.png
OKボタンで先に進みます。
テーブル情報を読み込みますかという問い合わせが開くので、Yesで先に進みます。
image.png
Import Objectsダイアログが表示されます。
image.png
Get Tablesボタンでテーブル情報を読み取り表示させます。
image.png
OKボタンで先に進みます。テーブル情報がデータモデルに読み込まれました。
image.png
ダイアログ左下部のテーブルをクリックし、テーブルの一覧を左側の領域に表示させます。
image.png
左上部のテーブルツリービューで、今回のテーブルをダブルクリックで選択します。
中央の領域には選択されたテーブルのフィールド情報が、右側の領域には、テーブル/フィールドのプロパティ情報が表示されます。
これで完了、このデータモデルを保存します。データモデルの保存先を問われるので、デフォルトの場所、つまり C:\ProgramData\SharperLight\MetaData\に保存します。
Sharperlightアプリケーション用にデータベース接続情報を入力します。(先ほどのはデータモデル用でした)
Yesで先に進みます。
image.png
クライアントのセットアップが表示されます。
接続情報を入力し、テスト接続を実行し、正常に動作したならOKボタンで先に進みます。
image.png
Sharperlightスタジオも閉じます。
以上でSharperlightアプリケーションを用いて、そのデータベース及びテーブルにアクセス可能となりました。

Sharperlightクエリビルダをアプリケーションメニューから開き、動作確認してみます。
製品(データモデル)、テーブルを指定し、表示されたフィールドを出力領域に設定します。
image.png
プレビューボタンでクエリを実行。正常に動きました。
image.png

次はいよいよ本題です。
このままでは、最初に書き込んだ日付と時間がただクエリされるだけです。
データモデルを少し編集して、クエリが実行される前にストアドプロシジャーを実行させ、日付と時間を更新させます。

On Pre-processの設定

先ほどのデータモデルを開き、テーブル情報を表示させます。
右側のプロパティ欄でOn Pre-process属性を見つけます。
ここにデータモデル内で定義するプロセス名を記入すれば、このテーブルがクエリされる前(Pre-process)に、その指定したプロセスが実行されます。
そしてそのプロセスでは、先に作成しておいたストアドプロシジャーをコールすればいいわけです。
では早速作業に取り掛かります。

Processの定義

Sharperlightスタジオを起動して先ほど作成したデータモデルを開きます。
下部左側のProcessesを選び、Custom Eventsの右クリックメニューからNew Processを選択します。
image.png
初期値のSP0001が作成されます。コード初期値SP0001P1に変更します。
image.png
image.png
中央の表示域ではまだSP0001が表示されているかもしれません。中央の表示域の右角のXボタンで消して、再度選択しなおすと、新しいコードP1が表示されます。
image.png
次に、P1の右クリックメニューからNew SQL Commandを選択します。
image.png
コードをExecSPと変更します。
image.png
ExecSPを選択し、中央下部テキスト領域を表示させます。
image.png
そのテキスト領域にストアドプロシジャーを実行するコマンドを記入します。
image.png

Processの指定

今度は、テーブル定義に移動。On Pre-process属性を選択し、検索ボタンを表示させます。
image.png
検索ダイログを表示し、先ほど作成したプロセスP1を選択します。
image.png
このよな感じになります。
image.png

以上で完成。データモデルを保存します。

動作確認

Sharperlightアプリケーションメニューからクエリビルダを起動します。
製品(データモデル)、テーブルを選択し、日付時間フィールドを出力アイテムに設定。プレビューボタンでクエリを実行します。
image.png
実行結果が表示されます。最初は、ストアドプロシジャーが実行されたかどうかは不明ですね。
今の結果を記録して、更新ボタンで再度クエリを実行。
どうですか結果は?時間が変更されているはずです。
数回試してみてください。ストアドプロシジャーが動作していることが確認できるはずです。

おわりに

今回は、時間を更新するだけといった極簡単なサンプルで紹介しましたが、日々の業務の中で、レポートを更新する前に最新の情報で対象テーブルを更新したいといった事が多々発生すると思われます。そういった場合にこのようなオプションは便利かもしれませんね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0