選択肢を他の DB・ビューから取り込む(マスタ参照の設定、絞り込み、転記)

この記事で分かること

選択肢を、別のデータベース(マスタ)に登録された一覧から取り込みたい場面があります。
consentFlow の WEB フォームでは、ビュー参照の URL(restViewJson) を選択(Select)コンポーネントのデータソースにして行います。
この記事では、参照先 DB の登録、選択肢の取り込み、絞り込みの書き方、選んだ行の値の転記、よくあるつまずきを説明します。

注: Notes/Domino をお使いだった方へ。Notes のフォームで、キーワード欄の「式で選択肢を取得」や @DbColumn / @DbLookup を使ってマスタ DB のビューから選択肢を作っていた処理に相当します。 Notes/Domino を使ったことがない方は、この注は読み飛ばして構いません。

用語: 「ビュー」は、データベースの文書を一覧表の形に並べたもの(列と行で表示される)です。 「NSF」は Notes/Domino のデータベースのファイル形式(拡張子 .nsf)です。 「ACL」はデータベースごとの利用者の権限設定を指します。

対象: フォームビルダーでフォームを作る方。consentFlow 4.x。参照できるのは読み取りだけです。

前提: できることと仕組み

URL用途戻り値(返ってくるデータ)
./restViewJson.xsp/json?srv=…&db=…&vw=<ビュー名>&…ビューから複数件を取る(キーで絞る、全文検索、並び替え、ページング)配列(1 要素 = ビューの 1 行)
./restDocJson.xsp/json?srv=…&db=…&unid=<UNID>文書 1 件の全項目を取るオブジェクト(キー = 項目名)
  • srv / db には、masterdb(このアプリのデータ DB)、外部データベースマスタに登録した名前、または実際の NSF のパスを書けます
  • アクセス権(ACL・読者フィールド)は、呼び出したユーザーの権限で判定されます。参照する人に権限がないマスタは、選択肢に出ません
  • 戻り値はビューの列です(非表示の列も含む)。列には必ず「プログラム名」を付けてください。付いていないと $11 のような自動の名前になります
  • ビューに無い項目が要るときは、そのビューに非表示列として追加するのが簡単です。1件ずつでよければ、選んだ行の @unid を使って restDocJson で文書の全項目を取れます

手順 1: 参照先の DB を名前で登録する(推奨)

フォームに実際のデータベースファイル(NSF)のパスを書き込まないために、参照先を名前(プレースホルダー)で登録します。

  1. 管理メニューの 「外部データベースマスタ」 を開きます(スーパー管理者の権限が必要です)
  2. 「行を追加」で、名前(例: supplierdb。英字で始まる英数字)、サーバー名(空欄なら同じサーバー)、ファイルパス(例: master\supplier.nsf)を入れます。サーバーとパスは候補から選べます
  3. 画面上部の「保存」を押します

以後、URL では db=supplierdb のように名前だけで参照できます。パスが変わっても、登録を直すだけでフォームの修正は不要です。

手順 2: 選択コンポーネントにビューをつなぐ

「取引先コードを打つと候補が出て、選ぶと名称が入る」という典型的な形を作ります。

  1. フォームビルダーで 選択(Select) コンポーネントを置きます(例: キー supplierSelect)
  2. 「データ」の設定で、データソースの種類を URL にし、URL に次を入れます
./restViewJson.xsp/json?srv=masterdb&db=supplierdb&vw=vSupplier&count=30
  1. 検索の設定で 検索フィールド(searchField)を keys にします。入力した文字が &keys= として送られ、ビューの第1ソート列の前方一致で候補が返ります
  2. 表示する文字列(template)に、見せたい列のプログラム名を書きます。例: {{ item.supplierName }}({{ item.supplierNo }})
  3. 値の種類(dataType)を object、値のプロパティ(valueProperty)を空にします。選んだ行がまるごと保持され、追加の問い合わせなしで他の項目に転記できます
  4. 候補の件数の上限は URL の count= で決めます。count を省くと 10 件で打ち切られるので、必ず指定してください
