新規投稿
フォローする

テーブル内の更新について

「レコードを再利用」ボタンにて別アプリで最新情報をGET後、条件によって固定値をセットしたいのですが、「実行」ボタンを押下しても更新されません。以下、一部分のコーディングですが、コンソールで確認すると正しく表示されますが、画面上はGET後の状態が表示されます。setRecordの部分が悪いと思うのですがどのようにすればよろしいでしょうか?

よろしくお願いします。

       kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, function(resp) {
         if (resp['records'].length === 1) {
           var setRecord = kintone.app.record.get();
           var rec = setRecord.record;
           // 取得したレコードの値を「伝票番号」他にセット
             rec['Table_10'].value[j].value['伝票番号'].value = resp['records'][0]['伝票番号']['value'];
             rec['Table_10'].value[j].value['案件名'].value = resp['records'][0]['案件名']['value'];
             rec['Table_10'].value[j].value['契約日'].value = resp['records'][0]['契約日']['value'];
           // 受注後は「作業区分」を[受注済案件対応]に変更
             if (resp['records'][0]['伝票番号']['value'] != "") {
               if (resp['records'][0]['契約日']['value'] <= record['作業日']['value']) {
                 rec['Table_10'].value[j].value['作業区分'].value = '受注済案件対応';
                 console.log('作業区分 = '+ rec['Table_10'].value[j].value['作業区分'].value);
               }
               else {
                 rec['Table_10'].value[j].value['作業区分'].value = 'プレ案件対応(受注前)';

                 console.log('作業区分 = '+ rec['Table_10'].value[j].value['作業区分'].value);
               } 
               j = j + 1;
               kintone.app.record.set(setRecord);
             }

0

11件のコメント

Avatar
FM

もしエラー等が返ってきていないのであれば、setRecordの中身が変わっていないということになります。
kintone.app.record.set(setRecord); の部分にブレークポイントを置いて、setRecordの中身が変わっていなければ
恐らく非同期処理の為にrecが変わるよりも先にkintone.app.record.set(setRecord);が実行されているからだと思います。
その場合は、return kintone.app.record.set(setRecord); 等で一連の処理が終わってから実行するようにする必要があります。

0
Avatar
Hiroshi

FMさま

「実行」ボタン押下後の動作確認しますと、画面上は条件によってテキストがセットされ変更されていますが、表示モードになった瞬間に元(GETした直後の状態)に戻ってしまいます。

コーディングに関してですが、具体的にアドバイスいただきますと幸いです。以上、よろしくお願いします。

0
Avatar
FM

「実行」ボタンはてっきりJSで生成したボタンだと思っていたのですが、「保存」ボタンのことで合っていますか?

1.レコードAでレコードの再利用をする

2.レコードBの編集画面が表示される(レコードAのデータが挿入されている)

3.上記JSでレコードBのデータが一部書き換わる

4.「保存」ボタンを押す

5.レコードBの詳細表示画面に戻るが、3で書き換わった内容ではなく2のデータで保存されている

ということでしょうか?
具体的な現象がいまいち把握できておらず、すみません。

FMにより編集されました
0
Avatar
Hiroshi

FMさま

分かりにくい表現で大変失礼しました。「実行」でなく、「保存」ボタンです。

 

流れに関しましては、お察しの通りです。若干付け加えさせていただきます。

1.レコードAを表示し、「レコードを再利用する」ボタンを押す。

2.レコードAが複写される。

  カスタマイズ(JS)でテーブルの内容を別アプリから読込(行数分)、最新状態(現在)+作業日を本日日付に更新する。

3.作業日を変更したい場合は手修正し、作業日とテーブル内の契約日を比較し、条件にて「作業区分」をセットする。

  「保存」ボタンを押す。

現象ですが、3の状態では保存されず、テーブル内は2の状態のままで、作業日だけは更新される状況です。

以上、よろしくお願いします。

0
Avatar
FM

kintone.events.onの中で、「app.record.***.submit」を指定していませんか?
JS全体が分からないので確証はありませんが、保存時に再びJSが走ってテーブル内が再取得されているように思えました。
作業日が更新されるのは、JSで書き換えている箇所が無いためだと思います。

保存時にもJSを動かしたい理由がなければ「app.record.***.submit」を削除してから試してみてください。

0
Avatar
Hiroshi

FMさま

大変お手数おかけします。ご認識いただいている通りです。

保存時にもJSを動かしたいため、kintone.eventsを2か所(create showとcreate submit)に入れています。

以下に、現状のコードを記載します。

// ルックアップで複数候補存在時の表示不能対策(複写)

function zeroformat(v, n) {
var vl = String(v).length;
if(n > vl) {
return (new Array((n - vl) + 1).join(0)) + v;
} else {
return v;
}
}

// 参照先(プロセス管理)の「受注番号」他を直接セット
(function () {
"use strict";

// JavaScriptでsleepする方法
// ビジーwaitを使う方法
function sleep(waitMsec) {

var startMsec = new Date();

// 指定ミリ秒間、空ループ。CPUは常にビジー。
while (new Date() - startMsec < waitMsec);

}

kintone.events.on('app.record.create.show', function(event) {
// フィールドコード"Table_10"のレコードオブジェクトを取得
var tableRecords = event.record.Table_10.value;
var record = event.record;
var j = 0;

// 作業日に本日日付をセット
var dt = new Date();
var today = dt.getFullYear() + "-" + zeroformat((dt.getMonth()+1),2) + "-" + zeroformat(dt.getDate(),2);

// テーブル内の"プレ番号"フィールドの値を取得
for (var i = 0; i < tableRecords.length; i++) {
var ItemName;
ItemName = tableRecords[i].value['プレ番号'].value;
//console.log((i+1) +'行目 = '+ ItemName);
sleep(200);
var params = {
'app': 2,
'query': 'プレ番号1 = "' + ItemName + '"',
'fields': ["プレ番号1", "伝票番号", "案件名", "契約日"],
'totalCount': true
}

// REST APIで参照先のレコードを1件取得
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, function(resp) {
if (resp['records'].length === 1) {
var setRecord = kintone.app.record.get();
var rec = setRecord.record;
// 取得したレコードの値を「伝票番号」他にセット
console.log('●'+ (j+1) +'行目 = '+ resp['records'][0]['伝票番号']['value']);
// セットした値を表示
rec['Table_10'].value[j].value['伝票番号'].value = resp['records'][0]['伝票番号']['value'];
rec['Table_10'].value[j].value['案件名'].value = resp['records'][0]['案件名']['value'];
rec['Table_10'].value[j].value['契約日'].value = resp['records'][0]['契約日']['value'];
console.log('作業日 = '+ record['作業日']['value']);
console.log('契約日 = '+ resp['records'][0]['契約日']['value'] );
// 受注後は「作業区分」を[受注済案件対応]に変更
if (resp['records'][0]['伝票番号']['value'] != "") {
if (resp['records'][0]['契約日']['value'] <= record['作業日']['value']) {
rec['Table_10'].value[j].value['作業区分'].value = '受注済案件対応';
console.log('作業区分 = '+ rec['Table_10'].value[j].value['作業区分'].value);
}
else {
rec['Table_10'].value[j].value['作業区分'].value = 'プレ案件対応(受注前)';
}
j = j + 1;
kintone.app.record.set(setRecord);
}
else {
j = j + 1;
}
}
else {
console.log((j+1) +'行目 = ');
j = j + 1;
}
sleep (200);
});
}
record['作業日']['value'] = today;
return event;
});

kintone.events.on('app.record.create.submit', function(event) {
// フィールドコード"Table_10"のレコードオブジェクトを取得
var tableRecords = event.record.Table_10.value;
var record = event.record;
var j = 0;

// 作業日に本日日付をセット
var dt = new Date();
var today = dt.getFullYear() + "-" + zeroformat((dt.getMonth()+1),2) + "-" + zeroformat(dt.getDate(),2);

// テーブル内の"プレ番号"フィールドの値を取得
for (var i = 0; i < tableRecords.length; i++) {
var ItemName;
ItemName = tableRecords[i].value['プレ番号'].value;
//console.log((i+1) +'行目 = '+ ItemName);
sleep(200);
var params = {
'app': 2,
'query': 'プレ番号1 = "' + ItemName + '"',
'fields': ["プレ番号1", "伝票番号", "案件名", "契約日"],
'totalCount': true
}

// REST APIで参照先のレコードを1件取得
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params, function(resp) {
if (resp['records'].length === 1) {
var setRecord = kintone.app.record.get();
var rec = setRecord.record;
// 取得したレコードの値を「伝票番号」他にセット
console.log('●'+ (j+1) +'行目 = '+ resp['records'][0]['伝票番号']['value']);
// セットした値を表示
rec['Table_10'].value[j].value['伝票番号'].value = resp['records'][0]['伝票番号']['value'];
rec['Table_10'].value[j].value['案件名'].value = resp['records'][0]['案件名']['value'];
rec['Table_10'].value[j].value['契約日'].value = resp['records'][0]['契約日']['value'];
console.log('作業日 = '+ record['作業日']['value']);
console.log('契約日 = '+ resp['records'][0]['契約日']['value'] );
// 受注後は「作業区分」を[受注済案件対応]に変更
if (resp['records'][0]['伝票番号']['value'] != "") {
if (resp['records'][0]['契約日']['value'] <= record['作業日']['value']) {
rec['Table_10'].value[j].value['作業区分'].value = '受注済案件対応';
console.log('作業区分 = '+ rec['Table_10'].value[j].value['作業区分'].value);
}
else {
rec['Table_10'].value[j].value['作業区分'].value = 'プレ案件対応(受注前)';
console.log('作業区分 = '+ rec['Table_10'].value[j].value['作業区分'].value);
}
j = j + 1;
//kintone.app.record.set(setRecord);
}
else {
j = j + 1;
}
}
else {
console.log((j+1) +'行目 = ');
j = j + 1;
}
sleep (200);
});
}
kintone.app.record.set(setRecord);
return event;
});
})();

