採番を月ごとにリセットしたいです

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

上記URLを見て、年次ではなく、月ごとにリセットする採番を作りたいのですが、うまくいきません。

具体的には、
「取引発生日」の値が「2023-10-09」の時、「自動採番」の値を「202310-0001」、
「取引発生日」の値が「2023-10-10」の時、「自動採番」の値を「202310-0002」、
「取引発生日」の値が「2023-10-11」の時、「自動採番」の値を「202310-0003」…

「取引発生日」の値が「2023-11-01」の時、「自動採番」の値を「202311-0001」、
「取引発生日」の値が「2023-11-05」の時、「自動採番」の値を「202311-0002」、
「取引発生日」の値が「2023-11-08」の時、「自動採番」の値を「202311-0003」…
と採番したいです。

現状、月ごとのリセットが効かず、下記のように連番されます。
「取引発生日」の値が「2023-09-01」の時、「自動採番」の値を「202309-0001」、
「取引発生日」の値が「2023-10-01」の時、「自動採番」の値を「202310-0002」、
「取引発生日」の値が「2023-11-01」の時、「自動採番」の値を「202311-0003」、

また、12月を指定すると、
「レコードの取得でエラーが発生しました - error: フィールド「取引発生日」に指定した2023-13-15の日付書式が不正です。」と出て、保存できません。

よろしくお願いします。

(() => {
  "use strict";

  const autoNum = event => {
    const record = event.record;

    // 日付を取得し、年と月を取得する
    const dt = record["取引発生日"].value;
    const year = dt.substring(0, 4);
    const month = dt.substring(5, 7);
    const day = dt.substring(8, 10);
    const dtyyMM = `${year}${month}`;
    const dtyy = dt.substring(0, 4);
    const dtyyMMdd = `${year}${month}${day}`;

    const dtmin = `${dtyy}-01-01`;
    const dtmax = `${year}-${parseInt(month, 10) + 1}-${day}`;

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

    // 設定された日付から最新の番号を取得する
    return kintone
      .api(kintone.api.url("/k/v1/records", true), "GET", query)
      .then(resp => {
        const records = resp.records;

        // 対象レコードがあった場合
        if (records.length > 0) {
          const rec = records[0];
          let autono = rec["自動採番"].value;
          autono = parseInt(autono.substring(7), 10) + 1;
          autono = `0000${autono}`;
          autono = `${dtyyMM}-${autono.substring(autono.length - 4)}`;
          event.record["自動採番"].value = autono;

          // 対象レコードがなかった場合
        } else {
          event.record["自動採番"].value = `${dtyyMM}-0001`;
        }
        return event;
      })
      .catch(e => {
        alert(`レコードの取得でエラーが発生しました  - error: ${e.message}`);
        return false;
      });
  };

  // 新規作成画面の保存
  kintone.events.on("app.record.create.submit", autoNum);

  // 新規作成画面表示
  kintone.events.on("app.record.create.show", event => {
    const record = event.record;
    // フィールドを非活性にする
    record["自動採番"].disabled = true;
    return event;
  });

  // 編集画面表示
  kintone.events.on(["app.record.edit.show", "app.record.index.edit.show"], event => {
    const record = event.record;
    // フィールドを非活性にする
    record["自動採番"].disabled = true;
    record["取引発生日"].disabled = true;
    return event;
  });
})();

@silvenia さん

こんにちは、こちらはデバッグしてどこでどのようになってるか確認されましたでしょうか?
聞かれていることが前後しますが、まず

12月を指定すると、
「レコードの取得でエラーが発生しました - error: フィールド「取引発生日」に指定した2023-13-15の日付書式が不正です。」と出て、保存できません。

に関しましては、恐らく

const dt = record["取引発生日"].value;
const month = dt.substring(5, 7);
const dtmax = `${year}-${parseInt(month, 10) + 1}-${day}`;

としてて、一ヶ月進んだ値のままreturn event;しようとしているかと思いました。
return前のeventのrecord["取引発生日"].value;はどうなってますか?


上記URLを見て、年次ではなく、月ごとにリセットする採番を作りたいのですが、うまくいきません。

REST APIに指定したquery:がうまく指定できてないかもですね。
query:で指定してる "${dtmin}""${dtmax}" のダブルクォーテーションがないんじゃないかなと思った次第です。


