ブログ

2023/01/13
【プリザンター】 番外編)グループに組織を含めて選択項目と連携した選択肢候補を動的に設定する方法

動的に選択肢を変更する

ブログ閲覧ありがとうございます、CCS田中です。

今回はお客様からの掲題の要望がありましたので、それを実現するための方法を説明いたします。
少し複雑な内容になりますがご了承ください。

プリザンターをADと連携されている方もいらっしゃるかと思います。その際にADのグループがプリザンターに連携ができないために、組織情報をリンクさせて使用している場合があるのではないでしょうか。
グループには組織情報も含めることができますので、それをうまく使うことで人事異動などにも対応ができるかと思います。

今回、1つのグループに複数の組織を含めておき、ある選択肢が決定すると、それに紐づく組織のユーザを選択項目として動的に表示させる設定をおこなう方法を説明します。
例として以下のような設定を想定します。

承認グループを作成し、そこに組織として「営業部」、「システム部」、「管理部」を含めます。(下図参照)
各組織には、組織コードが以下の様に設定されているものとします。

営業部  :A01001
システム部:B01001
管理部  :A01002

組織コードの頭3桁は、拠点ごとに設定されているため、拠点が決まると頭3桁が決定する仕組みとします。
つまり、上記では営業部と管理部は同じ拠点で、システム部は別の拠点ということになります。
分類Aで「拠点」を選択させて、分類Bで「承認者」を設定するようにし、承認者は上記の拠点に含まれる人から選択できるようにします。

なお、ユーザ(カッコ内は組織)は、以下の登録がされているものとします。(下図参照)

山田太郎(営業部)
鈴木一郎(営業部)
田中健司(システム部)
高橋義信(システム部)
三宅一生(管理部)
山本三郎(管理部)

このような内容をサーバスクリプトで記載します。
詳細は次で説明します。

サーバスクリプトの説明

まずは事前にテーブル上に項目として「分類A」と「分類B」を追加し、それぞれの名前を「拠点」「承認者」と設定します。

拠点(分類A)の選択肢としては、以下を登録します。
A01,本社
B01,研究所

さらに[自動ポストバック]にチェックを入れて、[自動ポストバック時に返却する項目]ではClassBと入力します。



承認者(分類B)の選択肢は、[[Users]]と設定します。※これは、サーバスクリプトにあるAddChoiceHashを使う場合は初期値を入れておく必要があり、プロセス等で使用するためにユーザ選択の項目に設定する必要があるためです。

また、組織は上記に記載した通りの設定がされているものとして、グループはIDが5の「承認グループ」に、営業部、システム部、管理部が含まれるように設定しておきます。(下図参照)
ここまで準備ができたら、以下のサーバスクリプトを設定します。
条件は、「画面表示の前」のみを選択します。

下記のスクリプトでは、グループにユーザが含まれている場合に、そのユーザも選択肢の一つとして表示するように設定しています。
下記で設定している変数について説明します。

groupId  :今回使用するグループのグループID
deptKey  :「拠点」で選択された組織コード
group   :上記グループIDのグループオブジェクト
member  :上記グループIDのグループに含まれるメンバー(組織またはユーザ)
CrrDept  :上記グループIDのグループに含まれる組織の組織ID(ユーザの時は0)
DeptCd  :上記組織IDの組織コード
DeptCd3  :上記組織コードの頭3桁
caseDept  :上記組織IDのオブジェクト
members  :上記組織IDのメンバーオブジェクト
DeptMemter :上記組織IDのメンバー
user    :上記グループIDのグループに含まれるメンバーのオブジェクト

<サーバスクリプト>


let groupId = 5;
var deptKey = model.ClassA;

let group = groups.Get(groupId);
for (let member of group.GetMembers()) {

//グループ内メンバーが組織のときの処理

let CrrDept = depts.Get(member.DeptId);
if(CrrDept){
var DeptCd = CrrDept.DeptCode; //組織コード設定
var DeptCd3 = DeptCd.slice( 0 , 3 ); //組織コードの頭3桁
if(DeptCd3 == deptKey){ //組織コードの頭3桁と分類Aで選択されたコードが一致したら処理
let caseDept = depts.Get(member.DeptId);
if (caseDept) {
const members = caseDept.GetMembers();
for (let DeptMember of members) {
columns.ClassB.AddChoiceHash(DeptMember.UserId , DeptMember.Name); //分類Bに対象組織のユーザIDとユーザ名を列挙
}
}
}
}
//グループ内メンバーがユーザのときの処理
else{
user = users.Get(member.UserId);
columns.ClassB.AddChoiceHash(member.UserId , user.Name); //分類Bに対象のユーザIDとユーザ名を列挙
}
}


上記を設定することで、拠点で「本社」が選択されると、承認者に営業部と管理部のメンバーが選択肢に表示され、「研究所」を選択するとシステム部のメンバーが表示されます。
※一度承認者を選択後に拠点を変更した場合、一度選択された承認者が承認者欄に残りますので注意ください。

メソッド関連を補足しておきます。

xxx.Get(Id) → xxx部分は、users,groups,deptsのいずれかを指定し、Id部分はそれらのIDを指定することで、各項目をオブジェクトとして定義します。
cloumns.分類名.AddChoiceHash() → カッコ内に指定した選択肢を分類名に追加します。
xxx.GetMembers() → xxxに所属するユーザーオブジェクトを取得します。

まとめ

いかがでしたか?

今回は前提条件が複雑で難しかったかもしれませんが、今回のスクリプトを自社の環境に合わせて改造して試してみてください。
プロセス機能等で使うと便利に使えると思います。

弊社ではスタイル・スクリプトサンプル集、プリザンター逆引き辞典のほかにも、運用ノウハウ集の販売もございます。また、導入の支援や、スクリプト開発なども支援いたします。

ご相談の内容によっては有料となる場合がございますが、まずは気軽にご相談ください。
☆☆☆
ブログ内容への質問や追加説明をご希望の方は【 問い合わせフォーム 】からお気軽にお問い合わせください
☆☆☆

PAGE TOP