新規投稿
フォローする

ルックアップフィールドを複数追加したい

実現したいこと

サンプルコードのままでは追加したルックアップフィールドの情報がレコードに反映されないので
反映されるようにしたい。

追加したいのはProjectCode(案件管理番号)で、itemCode(商品コード)とは別のアプリです。

 

エラー情報

 商品を取得できませんでした

利用したソースコード

https://developer.cybozu.io/hc/ja/articles/115002152143-%E5%AE%89%E5%85%A8%E3%81%AB%E5%9C%A8%E5%BA%AB%E7%AE%A1%E7%90%86%E3%82%92%E8%A1%8C%E3%81%86%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF2-%E3%83%AA%E3%83%93%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E8%A9%A6%E3%81%9D%E3%81%86-

試したこと

太字部分を追加しましたが、正しい記述方法がわかりません。


(function() {
'use strict';

kintone.events.on('app.record.create.submit', function(event) {
var record = event.record;

var pickNum = Number(record.pickNum.value); // 出庫数
var destination = record.destination.value; // 出庫先
var itemCode = record.itemCode.value; // 商品コード
var itemPrice = record.itemPrice.value; // 販売価格
var itemAppId = kintone.app.getLookupTargetAppId('itemCode'); // 商品アプリのアプリID
var projectCode = record.projectCode.value; // 案件管理番号
var projectAppId = kintone.app.getLookupTargetAppId('projectCode'); // 案件管理アプリのアプリID

// kintone JS SDK
var con = new kintoneJSSDK.Connection();
var kintoneRecord = new kintoneJSSDK.Record(con);

// 商品アプリから在庫数を取得
return kintoneRecord
.getRecords(itemAppId, 'itemCode = "' + record.itemCode.value + '"', ['$id', '$revision', 'stockNum'], false)
.then(function(getRes) {
if (getRes.records.length !== 1) {
event.error = '商品が特定できません。';
return event;
}

var stockRecord = getRes.records[0];
var recordId = stockRecord.$id.value;
var recordRevision = stockRecord.$revision.value;
var stockNum = Number(stockRecord.stockNum.value); // 現在の在庫数

var newStockNum = stockNum - pickNum; // 出庫後の在庫数
if (newStockNum < 0) {
event.error = '在庫が足りません。今の在庫数は' + stockNum + 'です。';
return event;
}

// 在庫アプリのアプリID
var warehouseAppId = kintone.app.getId();
// 商品アプリの在庫数を更新し、出庫アプリに出庫情報を登録
var stock = {
stockNum: { value: newStockNum }
};
var warehouse = {
destination: { value: destination },
itemCode: { value: itemCode },
itemPrice : { value: itemPrice },
pickNum: { value: pickNum }
};
var warehouse2 = {
projectCode: { value: projectCode }
};

var warehouseAppId = kintone.app.getId();
var kintoneBulkRequest = new kintoneJSSDK.BulkRequest(con);
var responseBulkRequest = kintoneBulkRequest
.updateRecordByID(itemAppId, recordId, stock, recordRevision)
.addRecord(warehouseAppId, warehouse)
.updateRecordByID(projectAppId, projectCode)
.addRecord(WarehouseAppid, warehouse2)
.execute();

// 実行
return responseBulkRequest
.then(function(postRes) {
// bulkRequestで登録した詳細ページに移動
location.href = '/k/' + warehouseAppId + '/show#record=' + postRes.results[1].id;
// 登録画面のレコードは保存しない
return false;
})
.catch(function(error) {
console.log(error);
event.error = '出庫に失敗しました。';
return event;
});
})
.catch(function(error) {
console.log(error);
event.error = '商品を取得できませんでした。';
return event;
});
});
})();

再現条件

  • 画面・イベント:
  • カスタマイズに関連するフィールド(フィールド種類/フィールド名/フィールドコード):
  • 権限設定:
  • デバイス(PC or モバイル):
  • OS・ブラウザ:
  • IP制限などネットワークに特殊なことがあれば:

 

0

4件のコメント

Avatar
ひよこ

山田 敏紀 さん

こんにちは。ひよこです。

やりたいことについて、もうすこし詳しく教えて下さい。

