見積書自動採番(毎年6月に、-00001から開始)

簡単な事で申し訳ございませんが、文字列に「年度」を設けて、デフォルトで「年度」を入れて、その文字を足して、見積番号(自動採番)をしようと思っています。

サイボウズで提供していたプログラムを変更して試していますが、どうも上手く行きません。

-01-01 で指定すると正しく採番するのですが、-06-01 で指定すると同じ番号を取得してしまいます。 誰か手助けを頂けると幸いです。

コードは次の通りです。

(() => {
  ‘use strict’;

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

    // 日付を取得し、2桁の年を取得する
    const dt = record[‘見積日付’].value;
    const nt = record[‘年度’].value;
    const dtyy = dt.substring(0, 4);
    const dtmin = ${dtyy}-06-01;
    const dtmax = ${(parseInt(dtyy, 10) + 1)}-06-01;

    // クエリ文の設定
    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(3), 10) + 1;
        autono = 00000${autono};
        autono = ${nt}-${autono.substring(autono.length - 5)};
        event.record[‘自動採番’].value = autono;

        // 対象レコードがなかった場合
      } else {
        event.record[‘自動採番’].value = ${nt}-00001;
      }
      return event;
    }).catch((e) => {
      alert(レコードの取得でエラーが発生しました &nbsp;- 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;
    record[‘年度’].disabled = true;
    return event;
  });

})();

mutoさん
同じような質問がきてるなぁと思って確認したら、前回の質問消されてますよね。
以下のような注意も運営から出ているので、質問は消されないほうが良いと思いますよ。
https://cybozudev.zendesk.com/hc/ja/community/posts/11572400715289

さて、

「正しく採番」という状態と「同じ番号を取得」という状態について、
分かりやすく図にしたりすると回答もつきやすいのでは。と思います。

下の部分1行1行の間にconsole.log(autono);挟んで確認してみるとかどうでしょう。インデント雑ですみませんが。
(return eventすると保存されて画面が切り替わるので debugger;いれるとかreturn false で更新させないようにするとかして)

        let autono = rec['自動採番'].value;
console.log(autono);
        autono = parseInt(autono.substring(3), 10) + 1;
console.log(autono);
        autono = `00000${autono}`;
console.log(autono);
        autono = `${nt}-${autono.substring(autono.length - 5)}`;
console.log(autono);
        event.record['自動採番'].value = autono;
console.log(autono);

substring(3)って頭から4文字目以降を取ってくるので最初の方の桁は捨てちゃっていい感じですかね?
(そういう情報も質問内容からは読み取れないので、詳しく書いておくことをおすすめしたい)

らいとさん

ご回答ありがとうございます。

前回の質問に足そうか、新規にしようかと迷いましたが、消してしまいました。

失礼いたしましたm(_ _)m

質問が雑ですいません、自動採番する際に、一旦、最初の3文字は捨てて、

autono = ${nt}-${autono.substring(autono.length - 5)}; 採番するイメージでしたが、間違っていましたか・・・

やはり、同じ番号を取って来てしまうので、根本的に何かが違うんでしょうか

const dtmin = ${dtyy}-06-01;
const dtmax = ${(parseInt(dtyy, 10) + 1)}-06-01;

-06-01を1月1日(-01-01)にすると上手く行くんですが、6月1日や4月1日にすると同じ番号のみ取得してしまいます。

試しで行っている画面です。

> 質問が雑ですいません、自動採番する際に、一旦、最初の3文字は捨てて、

年度が2桁でハイフンがあるから最初の3文字いらないってことですかね。
こういうところで質問するときはしっかり頭を整理してからですよ。

> -06-01を1月1日(-01-01)にすると上手く行くんですが、6月1日や4月1日にすると同じ番号のみ取得してしまいます。

「同じ」とは!?伝わらないので、以下2点を表にまとめて質問してほしいです。
(1)01-01のとき、06-01のとき、04-01のとき、それぞれの、GETしてきたrec[‘自動採番’].value
(2)それぞれの場合の「autono = ${nt}-${autono.substring(autono.length - 5)};」の結果

これらをコンソール上でデバッグして見たら原因がわかりそうな気がしますけど。デバッグ、やりました?
やり方がわからない場合は
以下のページなどでデバッグのやり方を調べてください。

https://cybozudev.zendesk.com/hc/ja/articles/207613916

 

また、変数autonoを使いまわして済まそうとしているので読みにくいですし、
初心者であられるなら、一つ一つ変数を用意して入れていったほうが間違いにくいかもしれませんよ。
変数名雑ですが以下のような感じにしといたほうがデバッグしやすいかと。(個人的にはですが)

      const autono1 = rec['自動採番'].value;
      const autono2 = parseInt(autono1.substring(3), 10) + 1;
      const autono3 = `00000${autono2}`;
      const autono4 = `${nt}-${autono3.substring(autono3.length - 5)}`;

らいとさん

私の質問が分かりずらくすいません。

