はじめに
今回の記事では、プリザンターのルックアップ機能で実現できない「複数値」を取得する機能をサーバスクリプトで実現します。今回のお問い合わせでは、プリザンター標準機能である「ルックアップ機能」に関するものでした。プリザンターのルックアップ機能では、条件に合致した値を一つだけ取得します。今回のお問い合わせでは、複数値を取得するルックアップ機能をサーバスクリプトで実現できるかどうかというお問い合わせでした。下記スクリプトで実現できましたので共有させていただきます。
サーバスクリプト
try {
// 分類Bに表示する要素
let lookupElement;
// リンク先のサイトID
let siteId = XXXX;
// 分類Aに何かしら表示されていたら
if (!(model.ClassA === '[]')) {
let array = new Array();
// フィルタ条件を設定
let data = {
View: {
ColumnFilterHash: {
// 分類Aの表示内容をもとにリンク先のレコードを絞り込み
ResultId: model.ClassA
}
}
}
// 絞り込み結果をもとにレコード情報を取得
let results = items.Get(siteId, JSON.stringify(data));
// 絞り込んだリンク先レコードごとに分類Bを取得
for (let result of results) {
// 配列に要素を設定
array.push(result.ClassB);
}
// 配列を「,」区切りの文字列に設定
lookupElement = array.join(',')
// 要素を分類Bに設定
model.ClassB = lookupElement;
} else {
model.ClassB = '';
}
} catch (ex) {
context.Log(ex.stack);
}
リンク先のテーブルからレコードIDとClassAに入力された値が合致するレコード情報を取得します。for文でレコード情報数分処理を反復し、リンク先テーブルから取得したレコードのClassBの値を配列「array」に設定していきます。joinによって、配列「array」に設定された要素を「,」(カンマ)区切りで文字列に変換します。「,」区切りの文字列をClassBに設定します。
さいごに
今までは「,」区切りの文字列を作成する際は下記のコードのようにif文で作っていました。↓上記サーバスクリプトのfor分内の処理です。
// 絞り込んだリンク先レコードごとに分類Bを取得
for (let result of results) {
// 要素がない場合
if (!lookupElement) {
// リンク先レコードの分類Bの値を取得
lookupElement = result.ClassB;
// 要素がある場合
} else {
// リンク先レコードの分類Bの値をカンマ区切りで取得
lookupElement = lookupElement + ',' + result.ClassB
}
}
このコードはよくないと指摘を受けましたため、修正したコードが上記のサーバスクリプトになります。動作も確認済みです。
最近、SI案件やサポートWEBの対応を実施するにつれてプリザンターにはできないことはないのではないかと思っています。そんなプリザンターを作ってしまう社長に対してはとても尊敬しています。それだけではなく、社長は私の上司でもあるのですが、理解力のない私にも私が理解できるまで説明してくれます。指摘してくださる際も私の意見を聞いてくれて、優しく時に厳しく接してくれる社長には感謝しかないです。インプリムに入社して本当に良かったと思っています。