ビュー参照の基礎設定(DB の名前とビュー名を入れると、選択肢が URL から取り込まれる。デモ環境のキッチンシンクフォーム)

URL が正しければ、取得したビューの行がそのまま候補になります。
下の画面は、デモ環境の「キッチンシンク」フォームにあるダイアログで、同じ restViewJson の URL(count=20)を前方一致モードで呼び、ビューの先頭 3 列と UNID を一覧にしたものです。
選択コンポーネントの候補も、この一覧と同じ行から作られます。

ダイアログで取得したビューの一覧(検索モード、件数、実際に送られた URL、列のマッピング、候補の行。デモ環境のキッチンシンクフォーム、データはダミー)

手順 3: 選んだ行の値を別の項目に転記する

名称や UNID を、保存する項目に写します。

  1. 名称を入れるテキストフィールド(例: supplierName)を置き、「計算値」に次を書きます
var row = data.supplierSelect;
value = (row && typeof row === 'object') ? String(row.supplierName || '') : '';
  1. UNID を保存したいときは、非表示(Hidden)・保存する(persistent: true) の項目に row['@unid'] を入れます
  2. 選択コンポーネント自体は 保存しない(persistent: false) にし、文書を開き直したときは保存した UNID から表示を復元するのが定石です
前方一致で候補を出し、選んだ行の名称と UNID を自動で転記する部品(デモ環境のキッチンシンクフォーム)

絞り込みの書き方(URL のパラメータ)

やりたいこと書き方注意
前方一致で絞る&keys=値第1ソート列が対象。途中の文字では当たらない
完全一致で 1 件引く&keys=値&keysexactmatch=trueすべて小文字・値は true。keysExactMatch=1 は無視され前方一致になる
複数のソート列で完全一致&keysEx=値1,値2ビューのソート列の順に並べる
名称の途中一致(日本語)&search=語そのままで部分一致。語* と書くと 0 件になる。DB に全文索引が必要
名称の途中一致(英数字)&search=語*英数字は単語単位の一致なので * を付ける
特定の項目だけ検索&search=[項目名] CONTAINS 語[項目名] は文書のアイテム名(ビュー列のプログラム名ではない)。search を使うと keys と category は無視される
複合条件[a] CONTAINS x AND [b] CONTAINS y、[a] CONTAINS (x OR y)同じ項目の OR は必ず括弧で包む。URL エンコードして 1 つの search= に入れる
カテゴリの配下だけ&category=値階層は \ 区切り
並び替え&sortcolumn=列名&sortorder=descending列に「クリックでソート」の設定が要る
ページング&start=M&count=Nまたは page=&ps=

パラメータ名は小文字で書くのが安全です。

URL 組み立ての要点(デモ環境のキッチンシンクフォームに掲載の早見表)

よくあるつまずき

  • 選択肢が 10 件しか出ない → URL に count= がない
  • 完全一致にならない → keysExactMatch=1 と書いている。keysexactmatch=true(小文字)に直す
  • 日本語で検索すると 0 件 → 語* と書いている。日本語には * を付けない。または DB に全文索引がない(Database is not full text indexed. のエラー)
  • 選択肢が重複する/何度も再取得される → 絞り込みの値を URL に埋め込んでいる場合は、再取得のきっかけ(refreshOn)をその項目に限定し、clearOnRefresh を有効にして古い選択値を消す
  • [項目名] CONTAINS が常に不成立 → ビュー列の名前を書いている。列式で作った列は文書に存在しないので、文書のアイテム名を書く(restDocJson で確認できる)
  • 選択肢が出ない人がいる → その人にマスタ DB の読み取り権限がない

結果の確認

  • 選択欄に 1 文字入れると候補が出て、選ぶと名称が転記される
  • 保存して開き直しても、名称と UNID が残っている
  • デモ環境の「キッチンシンク」フォーム(consentFlow 連携タブ)の「View エクスプローラ」や「View を検索して文書を選択」のダイアログに DB の名前とビュー名を入れると、どのパラメータでどの結果が戻ってくるかをその場で確かめられます(手順 2 の最後の画面)

関連記事