アクアビット長井と申します。
本日お客様よりkintoneルックアップについて質問を頂きました。
ヘルプ https://help.cybozu.com/ja/k/user/whats_lookup.html には、
「手順1で入力した名前に一致する顧客が1件だけの場合、手順2の顧客の一覧は表示されません。[取得]をクリックした時点で、顧客の情報がフォームに入力されます。」という説明が記載されています。
お客様のご要望では、対象が1件の場合でも候補を出したいというものでした。ルックアップ先にレコードを登録し忘れていた場合、フィールドにルックアップ先の値がいきなり格納されると、レコード選択というプロセスを経ないため、間違った値が計上されるということです。
JavaScript APIでそういったプロパティを操作し、1件でも候補を出す方法があれば教えて頂けると助かります。
https://cybozudev.zendesk.com/hc/ja/articles/202166270#step8
にある、record[‘ルックアップ’][‘lookup’] = true; にすれば1件であれ、常に候補が出るようになればよいのですが。。。
または、次善案として、ルックアップ対象レコード数を取得し、その件数格納用のフィールドを用意しておくことで、あとで一覧で対象が1件のレコードを精査するような提案をしようかとも考えています。その場合、ルックアップ対象レコード数の取得は可能でしょうか。
もしなければ、
kintone.api(‘/k/v1/records’, ‘GET’, {app: appId, query: クエリ文字列, fields: [‘$id’]}, function(response){
レコード件数フィールド = response.records;
});
で取得する方法で行こうかと思います。
今後のため、質問を行う立場も経験しておきたいと思います。お手数をおかけいたしますが、よろしくお願い申し上げます。
長井さん
ラジカルブリッジの斎藤です。
お客様のアプリがどのようなものかわかりませんが、ルックアップで対象が1件でも候補画面を出したいという要望は、課題に対する本質的な解決策なのかどうかというところが気になりました。
ルックアップ先にレコードを登録し忘れていた場合、フィールドにルックアップ先の値がいきなり格納されると、レコード選択というプロセスを経ないため、間違った値が計上されるということです
本来は候補が2つあるはずなのに、まだルックアップ先に1件しか登録されていないので、その登録済みのものが自動的に選択されてしまい、それによって他の項目のコピーで間違った値がコピーされてしまう、というようなことでしょうか?
これは、ルックアップ先に2つ登録されていて、候補画面が出たとしても、間違ったレコードを選んだら同じ結果になるように思うのですが。。
いずれにしても、選択後に間違いに気づくことができれば、「クリア」を押せば一旦リセットされますよね?
なので、間違いに気づかせることが解決策のように思うのですが、いかがでしょうか?
想像で書いてますので、前提が間違っているようでしたらごめんなさい!
斎藤さん、早速のご回答ありがとうございます。
仰るとおり、1件で一覧を出すというのは本質的な改善案ではありません。
ルックアップ結果を表示させるフィールドが数種類あり、ルックアップ対象の検索キーがルックアップ先に複数あるため、入力画面からのチェックが難しいとのことです。(販売管理でいう、請求先と送付先の2つのキーからルックアップ先の金額その他をを導出しているとお考え頂ければ)
ルックアップから一覧で選択することで、チェックプロセスが有効に機能するとお客様はお考えのようです。
私としては入力時チェックよりは、月末の請求書発行時に再チェックを行っていただく運用をお勧めしようかと考えています。
一件の場合に一覧表示が難しければ、一覧を出したかどうかをルックアップ先の件数を取得することで、入力時のチェックプロセスが一覧経由を経たものかどうかを保持し、月末のチェック項目に含めて頂こうかと考えております。
タブレットからの入力で、言葉足らずではありますが、回答と当初質問の補足とさせていただきます。
お手数をお掛けいたしますが、よろしくおねがいします。
Yoshikazu Nagai さん
私の解釈が間違っているかも知れませんが、
ルックアップ結果を表示させるフィールドが数種類あり、ルックアップ対象の
検索キーがルックアップ先に複数あるため、入力画面からのチェックが
難しいとのことです。
(販売管理でいう、請求先と送付先の2つのキーからルックアップ先の
金額その他をを導出しているとお考え頂ければ)
請求先に入力すべきコードを、送付先に入力してしまったにもかかわらず、送付先にも同一コードが存在していた場合、入力が進んでしまうので、ポカ除けの為に、一覧を表示させたい。というイメージでしょうか?
既に運用に入っている場合難しいかも知れませんが、上記の様な話であれば、コード体系を分けてしまうのも方法かも知れません。請求先はA\ *、送付先はB *等。
1件でも候補を出す方法、ルックアップ対象レコード数の簡易的な取得方法は分かりません。。
上海レンユアー 松村さま
ご回答ありがとうございます。
ご懸念の通り、すでに運用に入ってしまっています。kintoneリリース直後ですから3年近くになります。さすがにレコード構成を変えるのは厳しい状態です。
また、請求先と送付先についてですが大体、選ぶ先は送付先なのですが、送付先のルックアップ一覧の金額がかなりのレコード数になっております。送付先一覧には、請求先によって運賃が違うため、名称が同じでも複数の似たようなレコードが存在しています。
確かリリース直後はルックアップ機能が今ほど充実しておらず、工夫の末に今のような形にしたと記憶しております。
今まではルックアップ先のレコードが一覧で表示されなくても特に問題ありませんでした。が、請求先と送付先の組み合わせによる金額の種類がかなり増えてきたためとなります。
この後、少しjavascript apiによるカスタマイズを試してみようかと考えております。また何かわかることがありましたら教えて頂けると助かります。よろしくお願いいたします。
長井さん
アプリの仕様がまだよくわかっていないのでイメージになりますが、送付先をルックアップで選択した後に、本来選択すべき送付先(=予め設定されている請求先に対応した金額の送付先レコード?)だったかどうかをJavaScriptでチェックというのは難しいのでしょうか?
斎藤さん、こんばんは。お付き合いくださいまして、ありがとうございます。
またご提案を頂いたことについても深く感謝いたします。
私の当初のご説明をもう少し丁寧に行うべきだったと反省しております。
該当箇所は、以下のような仕様となります。
送付先名称項目の横に「取得」ボタンがあります。ここに入力された送付先から、ルックアップ一覧が表示されます。
一覧に表示されるのは金額テーブルで、このテーブルには金額ごとの項目として請求先名や送付先名、担当者や送付先住所やその他の複数の区分名称などを表示し、該当運賃を選択させる仕組みをとっております。
また、元となるアプリでは、請求先や送付先など、同等のフィールドを用意しておりますが、ルックアップで参照されるのは送付先名称となります。また、ルックアップの結果、金額や送付先住所、その他項目などがコピーされます。
金額の種類が似たような名前の請求先と送付先によってさまざまあり、今現在で3207レコードがあります。金額交渉などでこのレコードも入れ替わるとともに、新たな請求先と送付先が発生する度に追加しているとのことです。(この整理も随時行って頂いているとのことですが・・・)
この組み合わせですと、送付先が既存の送付先と同一でも請求先が違ったり、また、逆のパターンがあり、間違いの元となっているようです。
元となるアプリの送付先に入力した文字列に該当する金額テーブルの該当レコードが複数あった場合、一覧選択が出てくるので、正しい請求先と送付先を選択すれば問題ありません。
ただ、請求先と送付先の組み合わせで新たな金額が発生し、レコード追加が必要なのに忘れや遅延などでレコードが無い場合にルックアップから「取得」した場合、一件のみ該当するレコードがルックアップ先にあった場合、一覧表示を経ずに、いきなりアプリのコピー先フィールドに値が入ってしまいます。この場合、本来ならばアプリの各フィールドをチェックすればよいのですが、名前が似ていたりすると、チェックがされないといったことが起きているようです。ここで一覧が表示されれば、チェックプロセスを通過させることとなり、アプリの入力ミスとルックアップ先の金額レコードの追加漏れを防ぐことができる、というのがお客様のご意見です。
実は昨晩、Javascript APIで試行してみたのですが、DOM経由で「取得」ボタンを取得し、そのonClickイベントで送付先の一覧を取得させるということは、かなりバージョンアップ時のリスクがあると言わざるを得ません。(フォームのレイアウトはバージョンアップによって変化しないという前提でいえば、上からn番目のbuttonタグでかつclass名にinput-lookup-gaiaを持つ要素という取得は可能なのかもしれませんが、果たしてその方法が正しいのかというと自信がありません)
ルックアップ先の該当レコードが1件かどうかを判別させる簡単な方法があれば、それを利用したいところです。ルックアップ先の該当レコードが1件の場合でも一覧を表示させるというのは、本質的な解決策ではないという皆様のご意見には私も賛成です。
明日、他の方法がないかどうか、お客様と電話で会話を試してみたいと思います。ありがとうございます。
Yoshikazu Nagai さん
イメージとしてですが、こんな感じで捉えました。一部想像です。
*出荷アプリ(これ想像)
*金額テーブルアプリ(送付先、請求先)
*送付先アプリ
*請求先アプリ
出荷アプリで金額テーブルをルックアップ選択することで、その出荷伝票の送付先・請求先が決まる。但し、出荷アプリのルックアップ項目は送付先。
既にご検討済かも知れませんが、強引且つ、スマートでは無い解決方法を一つ提示させて下さい。参考までにと話半分で捉えて下さい。
一言で言うと、金額テーブルアプリに強制的に複数レコードを起こす案です。
1)請求書アプリに ダミー用請求先データを1件追加 名称:Dummy
2)送付先アプリの新規登録の保存イベントで、JavaScriptにより、金額テーブルアプリにレコードを1件強制追加(新送付先+ダミー用請求先)
3)ユーザーは手動で、金額テーブルアプリで、正しい情報を追加
これで、金額テーブルアプリには、1送付先について、N件のレコードが存在することになります。
<良い点>
*出荷アプリで送付先を手入力すると、高確率で、N件存在するので、一覧が表示される。
*ユーザーが金額テーブルへの正しい情報を追加し忘れていた場合、一覧が表示されないが、月末請求書発行時に、dummy請求先に請求書が発行されるので、異常に気付く事ができる。
<悪い点>
*一覧表示時に常にDummyが出て格好悪い(並び順で常に最終行に出る様にすることで、多少のかっこ悪さの軽減は可能かも)
*ダミー請求先レコードを削除されると困る
*ダミー金額テーブルレコードを削除されると困る。
*技術者としてあまりこういう形の設計はしたくない。と感じるかも。
解決方法模索の一助になればと、スタンダードではない解決方法を提示させて頂きました。良い方向へ進むことをお祈りしております。
上海レンユアー 松村さま。
こんばんは。お付き合いくださいまして、ありがとうございます。
またご提案を頂いたことについても深く感謝いたします。
下記のご提案、私の頭に一瞬閃いてはすぐに消えたものを、運用面まで完全にカバーしてご提案頂きました。ありがとうございます! しかもダミーレコードというのは考えていませんでした。
おそらくはJavascript apiでスマートに1件でも候補を表示させるのは難しかろうと思いますので、今回頂いたご提案をお客様にも打診してみたいと思います。
ありがとうございました!!
皆さまから頂いた以下の件、その節はありがとうございました。
お客様にダミーレコード追加の運用を追加してから3か月が経ちましたが、先ほどお客様と打ち合わせを終え、状況を確認してみました。
特に問題なく運用できているということで、一旦こちらについては解決済みとして閉じさせて頂きたいと思います。ありがとうございました。