この記事で分かること
選択肢を、別のデータベース(マスタ)に登録された一覧から取り込みたい場面があります。
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)のパスを書き込まないために、参照先を名前(プレースホルダー)で登録します。
- 管理メニューの 「外部データベースマスタ」 を開きます(スーパー管理者の権限が必要です)
- 「行を追加」で、名前(例:
supplierdb。英字で始まる英数字)、サーバー名(空欄なら同じサーバー)、ファイルパス(例:master\supplier.nsf)を入れます。サーバーとパスは候補から選べます - 画面上部の「保存」を押します
以後、URL では db=supplierdb のように名前だけで参照できます。パスが変わっても、登録を直すだけでフォームの修正は不要です。
手順 2: 選択コンポーネントにビューをつなぐ
「取引先コードを打つと候補が出て、選ぶと名称が入る」という典型的な形を作ります。
- フォームビルダーで 選択(Select) コンポーネントを置きます(例: キー
supplierSelect) - 「データ」の設定で、データソースの種類を URL にし、URL に次を入れます
./restViewJson.xsp/json?srv=masterdb&db=supplierdb&vw=vSupplier&count=30
- 検索の設定で 検索フィールド(searchField)を
keysにします。入力した文字が&keys=として送られ、ビューの第1ソート列の前方一致で候補が返ります - 表示する文字列(template)に、見せたい列のプログラム名を書きます。例:
{{ item.supplierName }}({{ item.supplierNo }}) - 値の種類(dataType)を
object、値のプロパティ(valueProperty)を空にします。選んだ行がまるごと保持され、追加の問い合わせなしで他の項目に転記できます - 候補の件数の上限は URL の
count=で決めます。countを省くと 10 件で打ち切られるので、必ず指定してください

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

手順 3: 選んだ行の値を別の項目に転記する
名称や UNID を、保存する項目に写します。
- 名称を入れるテキストフィールド(例:
supplierName)を置き、「計算値」に次を書きます
var row = data.supplierSelect;
value = (row && typeof row === 'object') ? String(row.supplierName || '') : '';
- UNID を保存したいときは、非表示(Hidden)・保存する(persistent: true) の項目に
row['@unid']を入れます - 選択コンポーネント自体は 保存しない(persistent: false) にし、文書を開き直したときは保存した 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= |
パラメータ名は小文字で書くのが安全です。

よくあるつまずき
- 選択肢が 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 の最後の画面)
関連記事
- ログインユーザーの氏名・所属・ロールを WEB フォームで使う
- WEB フォームを開いたときに「1回だけ」処理を実行する
- データベース参照設定(アプリケーション設定)