はじめに
APIを投げた際に拡張SQLによって、プリザンターのテーブルのデータを更新する処理を走らせます。今回の機能はプリザンターにサーバスクリプトがない時からあるレガシー機能になります。そして、あまり使わない機能でもあるため、なかなか慣れない作業でした。
拡張SQL
まずは拡張SQLについて知らなくてはいけません。拡張SQLを使用するためには「Parameters¥ExtendedSqls」フォルダの配下にjsonファイルを下記入力内容を参考に作成します。APIから拡張SQLを実行する前段階として、新規作成したjsonファイルには、Name項目にAPIと紐づけるための名前を、Api項目に「true」を設定します。ここで注意が必要なのですが、可能であればjsonファイル名とName項目の値は一致させたほうが良いかと思います。こちらの理由に関しては後述します。
詳しくは下記ユーザーマニュアルを参照してください。
{
"Name": "Sample",
"Api": true
}
開発者向け機能:拡張機能:拡張SQL
APIから拡張SQLを実行
詳しくは下記ユーザーマニュアルを参照してください。
API
下記、サンプルAPIのようにリクエストを作成しましょう。リクエストに記述されているName項目は上記で作成したjsonファイルのName項目と紐づく一意の値を設定しましょう。また、Params項目は後述するSQL文に渡す値を設定することができます。そして、キーは後述のSQL文と紐づくものとなるためスペルミスは厳禁です。
{
"ApiVersion": 1.1,
"ApiKey": "XXXXXXXXXX...",
"Name": "Sample",
"Params": {
"SiteId": 1
}
}
また、APIのURLは下記になります。仮想ディレクトリを追加していなければ「{仮想ディレクトリ名}」は不要です。
http://{servername}/{仮想ディレクトリ名}/api/extended/sql
SQL文
下記、サンプルSQLのようにSQL文を作成しましょう。SQL文の置き場所は上記のjsonファイルと同じ「Parameters¥ExtendedSqls」フォルダの配下になります。また、WHERE句にある「@SiteId」は上記リクエストで指定した「1」が入ります。
UPDATE [Implem.Pleasanter].[dbo].[Results]
SET [ClassA] = '過去のレコード'
WHERE [SiteId] = @SiteId
AND [DateA] <= CAST(CURRENT_TIMESTAMP as date)
開発者向け機能:拡張機能:拡張SQL:APIから拡張SQLを実行する
まとめると・・・
上記APIリクエストを投げると拡張SQLが実行され、テーブルの[SiteId]が「1」のサイト、かつ[DateA]が今日以前が設定されているレコードの[ClassA]に「過去のレコード」というテキストを設定し、更新するという処理になります。
問題発生
しかし、今回お問い合わせしてくださったお客様の環境では、仮想ディレクトリを追加した環境(localhost/pleasanter)と仮想ディレクトリを追加していない環境(localhost)で挙動がおかしいというご連絡をいただきました。具体的にいは仮想ディレクトリを追加した環境では、レコードの更新がされなかったというご連絡です。私も色々調べてみましたが、わかりませんでした。正直、お手上げです・・・。そのため、実際にオンラインで画面共有をしていただきながら操作していただきました。私や先輩が見てもおかしいところはありませんでしたが、やはり動きません。そこで、弊社社長も加わり調査しましたら、なんとjsonファイルのName項目が重複していることが判明いたしました。そのため、注意事項として「jsonファイル名とName項目の値は一致させたほうが良い」と記載させていただきました。そうすることでName項目の重複を防ぐこともでき、気づくことも可能です。皆さん、気を付けましょう。
おわりに
今回は「APIから拡張SQLを実行する」方法を学びました。これによって、APIを投げて直接DBを更新することが可能となりました。今回の件でVM環境から1つのWEBサーバーに複数のアプリケーションを入れる方法も学びました。まだまだ、改善の余地ありですが、次の記事は「1つのWEBサーバーに複数のアプリケーションを入れる方法」でも書こうかなと思っています。