複数のフィールドの中で一番新しい番号で自動採番したい

背景・実現したいこと

下記のURLを参考に、自動採番ボタンを押したら採番されるというコードを作成しました。

しかし、追加の機能が必要でどのように実装すれば良いのかわかりません。

会社で使用する関係上、現在完成しているコードを載せることができないので、文字のみの説明になります。わかりにくくてすみません。

どなたかお手数ですが回答頂けるととても助かります。

 

前提

・複数個の自動採番された番号が入るフィールドとその隣に自動採番ボタンがあるレコード

・自動採番された番号が入るフィールドの隣の自動裁判ボタンを押すと自動採番される仕組みになっている

・下記のURLのように年次で0001に戻る

・番号が重複してはいけない

・ボタンとフィールドを結ぶ方法はわかる(隣のボタンが押されたらここのフィールドに値を入れてね、というのを2次関数で記載する予定)

 

疑問点

・編集しているレコード内で複数個の自動採番された番号のうち、一番新しい番号を取る方法がわからない

・1レコードに複数の自動採番される番号が存在するため、編集しているレコードでないレコードで自動採番された番号の一番新しいものを取得しなければならないがその方法がわからない

 

 

利用したソースコード

年次ごとの自動採番を行うワザ

【kintone】ボタンをクリックしてフィールドの値を書き換えてみよう!

①編集しているレコード内で複数個の自動採番された番号のうち、一番新しい番号を取るクエリの書き方がわからない

現在開いているレコードの複数ある自動採番フィールド同士で比較ということでしょうか?クエリ(REST API)は必要なく、簡単なのはsort()を使う方法でしょう。
sort()は配列にしか使えないので「複数ある自動採番フィールドの値を配列に格納」→「配列のsort()」→「配列の0番目(または最終インデックス)を取り出し」で可能かと思います。

sort()の使い方はこちらが参考になるかと思います。

 

②1レコードに複数の自動採番される番号が存在するため、編集しているレコードでないレコードで自動採番された番号の一番新しいものを取得しなければならないがその方法がわからない

サンプルコードで

    // クエリ文の設定
    const query = {
      'app': kintone.app.getId(),
      'query': `日付 >= "${dtmin}" and 日付 < "${dtmax}" order by 自動採番 desc limit 1`
    };

となっている部分ですが、このクエリ文の「order by 自動採番 desc limit 1」という部分が「自動採番フィールドの値の降順(order by 自動採番 desc)で、1レコードのみ取得(limit 1)」となっているので、こちらを書き換えれば良いかと思います。またはレコードを全部取得してからsort()でも良いですが、全てのレコードを取得するには通常のREST APIだと上限があるので@kintone/rest-api-client等を使うのが良いでしょう。

クエリのオプションについてはクエリの書き方をご覧下さい。

385013133091 様

ご回答有難うございます。

①の内容に関してはとても参考になります。IFで分岐を行い1番目の自動採番フィールド以外をsort()処理で自動採番を行うイメージでコードを書いてみようと思います。

しかし、下記のように(まだコードは完成形ではありません)なった場合、まだ自動採番4フィールド以降が空欄の場合にsortしたらundefinedが入ってしまうと思ったのですが、そんなことないですか?

JSをあまりしっかり触ったことがないので、私の知識不足だったらごめんなさい。

constautoNum=["自動採番1","自動採番2","自動採番3", "自動採番4","自動採番5"];  
sort処理  
console.log(autoNum); //結果: undefined undefined 2300003 2300002 2300001  
slice処理でインデックス0を取得  
console.log(autoNum);      //結果: undefined 

 

②に関しては「自動採番フィールドの値の降順(order by 自動採番 desc)で、1レコードのみ取得(limit 1)」でレコードを1つ取得して、その中の複数の自動採番フィールドの中から数字の一番大きいものを取得するのが手っ取り早いかなと思っていたのですが、その場合どのようにクエリを書くべきなのかわからないという内容になります。

例えば自動採番1と自動採番2と自動採番3という名前をそれぞれ持つフィールドがあるレコードの場合、

'query': `日付 \>= "${dtmin}" and 日付 \< "${dtmax}" order by 自動採番1 desc limit 1`

で自動採番1で数字が一番大きいレコードを取得している状態になると思います。

このレコードの中の自動採番2と自動採番3というフィールドの値を取ってくることができれば、先ほどのようにsortでそのレコード内の一番大きい数字を取得できるのではないかと思っていました。

でもそれはなんか書けそうな気がします。。。ちょっと試してみます!

またご連絡させてください。

yaji さま

フィールドが空白の場合を失念しておりました。申し訳ありません。

その場合は「あらかじめ空の配列を宣言し、if文で1つずつ値がある場合は配列にpush」という処理にするか、filter()を使うのが良いかと思います。

const autoNum = ["自動採番1", "自動採番2", "自動採番3", "自動採番4", "自動採番5"].filter(field => event.record[field].value).sort((a, b) => /* 略 */);

385013133091 様

ご連絡有難うございます。

filterで対応できるんですね、試してみます!

 

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。