これ以上、質問内容が分からずで、元々、https://cybozudev.zendesk.com/hc/ja/articles/201235480-%E5%B9%B4%E6%AC%A1%E3%81%94%E3%81%A8%E3%81%AE%E8%87%AA%E5%8B%95%E6%8E%A1%E7%95%AA%E3%82%92%E8%A1%8C%E3%81%86%E3%83%AF%E3%82%B6?_ga=2.202848984.817489556.1684123397-696949062.1676435743

こちらのコードを使い、始まりが、1月からであれば下記の通り、何もせず上手く行きます。

社内で要求がり、私が考えていたのは「年度」の文字列1行を設けてそのまま変数(nt)に代入して、後方の5桁の自動採番を行うことを考えていました。

上手く表現出来ないので、少し悩んで頑張ってみます:sweat_drops:

 

こちらの1月1日始まり採番を00001から始めるコードを6月1日から始めるにすると、同じ番号しか取れなく(73-0001)、ちょっと根本的なことかも知れませんでの確認してみます

言葉足りずで恐縮です。

mutoさん

何がおっしゃりたいのかがよく分からず、
6/1(や、4/1)に設定すると、6/1以降のレコードを何件作っても
全部73-0001になるということでしょうか?

06-01に設定した場合の間違っているレコード一覧を2つ前のコメントのように貼り付けてみてください。

はい、そうです。

6/1・4/1に設定すると、全てが、73-0001になると言う意味です。

でも、6月から更新したら直ってました:thinking: 単純なミスかも知れません。

// 日付を取得し、2桁の年を取得する
    const dt = record['見積日付'].value;
    const nt = record['年度'].value;
    const dtyy = dt.substring(0, 4);
    const dtmin = `${dtyy}-06-01`;
    const dtmax = `${(parseInt(dtyy, 10) + 1)}-06-01`;

 

muto さん

なるほど、あるあるですねこれ。

この状態で2023年5月28日の見積日時のレコードを追加してレコード番号121のレコードを作ったら

73-00004

ができそうです。

 

ヒントは以下の部分です。(1)と(2)について考えてみてください。

(1)たとえば見積日付が2023-05-31のとき、年度は73と手入力するかもしれませんが、
クエリではどの日付とどの日付の間を集計してますか?そのなかに「2023-05-31」は含まれますか?
(2)見積日付が2023-06-01のとき、どの日付と日付の間を集計していますか?その中に「2023-06-01」は含まれますか?

どう直せば良いかも考えてみてください。

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

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

 

 

らいとさん。

引き続きコメントありがとうございます。感謝です。

ほんとです。(;^_^A 2023-05-31だと2023-06-01ですよね。1月1日になったら -1しないと一生成立しない。

ちょっと if文も含め、考えてみます。出来るか分かりませんが、これも経験でしょうか

らいとさんのヒントを基に変えてみました。

なんとなく出来た気がします。どうでしょうか?

ここまで来ると年度まで自動でやりたくなります(;^_^Aね

(() => {
  ‘use strict’;

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

    // 日付を取得し、2桁の年を取得する
    const dt = record[‘見積日付’].value;
    const nt = record[‘年度’].value;
    const dtyy = dt.substring(0, 4);
    let dtmin = ${dtyy}-06-01;
    let dtmax = ${(parseInt(dtyy, 10) + 1)}-06-01;
    
    if (dt.substring(5) < “06-01”) {
      dtmin = ${(parseInt(dtyy, 10) - 1)}-06-01;
      dtmax = ${dtyy}-06-01;
    }
    
    // クエリ文の設定
    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(3), 10) + 1;
        autono = 00000${autono};
        autono = ${nt}-${autono.substring(autono.length - 5)};
        event.record[‘自動採番’].value = autono;

        // 対象レコードがなかった場合
      } else {
        event.record[‘自動採番’].value = ${nt}-00001;
      }
      return event;
    }).catch((e) => {
      alert(レコードの取得でエラーが発生しました &nbsp;- 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;
    record[‘年度’].disabled = true;
    return event;
  });

})();

muto さん

すごい!できていますね!
ヒントを元に考えてくださりありがとうございます。

> ここまで来ると年度まで自動でやりたくなります(;^_^Aね

西暦何年が年度としては何年なのかを計算式にできれば、同様のやり方で計算できると思いますよ。
完成したらぜひ自慢しに書き込みに来てもらえたらと思います。

応援しております!

らいとさんありがとうございます。

的確なアドバイスに感謝です!

早速、追記してみたところ出来てしまいました:clap:

// 日付を取得し、2桁の年を取得する
    const dt = record['見積日付'].value;
    const dtyy = dt.substring(0, 4);
    let nt = `${(parseInt(dtyy, 10) - 1949)}`;
    let dtmin = `${dtyy}-06-01`;
    let dtmax = `${(parseInt(dtyy, 10) + 1)}-06-01`;
    
    if (dt.substring(5) < "06-01") {
      dtmin = `${(parseInt(dtyy, 10) - 1)}-06-01`;
      dtmax = `${dtyy}-06-01`;
      nt = `${(parseInt(nt, 10) - 1)}`;
    }

muto さん

出来てしまったのですね:clap:
めちゃめちゃ素晴らしいです!!

私は、なにもしてないですよ、mutoさんの試行錯誤のたまものです!!。
これからもkintoneカスタマイズ楽しまれてくださいね^^!

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