ブログ

なぜ?入力してもルックアップが確定しない!ルックアップ拡張プラグインで「ほかのフィールド」が反映されない、保存エラーになる原因と解決策

kinkozi ルックアップ拡張プラグインをご利用中に、ルックアップした値が正しく反映されず、保存もできないエラーに悩まされたことはありませんか?この現象は、ルックアップのキーとなる値で検索した際、対象のレコードが「1件(ユニーク)」に定まらない場合に発生します。特に「文字列(1行)」フィールドを指定している場合、kintoneの検索仕様により意図せず複数のデータがヒットしてしまい、この事象が頻発するため注意が必要です。

「文字列」でのルックアップは、システム内部で「次のキーワードを含む」条件の検索(以下、like検索と表記が行われるため、マスターデータ内に「似た値(山田太郎と山田太郎次郎など)」が存在すると重複とみなされ、エラーになることがあります。一方、「数値」をキーにしている場合でも同一の内容のレコードが存在する場合は一意に絞り込まれずこの問題が発生します。「値の重複を禁止する」と「必須項目にする」に設定されていれば一意に絞り込めます。

今回は、文字列フィールド特有の「like検索」によるトラブルの仕組みと、この問題を解決するための2つの対処法をご紹介します。

原因:文字列フィールド特有の「like検索」

本プラグインの「独自ダイアログ」や「絞り込み」機能を使った場合は、kintoneカスタマイズのルックアップの機能を利用しております。kintoneカスタマイズのルックアップの機能は、ルックアップ元の値をキーにしてマスターデータを検索し、「検索結果が1件のみ(ユニーク)」である場合に限り当該レコードのデータをコピーします。

※技術的な参考情報
kintone APIの仕様については、cybozu developer networkのドキュメントもご参照ください。
レコード追加画面のイベント > ルックアップの取得を自動で行う

この際、kintoneの仕様としてフィールドタイプにより検索挙動が異なります。

  • ルックアップ元が「数値」「レコード番号」「計算」の場合:
    値が完全に一致するかどうかで判断されるため、「値の重複を禁止する」と「必須項目にする」に設定されていれば一意に絞り込めます(安全)。
  • ルックアップ元が「文字列(1行)」の場合:
    「like検索(キーワードを含む検索)」が行われるため、「値の重複を禁止する」と「必須項目にする」に設定されていても、フィールドの値を人間が「別物」だと思っていても、システム側が「重複(類似)」と判断してしまうケースがございます。

発生している事象リスト(文字列ルックアップの壁)

以下は、実際に「文字列(1行)」フィールドで検証を行って「重複(エラー)」と判定されたケースの一覧です。
これらは検索キーワードを内包する別のレコードがあり一意に定まらないためエラーとなります。

以下のようにマスターデータがあったとします。

上記データの商品コードをルックアップした時、以下の例ですと正しく入力補完されません。

  • 「A-1」と「モデルA-1」
    「A-1」で検索すると「モデルA-1」も like 検索によりヒットしてしまいNG。
  • 「モデルA」と「モデルA-1」
    「モデルA」で検索すると「モデルA-1」もlike検索によりヒットしてしまいNG。
  • 「山田太郎」と「山田太郎次郎」
    「山田太郎」で検索すると「山田太郎次郎」も like 検索によりヒットしてしまいNG。

取得ボタンを押しダイアログが開いて「選択」ボタンを押しても、ダイアログが上がる前のフォームにある値を基に検索するため、事象は変わりません。

なぜこれらが重複とみなされるのか?

これは、kintoneのカスタマイズに提供されているルックアップ用のAPIにおいて、文字列フィールドに対しては強制的にlike検索が行われる仕様だからです。現状の kintone で提供されている API を使う際の制限となるため、キーとなる文字列をユニークにするだけでは解決しない場合があります。

また、以下のように「スマホX」は「スマホXY」があるにもかかわらず like検索で一意に定まりルックアップにより入力補完されます。これは、kintoneの検索エンジンの単語区切りがかかわっていると考えます。

このように、kintoneの検索仕様(どこで区切られるか)を完全に予測して制御するのはリスクが高いため、後述の対処法にて回避していただくことが出来るかと考えます。

参考:kintoneの検索仕様と単語区切りについて
単語区切りや、詳細な検索仕様については、以下の外部記事やヘルプが非常に参考になります。

対処法1:内包関係を回避するようにデータを修正する(一番簡単)

もし、マスターデータのコード体系を変更できるのであれば、「あるデータが別のデータのキーワードを含まない(内包しない)」形に修正するのが最も手軽な解決策です。

具体的には、「桁数を揃える(ゼロ埋め)」などの対応が有効です。

  • NG例:「A-1」と「モデルA-1」(A-1が含まれてしまう)
  • OK例:「__A-001」と「モデルA-001」

このように、検索したいキーワード(__A-001)が、他のデータ(モデルA-001)の中に文字列として存在しない状態を作れれば、like検索であっても正しく1件に特定できます。
まずは、このデータの書き換えが可能かどうかをご検討ください。これで対応できるのであれば、この方法が一番簡単です。

対処法2:「レコード番号」をキーにする(確実な回避策)

データの書き換えが難しい場合や、どうしても内包関係を解消できない場合は、最も確実なワークアラウンド(回避策)は、ルックアップの紐づけ(コピー元のフィールド)を、文字列の「商品コード」などではなく「レコード番号」に変更することです。

なぜ「レコード番号」なのか?

  • 絶対的な一意性:
    レコード番号はkintoneが自動採番するシステムIDであり、絶対に重複しません。
  • 検索仕様の違い:
    レコード番号(数値等のタイプ)に対するルックアップでは、文字列のような「like検索」が行われません。「包含判定」や「単語区切り」の影響を受けず、ピンポイントで1件に特定できます。

「レコード番号なんて覚えていないから検索できないのでは?」と思われるかもしれませんが、ご安心ください。
本プラグインの「独自ダイアログ」機能を使えば、検索自体は「商品名」や「コード」で行い、裏側で「レコード番号」をセットすることが可能です。

設定変更の手順(対処法2の場合)

「レコード番号」を利用する場合の設定変更は以下の通りです。

  1. ルックアップ設定の変更(アプリ設定画面)
    「関連付けるアプリ」の「コピー元のフィールド」を、これまでの「商品コード(文字列)」を指定しているルックアップフィールドとは別に、「レコード番号」をコピー元とするルックアップフィールドを新規作成してください。
    ※「ほかのフィールドのコピー」の設定はそのままで構いません(商品名や単価などをコピー)。既存のルックアップの「コピー元のフィールド」は変更できないため別途作成し直しとなります。
  2. プラグイン設定の確認
    「独自ダイアログ」の設定で、検索・絞り込みを行いたいフィールド(商品名やコードなど)が表示されるように設定します。

これにより、ユーザーの操作感としては「ダイアログで名前を検索して選択」という便利な使い勝手を維持したまま、システム内部では「ユニークなレコード番号」で紐づくため、重複エラーが一切発生しなくなります。

まとめ

ルックアップフィールドが「文字列(1行)」の場合、「A-1」や「モデルA」といったデータの重複(like検索によるヒット)が発生しやすくなります。

お困りの場合は、まずは「対処法1(データの書き換え)」が可能かご検討ください。
もしデータの修正が難しい場合は、無理に解決しようとせず「対処法2(レコード番号への紐づけ変更)」を実施してください。kinkozi ルックアップ拡張プラグインの検索機能を活用すれば、レコード番号を意識することなく、安全かつ確実にデータをルックアップできるようになります。

ブログ一覧に戻る