@hamux1192

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

(kintone)changeeventの重複について

解決したいこと

依頼元コードコピーフィールドチェンジ(通常フィールド)
⇒商品コードコピーフィールドチェンジ(サブテーブルフィールド)
で操作を進めると、依頼元コードチェンジから数秒待たないと商品コードチェンジイベント内の処理で容器マスタ・特殊マスタから値を取ってこれないです。
どなたか助けてほしいです。

該当するソースコード

//15_特殊率取得・容器取得

(function () {
  ("use strict");

  // フィールドコード
  let customerCopyFieldCode = "依頼元コピー";
  let itemCopyFieldCode = "商品コードコピー";
  let deliveryDateFieldCode = "納品予定日";
  let tableFieldCode = "テーブル";
  let orderQuantityFieldCode = "数量";
  let specialRateFieldCode = "特殊掛け率";

  // アプリID
  const currentapp = kintone.app.getId();
  let specialRateMasterAppID = currentapp === 265 ? 261 : 50;
  let containerMasterAppID = currentapp === 265 ? 257 : 46;
  let specialRateOptionFieldCode = "特殊掛け率設定";
  let containerQuantityFieldCode = "数量";

  // 全レコードを保持する変数
  let allSpecialRateRecords = [];
  let allContainerRecords = [];
  // 前回の値を保持するためのオブジェクト
  let previousItemCodeMap = {};

  // Kintone REST API Client
  const client = new KintoneRestAPIClient();

  // 特殊掛け率マスタの中から該当するレコードを検索する関数
  function searchSpecialRateRecord(
    customerCode,
    itemCode,
    deliveryDate,
    allSpecialRateRecords
  ) {
    for (let j = 0; j < allSpecialRateRecords.length; j++) {
      let masterRecord = allSpecialRateRecords[j];
      let masterCustomerCode = masterRecord["依頼元コード"].value;
      let masterItemCode = masterRecord["商品コード"].value;
      let startDate = masterRecord["適用開始日"].value;
      let endDate = masterRecord["適用終了日"].value;

      if (
        customerCode === masterCustomerCode &&
        itemCode === masterItemCode &&
        startDate &&
        endDate &&
        deliveryDate
      ) {
        if (startDate <= deliveryDate && endDate >= deliveryDate) {
          return masterRecord[specialRateOptionFieldCode].value;
        }
      }
    }
    return null;
  }

  // 容器持ち出しマスタの中から該当するレコードを検索する関数
  function searchContainerRecord(
    customerCode,
    itemCode,
    deliveryDate,
    allContainerRecords
  ) {
    for (let k = 0; k < allContainerRecords.length; k++) {
      let containerMasterRecord = allContainerRecords[k];
      let containerMasterCustomerCode =
        containerMasterRecord["依頼元コード"].value;
      let containerMasterItemCode = containerMasterRecord["商品コード"].value;
      let containerStartDate = containerMasterRecord["適用開始日"].value;
      let containerEndDate = containerMasterRecord["適用終了日"].value;

      if (
        customerCode === containerMasterCustomerCode &&
        itemCode === containerMasterItemCode &&
        deliveryDate &&
        containerStartDate &&
        containerEndDate
      ) {
        if (
          containerStartDate <= deliveryDate &&
          containerEndDate >= deliveryDate
        ) {
          return containerMasterRecord[containerQuantityFieldCode].value;
        }
      }
    }
    return null;
  }

  // 特殊掛け率をセットする関数
  function setValue(record, index, specialRateValue) {
    if (specialRateValue !== null) {
      // 受注管理アプリの特殊掛け率フィールドに特殊掛け率の値をセット
      record[tableFieldCode].value[index].value[specialRateFieldCode].value =
        specialRateValue;
    } else {
      // 該当レコードが見つからなかった場合、特殊掛け率フィールドの値をクリア
      record[tableFieldCode].value[index].value[specialRateFieldCode].value =
        null;
    }
  }

  function setQuantityValue(record, index, quantityValue) {
    // 基本条件判定用フラグ
    const hasMatchingData = quantityValue !== null;

    // 合致データなし
    if (!hasMatchingData) return;

    // 合致データあり
    if (hasMatchingData) {
      record[tableFieldCode].value[index].value[orderQuantityFieldCode].value =
        quantityValue;
    }
  }

  // 依頼元コピー・物品コードコピー・納品予定日からレコードを検索し、特殊掛け率と数量をセットする関数
  function processTableRecord(
    record,
    index,
    currentItemCode,
    allSpecialRateRecords,
    allContainerRecords,
    onlySetQuantityValue
  ) {
    // 依頼元コピー・物品コードコピー・納品予定日を取得
    let customerCode = record[customerCopyFieldCode].value;
    let itemCode = currentItemCode;
    let deliveryDate = record[deliveryDateFieldCode].value;

    // 特殊掛け率マスタの中から該当するレコードを検索
    let specialRateValue = searchSpecialRateRecord(
      customerCode,
      itemCode,
      deliveryDate,
      allSpecialRateRecords
    );

    // 容器持ち出しマスタの中から該当するレコードを検索
    let quantityValue = searchContainerRecord(
      customerCode,
      itemCode,
      deliveryDate,
      allContainerRecords
    );

    setValue(record, index, specialRateValue);

    setQuantityValue(record, index, quantityValue);
  }

  // テーブルの変更イベントのトリガー(依頼元コードか納品予定日が変更された場合)
  kintone.events.on(
    [
      "app.record.edit.change." + customerCopyFieldCode,
      "app.record.create.change." + customerCopyFieldCode,
      //2回目以降、注文情報の数量が置き換わってしまうため、コメントアウト 2024.9.12(西松)
      //"app.record.edit.change." + deliveryDateFieldCode,
      //"app.record.create.change." + deliveryDateFieldCode,
    ],
    function (event) {
      //↓このように即時関数で実行すればエラーになりません。
      (async () => {
        //特殊掛け率マスタ~
        // const customerCode = event.record[customerCopyFieldCode].value;
        //const specialRatequery = `依頼元コード = ${customerCode}`;
        //allSpecialRateRecords = [];
        allSpecialRateRecords = await client.record.getAllRecords({
          app: specialRateMasterAppID,
          //condition: specialRatequery,
        });
        console.log(allSpecialRateRecords);
      })();

      //↓このように即時関数で実行すればエラーになりません。
      (async () => {
        //容器持ち出しマスタ~
        // const customerCode = event.record[customerCopyFieldCode].value;
        //const specialRatequery = `依頼元コード = ${customerCode}`;
        //allContainerRecords = [];
        allContainerRecords = await client.record.getAllRecords({
          app: containerMasterAppID,
          //condition: specialRatequery,
        });
        console.log(allContainerRecords);
      })();
      // サブテーブル内の各行に対して処理を実行
      for (let i = 0; i < event.record[tableFieldCode].value.length; i++) {
        // 物品コードコピーを取得
        let currentItemCode =
          event.record[tableFieldCode].value[i].value[itemCopyFieldCode].value;

        // 依頼元コピー・物品コードコピー・納品予定日からレコードを検索し、特殊掛け率と数量をセット
        processTableRecord(
          event.record,
          i,
          currentItemCode,
          allSpecialRateRecords,
          allContainerRecords
        );
      }

      // レコードを返却
      return event;
    }
  );

  // テーブルの変更イベントのトリガー(商品コードが変更された場合)
  kintone.events.on(
    [
      "app.record.edit.change." + itemCopyFieldCode,
      "app.record.create.change." + itemCopyFieldCode,
    ],
    function (event) {
      // サブテーブル内の物品コードが変化した行に対して処理を実行
      let tableFieldValue = event.record[tableFieldCode].value || []; // テーブルが存在しない場合は空の配列を使用
      for (let i = 0; i < tableFieldValue.length; i++) {
        // 前回の値を取得
        let previousItemCode = previousItemCodeMap[i];
        // 現在の値を取得
        let currentItemCode = tableFieldValue[i].value[itemCopyFieldCode].value;

        // 物品コードコピーが変更されたかをチェック
        if (previousItemCode !== currentItemCode) {
          // console.log('物品コードコピーが変更されました。行: ' + (i + 1)); //デバッグ用の行なので削除しても問題ない
          // 以前の値を更新
          previousItemCodeMap[i] = currentItemCode;

          processTableRecord(
            event.record,
            i,
            currentItemCode,
            allSpecialRateRecords,
            allContainerRecords
            //true
          );
        }
      }

      return event;
    }
  );
})();

0 likes

No Answers yet.

Your answer might help someone💌