複数アプリが登場するので、アプリ間の関係を知りたいです。
どういう操作をしたときに、どのアプリにある「商品名」というフィールドをどういう値で更新したいのでしょうか?

なんとなくこんな感じかなとイメージしたのですが、合っていますか?
「出庫アプリにレコードを登録したとき、案件管理アプリにある「商品名」フィールドを出庫した商品名で更新したい」

・在庫アプリ
 ・商品コード
 ・商品名
 ・在庫数

・出庫アプリ
 ・商品コード:ルックアップフィールド(在庫アプリに紐付け)
 ・商品名
 ・案件番号(projectCode):ルックアップフィールド(案件管理アプリに紐付け)
 ・出庫数

・案件管理アプリ(仮)
 案件番号(projectCode)
 商品名 <- ここを出庫管理アプリの「商品名」の値で更新したい?

0
Avatar
山田 敏紀

ひよこさん
コメントありがとうございます。
最終的にやりたいことはもう少し複雑になる予定ですが、今解決したい問題としては

・在庫アプリ
 ・商品コード
 ・商品名
 ・在庫数 :(出庫数だけ減らしたい)

・出庫アプリ
 ・商品コード:ルックアップフィールド(在庫アプリに紐付け)
 ・商品名 :(在庫アプリからコピーしたい)
 ・案件番号(projectCode):ルックアップフィールド(案件管理アプリに紐付け)
 ・出庫数

・案件管理アプリ
 ・案件番号(projectCode)←他に連動したいわけではなく出庫アプリにコピーしたい

サンプルコードのままでは、出庫アプリから案件番号をルックアップしてレコード登録しても空欄で保存されてしまうので
7行目以降と42行目以降のあたりを書き換えればいいのはなんとなくわかっていますが
記述方法がよくわからないので困っています。

ご教示いただければ幸いです。
よろしくお願いいたします。

0
Avatar
ひよこ

山田 敏紀 さん

詳しくありがとうございます。
出庫アプリのレコード追加画面で入力したはずの案件番号が空のまま、レコード登録される…てことでしょうか。
(そもそもレコードも登録されていない気がしますが…)

原因を理解するのは、コードで行っている処理の流れを理解すると良いかと思います。
コードでは、下記の流れで処理をしています。
※ ◎行目は、https://developer.cybozu.io/hc/ja/articles/115002152143 のコードの行数を指しています。

  1. 在庫アプリから、画面で入力した「商品番号」に一致するレコードを引き当てる → 18行目あたり
  2. 1. で引き当てたレコードの「在庫数」を、出庫アプリの「出庫数」で差し引いた値で更新する → 50行目
  3. 画面に入力した内容を warehouse に詰めて(42-46行目で指定)、warehouse の内容で、在庫アプリにレコードを追加する → 51行目

補足:2.と3. のいずれかが失敗したら、2.と3.の処理はどちらもキャンセルされる(bulkRequest なので)

実はこのとき、標準機能で行うはずの、画面で保存ボタンを押したらレコードを登録するという機能はキャンセルしています(56行目〜60行目)
その代わりに、APIを使って(上記 3.)レコードを追加しています。

 

なので、API を使って 3. の処理で追加するレコードの内容に、「案件番号」も含めればよいと思います。
登録するレコードの中身は、42〜46行目の warehouse で指定しているので、このオブジェクトに projectCode: { value: projectCode } も入れてあげればいいはずです。

 

また、念の為ですが、kinotne-js-sdk も v0.5 より前のバージョンを利用する必要があります。

kintone-js-sdk は、v0.5 から、メソッドの値の指定方法が変わったみたいです。
この記事では、変わる前の kintone-js-sdk を使っているので、注意です。
v0.5 より前の kintone-js-sdk は https://github.com/kintone-labs/kintone-js-sdk/releases/tag/v0.4.2 からダウンロードできます。

0
Avatar
山田 敏紀

ひよこさん
詳しいご指導ありがとうございます。

projectCodeだけ追加したら出庫に失敗エラーがでてしまったので
projectAppidをサンプルの50行目に追加したところうまく行きました。
ご親切にありがとうございました。

1
サインインしてコメントを残してください。