関連レコード一覧に表示されたレコードの件数やフィールドの集計値をセットするフィールドを使用している場合、いつこのフィールドの値を更新するかが問題になります。
例えば、下記のタイミングが想定されます。
このアプリの詳細画面、追加・編集画面が表示された時に更新する
関連レコード一覧で表示されているアプリ側でレコードが更新された時に、このアプリのフィールドも更新する
しかし、集計値をセットするフィールドを後で追加した場合など、一括でフィールドの値を更新したい場合もあるかと思います。
そういった場合は、更新専用の一覧を作成する方法で一括更新は可能です。
なお、一括更新ではなく追加・編集・詳細画面で関連レコード一覧の集計を行いたい場合は、下記の記事をご覧ください。
kintoneアプリの設定
アプリ側では下記の設定が必要です。
更新対象か否かを判別するためのフィールドを追加する
一括更新専用の一覧を作成する
まずは、更新対象か否かを判別するためのフィールドを追加します。
フィールド名、フィールドコードは共に「更新完了」、文字列(1行)フィールドです。
グループに入れて、普段はユーザーから見えないようにしておきます。
やること「フィールドを無効化する」で操作できないようにしておくのもおすすめです。
次に、更新専用の一覧を作成します。例での一覧名は「更新用一覧」です。
ポイントは、絞り込みの条件です。
「更新完了」フィールドが未入力のレコードのみ表示するよう設定しています。
今回の一括更新では、この一覧の表示条件である「更新完了」フィールドが未入力のレコードが、一括更新の対象となります。
Customineでのカスタマイズ
カスタマイズを作成します。
まずは、「一覧の条件でレコードを全件取得する」で一覧に表示されたレコードを取得します。
この時の条件は「一覧画面を表示した時」と「現在の一覧が指定の一覧ならば」です。
「現在の一覧が指定の一覧ならば」で一覧の名前を指定することで、特定の一覧画面が表示された時だけアクションを実行することができます。
また、処理中は画面に触れてほしくないので「読み込み中画面を表示する」を使用します。
条件は、一覧にレコードがあった時、つまり「一覧の条件でレコードを全件取得する」でレコードが取得された時だけ表示したいので、「他のアクションの実行が完了した時」でレコードの取得を待ち、「レコード件数が1件以上ならば」でレコード数を判定します。
このように指定することで、一覧画面にレコードが無ければ読み込み中画面を表示する移行のアクションは実行されません。
次に、関連レコードで一覧で表示されているレコードの行数をカウントします。
ただ、ここで注意が必要なのは「関連レコード一覧の条件でレコードを取得する」は使用できない事です。
このやることは、一括更新では使用できません。
その代わりに「キーを指定してレコードを取得する」や「クエリで条件を指定してレコードを取得する」などを使用して、関連レコードと同じ条件でレコードを取得します。
今回の例では、関連レコード一覧がカスタマイズ対象のアプリの「顧客名」フィールドの値と、参照するアプリ「顧客リスト」アプリの「会社名」が一致しているレコードを取得する設定になっています。
関連レコード一覧に指定されている条件を、「キーを指定してレコードを取得する」の設定に反映します。
取得先アプリは「顧客リスト」、キーとなるフィールドは「会社名」。
そしてポイントとなるのがキーの値です。「= $6[0].顧客名 」と指定しています。
「= $6[0].顧客名 」の意味は、アクション番号6番で取得されたレコードの1行目の「顧客名」フィールドの値、という意味です。
一覧画面には複数行のレコードが表示されている可能性がありますが、その中から1行目のレコードだけを処理対象としたいので、このような指定をしています。
条件は、「他のアクションの実行が完了した時」で、読み込み中画面を表示した「14」を指定しています。
※なお、関連レコード一覧で参照しているアプリが自アプリと同じアプリの場合(自分のアプリ内の別のレコードを表示しているような場合)、
関連レコード一覧に表示されている行数と「キーを指定してレコードを取得する」で取得されたレコード数が一致しない場合があります。
これは、関連レコード一覧では自動的に今表示されているレコードが除外されて表示されるためです。
このような場合は、下記のアクションを追加してください。
下記のアクションは、アクション番号1「キーを指定してレコードを取得する」で取得したレコードから、「取得したレコードを絞り込む」で自レコードを除きます。
このアクションを追加した場合は、その後のレコード行数のカウントで、このアクションの取得結果をカウントしてください。
次に、「レコード行数をカウントする」で、「キーを指定してレコードを取得する」で取得したレコードの行数をカウントします。
カウント以外の場合は、ドキュメントのカテゴリー「集計」の、レコードを対象にしたやることを指定してください。
最後に、カウント結果をレコードに反映します。
この時、処理対象となるレコードのみ更新対象とするため、やること「レコードを更新する(キーの値を直接指定)」を使用します。
更新先アプリはカスタマイズ対象としている自アプリ、キーとなるフィールドは「レコード番号」です。
キーの値は、今処理を行っているレコードとしたいので、「= $6[0].レコード番号 」と指定します。
このように指定すると、今処理対象としている、アクション番号1で指定したのと同じレコードを更新対象として指定できます。
マッピングは、件数フィールドにアクション番号2でカウントしたレコード数をセットし、更新完了フィールドに”更新完了”とセットします。
最後に、「画面をリロードする」で画面を更新します。
画面がリロードされると、更新完了フィールドに”更新完了”とセットされたレコードは一覧から消えるので、次の行が処理対象となります。
以上でカスタマイズは完了です。
カスタマイズを「kintoneアプリへ登録」し、更新用一覧を開くと画面がリロードを繰り返し、一覧からレコードがなくなるまで更新処理が行われます。
一覧からレコードがなくなったら、処理完了です。
一括更新を再実行する
今回ご紹介した手順では、一度一括更新を行うと更新完了フィールドに値がセットされたままになるため、2度目、3度目と再度一括更新を行いたいといった場合に対応できません。
下記に、2度目、3度目と再度一括更新を行うためのボタンを作成する方法をご案内します。
下記のカスタマイズを作成します
更新用一覧とは別の一覧に、「更新用一覧へ遷移」ボタンを設置
「更新用一覧へ遷移」ボタンが押されると、一覧に表示されている全レコードの更新完了フィールドをクリア
更新用一覧へ遷移
なお、今回は組み込んでいませんが、2でボタンが押された後の処理は時間がかかることが多いので「読み込み中画面を表示する」を追加いただくのがおすすめです。
まずは「ボタンをメニュー位置に配置する」でボタンを設置します。
例では「基本の一覧」という名前の一覧の時にボタンを表示する設定にしました。
この一覧は条件の設定はなく、このアプリの全レコードを表示するように設定しています。
ボタンが押された時の処理を作成していきます。
「一覧の条件でレコードを全件取得する」で一覧に表示されているレコードを取得します。
今回のように全レコードが対象となる場合であれば「全レコードを取得する」でもかまいませんし、他のレコードを取得するやることでも問題ありません。
条件は「ボタンを押した時」で、アクション番号10で作成したボタンを指定しました。
次に、「レコードをもとに別のレコードを更新する」で「更新完了」フィールドをクリアします。
元になるレコードは「11」、更新先アプリは今カスタマイズしているkintoneアプリ、キーとなる更新先のフィールドとキーの値となる元になるレコードのフィールドは「レコード番号」です。
意味としては、アクション番号11で取得した全レコードを更新対象とする、という意味です。
そして、マッピングは「更新完了=””」です。更新完了フィールドの値を未入力の状態に設定します。
更新がすべて終わったら、更新用一覧に遷移します。
遷移先アプリは今カスタマイズをしているkintoneアプリ、一覧の名前は「更新用一覧」で、タブは「同じタブで開く」と指定します。
アクション番号12の更新処理が終わってから遷移したいので、「他のアクションの実行が完了した時」で12を指定しました。
以上でカスタマイズは完了です。
「kintoneアプリへ登録」し、一覧画面上部に表示されたボタンを押すと、2度目、3度目でも一括更新が実行されます。
ご不明点等ございましたら、チャットにてご質問ください!
Customineドキュメントやサポートページもぜひご活用ください。