0
Avatar
FM

app.record.create.showとapp.record.create.submitの処理の内容が全く同じに思えますが、これはどういった意図でしょうか?
app.record.create.submitの処理が記載された通りに動作しているとしか言えないのですが…。

0
Avatar
Hiroshi

FMさま

意図としましては、「再利用する」ボタンを押した際は、作業日に本日日付を自動でセットしています。

その後、作業日を手で変更した場合、再度、条件に応じてテキストを再セットし、その結果を保存させたいためです。

無駄なコーディングはあるかとは思います。この辺りもご指南いただけますと幸いです。

 

以上、よろしくお願いします。

0
Avatar
FM

>作業日を手で変更した場合、再度、条件に応じてテキストを再セットし、その結果を保存させたいためです。

恐らく、app.record.create.submit内を大幅に書き直す必要があると思います。
その為には使用するフィールド、条件、処理の流れを具体的に細かく記載して頂かないと指摘のしようがありません。

その場合はこの投稿の内容とは異なるものになりますので、内容をまとめた上で再び投稿されることをオススメします。

0
Avatar
Hiroshi

「保存」ボタンを押した際の処理は、単純で[作業日]とテーブル内の[契約日]を比較し、[作業区分]にセットするだけです。

条件は、[契約日]≦[作業日]が正の場合、固定文字「受注済案件対応」を[作業区分]にセット

                負の場合、固定文字「プレ案件対応(受注前)」を[作業区分]にセット

 

以上、よろしくお願いします。

0
Avatar
HYO

横槍ですが、失礼します。
現在のスクリプトはつまり、"手作業で修正された項目を含めて保存時に上書きする"というような状況になっています。
「app.record.create.submit」の記述を見直し、要件に合ったスクリプトに修正する必要があるというのがFMさんの回答です。

そもそも、FMさんの言っていることが理解できていないように見て取れます。
これまでの回答が理解できていないのであれば、無理をせず業者に発注しましょう。
ここは質問をする場であって、コーディングを無償で請け負ってもらう場所ではありません。

以上

0
ログインしてコメントを残してください。