コンテンツにスキップ

apiModel.Update

概要

既存レコードを更新します。

構文

apiModel.Update()

戻り値

レコードを更新できたらtrue、更新できなかったらfalseを返却します。

使用例

下記の例では、レコードIDが 123 のレコード情報を取得し、状況項目を 完了(900) に更新します。

JavaScript
let records = items.Get(123);
if (records.Length === 1) {
    let record = records[0];
    record.Status = 900;
    record.Update();
}

サンプルコード

コード内の【 ... 】 は適宜修正してください。
1. 任意の条件でレコードを取得し一括で任意の項目を更新する

状況が’100’のレコードを取得し、'200'に更新する。

コードの途中で return を使っているため、サーバスクリプトの「関数化」を有効にしてください。

JavaScript
// 状況が未着手(100)のデータを抽出対象とする
const targetStatus = '100';
// 実施中(200)に更新する
const updateStatus = '200';
// 処理対象のサイト名を指定
const siteName = '【サイト名】';
// サイト情報を取得
const site = items.GetClosestSite(siteName);
if (!site) {
    logs.LogInfo(`${siteName} サイト情報取得失敗`);
    return false;
}
const data = {
    View: {
        ColumnFilterHash: {
            Status: `[\"${targetStatus}\"]`,
        },
    },
};
const results = Array.from(items.Get(site.SiteId, JSON.stringify(data)));
// 抽出した結果に対し状況を更新
for (const item of results) {
    item.Status = updateStatus;
    const result = item.Update();
    if (result) {
        logs.LogInfo(`更新成功:Id=${item.ResultId}`);
    } else {
        logs.LogUserError(`更新失敗:Id=${item.ResultId}`);
    }
}
実行結果
(Info):更新成功:Id=9001
(Info):更新成功:Id=9002
2. 作業明細がすべて完了になったら、親の案件を完了にする

作業明細を完了にして更新したとき、同じ案件にリンクしている明細がすべて完了であれば、親の案件の状況を完了に更新します。items.Getで取得した親の案件の状況を変え、apiModel.Updateで保存します。

実務での使いどころ

案件・工事・受注を作業明細に分けて進めるとき、最後の明細が終わったのに案件が「実施中」のまま残る漏れを防げます。サマリで未完了の明細の件数は親に入れられますが、サマリが書き込めるのは数値項目のため、案件の状況は自動では変わりません。

事前準備

1:「案件」テーブル(期限付きテーブル)と、「作業明細」テーブル(期限付きテーブル)を用意してください。

2:「作業明細」テーブルで、以下の項目を有効化してください。

項目コード 内容
分類A(ClassA) 案件。選択肢一覧に[[「案件」テーブルのサイトID]]を設定し、リンクにする

3:「作業明細」テーブルにスクリプトを登録します。

3-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 3-2:タイトル: 任意の名前(例:completeParentWhenAllDone)
 3-3:スクリプト: 下記サンプルコードを貼り付け
 3-4:条件: 「更新後」にチェック

JavaScript

条件:更新後

// 親の案件にリンクする分類項目(選択肢一覧に [[案件のサイトID]] を設定)
const PARENT_COLUMN = 'ClassA';
// 「完了」の状況の値
const COMPLETED_STATUS = 900;

// 作業明細を完了にしたとき、同じ案件の明細がすべて完了なら、親の案件も完了にする
function completeParentWhenAllDone() {
    if (Number(model.Status) !== COMPLETED_STATUS) {
        return;
    }
    const parentId = Number(model[PARENT_COLUMN]);
    if (!parentId) {
        return;
    }

    // 同じ案件にリンクしている明細を取得し、完了でないものが残っていないか確かめる
    const filter = {};
    filter[PARENT_COLUMN] = JSON.stringify([String(parentId)]);
    const view = { View: { ColumnFilterHash: filter } };
    const details = Array.from(items.Get(context.SiteId, JSON.stringify(view)));
    if (details.some(detail => Number(detail.Status) !== COMPLETED_STATUS)) {
        return;
    }

    const parents = items.Get(parentId);
    if (parents.Length !== 1) {
        logs.LogUserError(`親の案件が見つかりません:Id=${parentId}`);
        return;
    }
    const parent = parents[0];
    if (Number(parent.Status) === COMPLETED_STATUS) {
        return;
    }
    parent.Status = COMPLETED_STATUS;
    if (parent.Update()) {
        logs.LogInfo(`明細がすべて完了したため、案件を完了にしました:Id=${parentId}`);
    } else {
        logs.LogUserError(`案件を完了にできませんでした:Id=${parentId}`);
    }
}

completeParentWhenAllDone();

注記

  • 明細を完了以外に戻しても、案件の状況は元に戻りません。
  • 「案件」テーブルにも「更新前」「更新後」のサーバスクリプトがあれば、apiModel.Updateで案件を更新したときに実行されます。

注意事項

こちらはサーバスクリプトで使用するメソッドです。スクリプトでは使用できません。

関連情報