一覧表示した複数レコードへ採番し、別アプリへPOSTしたい

いつもお世話になっております。

似たような質問があるかもしれませんが、試行錯誤した結果解決できずご相談させていただきます。

発注伝票アプリで一覧表示した複数レコードに、一括登録ボタンで、仕入伝票アプリの

仕入Noの最終値を取得、採番し、仕入伝票アプリへ新規登録(POST)したいと思っております。

・コードは仕入Noを固定値として登録は成功しています。

・仕入Noの最終値は取得出来ています。採番方法が分かりません。

・仕入Noの最終値が"S-2022-0005"だとしたら、"S-2022-0006"から採番します。

・つなぎ合わせでエラーが2か所になってしまっています。。。

ご教示願えればと思います。

(() => {

  'use strict';

  //レコード一覧画面表示後イベント

  kintone.events.on('app.record.index.show', (event) => {

    const records = event.records;

    // ヘッダースペース要素の取得

    const headerSpace = kintone.app.getHeaderMenuSpaceElement();

    // ボタン要素の作成

    const button = document.createElement("input");

    button.value = "一括登録";

    button.type = "button";

    // ボタンがクリックされた時の処理

    const submit = function(){

    const recRecords = [];

    const postRecords = [];

    const url = kintone.api.url('/k/v1/records.json', true)

      const query = {

        "app": 73,

        "query": 'order by 仕入No desc limit 1'

      };

      return kintone.api(url, 'GET', query).then(function(resp) {

        //ここに連番処理

        const sNum = resp.records[0].仕入No.value; //S-2022-0001

        const num = parseInt(sNum.substring(7), 10) + 1; //1

        //const num2 = ( '0000' + num ).slice( -4 ); //仕入No 0埋め

        //const autoNo = "S-2022-" + num2; //仕入Noフォーマット

        for (let i = 0; i < records.length; i++) {

          console.log(num);

        }

        // 取得したレコード分ループ

        records.forEach(function(eachRecord) {

          let subTable = eachRecord.発注詳細.value;

          // サブテーブル分ループ

          subTable.forEach(function(eachRow) {

                                           

            let tableA = eachRow.value.商品名.value;

            let tableB = eachRow.value.数量.value;

            let tableC = eachRow.value.単位.value;

            let tableD = eachRow.value.単価.value;

            let tableE = eachRow.value.摘要.value;

            recRecords.push({

              "value": {

                "商品名": { "value": tableA },

                "数量": { "value": tableB },

                "単位": { "value": tableC },

                "単価": { "value": tableD },

                "摘要": { "value": tableE }

              }

            });

          })

          postRecords.push({

            "仕入先": {value: eachRecord.発注先.value},

            "仕入日": {value: eachRecord.発注日.value},

            "仕入No": {value: "S-2022-0008"}, //ここを連番にしたい

            "発注No": {value: eachRecord.発注No.value},

            "担当者": {value: eachRecord.担当者.value},

            "仕入詳細": {value: recRecords},

            "工番": {value: eachRecord.工番.value},

            "科目名": {value: eachRecord.科目名.value}

          });

        });

        const postParams = {

          app: 73,

          records: postRecords

        };

         

        console.log(postParams);

        kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', postParams, (resp) => {

          // success

          console.log(resp);

          }, (error) => {

          // error

          console.log(error);  

        });




      }).catch(function(e) {

        alert("エラーが発生しました - error: " + e.message);

        console.log(e);

        return false;

        });

    };

    // ボタンをヘッダースペースに追加

    headerSpace.appendChild(button);

    // ボタンのクリックイベントに処理を登録

    button.onclick = submit;

  });

})();

採番の方法は問題ないように見えますが、レコード一覧のループで採番を加算していきたいということでしょうか?

        return kintone.api(url, 'GET', query).then(function(resp) {
        let splitNumber = resp.records[0]['仕入No'].value.split('-'); // => ['S', '2022', '0001']
        let serialNumber = Number(splitNumber[2]); // => 1

          // 取得したレコード分ループ
            records.forEach(function(eachRecord) {
            serialNumber++; // => 2,3,4 ...

          let newSerialNumber = ['S', '2022', ('000' + serialNumber).slice(-4)].join('-'); //  => S-2022-0002,S-2022-0003,S-2022-0004...

以上のような形で可能かと思います。

 

一つ気になったのですが、

      const submit = function(){
        const recRecords = [];

recRecordsには追加する各レコードのサブテーブルの値が入るようですが、その場合宣言するのは

          // 取得したレコード分ループ
            records.forEach(function(eachRecord) {
             const recRecords = [];

こちらのループ内ではないかと思います。

mls-hashimoto様

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

const serialNumber → let serialNumber で良さそうですか?

無事に実装出来ました!

“split”、“Number” 等、初めて使用しました。まだまだ学ぶべきことがありそうです。

"recRecords"の部分のご指摘もありがとうございます。

なるほど!ここが正しい場所なのですね。

貴重なお時間ありがとうございました。

渡邉祐子 さま

失礼しました。加算していくのにconstで宣言していましたね。ご指摘ありがとうございます。

以下は不要な処理かもしれませんが、仕入Noにある「2022」が現在年で、年毎に末尾の数字をリセットする必要がある場合、来年以降にカスタマイズし直すことになるかと思いますので、その場合は

        return kintone.api(url, 'GET', query).then(function(resp) {
          let splitNumber = resp.records[0]['仕入No'].value.split('-'); // => ['S', '2022', '0001']

          if (Number(splitNumber[1]) != new Date().getFullYear()) splitNumber[2] = 0; // => 年が違う場合数字を0に変更

          let serialNumber = Number(splitNumber[2]); // => 1

          // 取得したレコード分ループ
            records.forEach(function(eachRecord) {
            serialNumber++; // => 2

            const newSerialNumber = ['S', new Date().getFullYear(), ('000' + serialNumber).slice(-4)].join('-'); //  => S-2022-0002

こんな感じで実装できるかと思います。

mls-hashimoto様

先の課題まで、アドバイスありがとうございます!!

大変勉強になります!

ど素人が一人で作っておりまして、こちらのアドバイスのおかげで、なんとか進めることが出来ます。

感謝いたします。