それぞれパッと見た推測なので、詳しくはデバッグしてみてなぜそうなるのか確認してみてくださいね!

Yuki_Minamitaniさま

ご回答ありがとうございます。
デバッグのやり方がわかりません…
(「return前のeventのrecord[“取引発生日”].value;」もどうやって見るのかわかりません)

コンソール画面では「“フィールド「取引発生日」に指定した2023-13-13の日付書式が不正です。”」と表示されましたが、どうしていいかわからず…

「取引発生日」は、日付フィールドなので、12月を超えた13月というのはできないと思っているのですが、どこをどうすればよいかわからずの状態です。

query:で指定してる "${dtmin}""${dtmax}" のダブルクォーテーションがないんじゃないかなと思った次第です。

ダブルクォーテーションで囲っているつもりなのですが、できていないのでしょうか?

query: 取引発生日 >= "${dtmin}" and 取引発生日 < "${dtmax}" order by 自動採番 desc limit 1

@silvenia さん

デバッグは、下記のリンクにわかりやすくまとめてくださっているのでこちら貼っておきますね!


「取引発生日」は、日付フィールドなので、12月を超えた13月というのはできないと思っているのですが、どこをどうすればよいかわからずの状態です。

恐らく文字列として 2023-13-15 という形を作成されて、それを retrun event;されようとしおてるんじゃないかなと思ってます :sweat_drops:(event変数をreturn するとevent変数の内容が反映されて、内容に不備があると記載のエラーになるため)


ダブルクォーテーションで囲っているつもりなのですが、できていないのでしょうか?

ごめんなさい、こちらのタイプミスです :sweat_drops:
正しくは、 「 query: で指定してる "${dtmin}""${dtmax}" のダブルクォーテーションが “いらない” んじゃないかなと思った次第です。」(いらないと書きたかった次第です…)
テンプレートリテラル(${この形})で "${dtmin}""${dtmax}" で定義されているので、既にクォーテーションが含まれていると考えたためです :sweat_drops:

Yuki_Minamitani さま

お返事、ありがとうございます!

コンソール画面は、12月選択時に下記のように表示されました。12月以外ではエラーメッセージはありませんでした。

{code: “GAIA_ID01”, id: “gWwtDaHVOqgSOX6buc1K”, message: “フィールド「取引発生日」に指定した2023-13-13の日付書式が不正です。”}
code:“GAIA_ID01”
id: “gWwtDaHVOqgSOX6buc1K”
message: “フィールド「取引発生日」に指定した2023-13-13の日付書式が不正です。”

ダブルクオーテーションを取ってみましたところ、コンソール画面のNetworkに下記のエラーメッセージがでました。
‘query’: 取引発生日 >= ${dtmin} and 取引発生日 < ${dtmax} order by 自動採番 desc limit 1

{code: “CB_VA01”, id: “Ew0d9KLsiyki6uwg4Pjm”, message: “入力内容が正しくありません。”,…}
code: “CB_VA01”
errors: {query: {messages: [“クエリ記法が間違っています。”]}}
query: {messages: [“クエリ記法が間違っています。”]}
messages: [“クエリ記法が間違っています。”]
0: “クエリ記法が間違っています。”
id: “Ew0d9KLsiyki6uwg4Pjm”
message: “入力内容が正しくありません。”

@silvenia さん

なるほど、“GAIA_ID01”ということは、REST APIでエラーがでてたんですね :sweat_drops:
return eventでエラーでてると思ってました :sweat_drops:
クエリの記法が間違ってるといわれてるのであれば、ダブルクォーテーション入れてる値が正しいですね!
なんとなく、REST APIで正しい値を取得できていないため常にそのあとのif文でfalseになって月ごとに自動採番されないという形になるかと思いました!

やり方としては、const dtmaxに値を代入する前に if文などで分岐して代入する値を変えたらエラーの解消につながると思いますよ!

//例)
//monthが12以上なら、来年の1月を指定する そうでなければ、プラス1か月先を指定する
if (parseInt(month, 10) >= 12){
    const dtmax = `${parseInt(year, 10) + 1}-01-${day}`;
} else {
    const dtmax = `${year}-${parseInt(month, 10) + 1}-${day}`;
}

こんな感じになるかと思います!
こちら試してなく、こちらで書いただけなので一度試しながら使用してみてください :sweat_drops:

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