新規投稿
フォローする

【急】テーブル計算について

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

テーブルの計算について 

if (row.value.終了.value > '19:00') {
var overtime = moment.duration(row.value.終了.value).subtract('19:00');
mwork['時間外'] = mwork['時間外'].add(overtime);
}

を応用したいですが、なかなか反応しないため、投稿させていただきました。

if (whours.as('hours') > 8) {
row.value.時間外T.value = whours.as('hours') - 8;
mwork['時間外'] = mwork['時間外'].add(row.value.時間外T);
}

時間外:勤務時間が8時間を超えた場合に計算して入れて、総時間外で合計をしたいです。

アドバイスいただければとても助かります。よろしくお願いいたします。

0

20件のコメント

Avatar
rex0220

岡戸さん

moment.duration の加算で数値を指定する場合は、時間の単位を指定します。

mwork['時間外'] = mwork['時間外'].add(row.value.時間外T.value, 'hours');
1
Avatar
岡戸 智子

rex0220 

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

本当にありがとうございます。

お忙しいところ、大変恐縮でございますが、

このようなテーブルになっておりまして、一行で開始と終了を入力した場合はお陰様で無事動きましたが、

1日中何件も入力した場合、それがまだ反応されなくなります。

この場合でも計算可能でしょうか?アドバイスいただけると幸いです。ぜひどうぞ宜しくお願い致します。

岡戸 智子により編集されました
0
Avatar
rex0220

たぶん、テーブル行追加・削除時、項目の変更時に、イベント処理がされていないのではないかと思います。

テーブル・項目のイベント処理が指定されているか、テーブル・項目のフィールドコードが正しいか確認してみてください。

 

 kintone.events.on([
"app.record.create.show", "app.record.edit.show", "app.record.create.change.Table", "app.record.edit.change.Table",
"app.record.create.submit", "app.record.edit.submit",
"app.record.create.change.日付", "app.record.edit.change.日付",
"app.record.create.change.開始", "app.record.edit.change.開始",
"app.record.create.change.終了", "app.record.edit.change.終了",
"app.record.create.change.休憩", "app.record.edit.change.休憩",
], function(event) {
1
Avatar
岡戸 智子

rex0220 様

早速アドバイスいただき、本当にありがとうございます。

改善はされて状態です。全体のソースが以下のようになっております。

どっか間違っているのでしょうか?お手すきをおかけまして大変申し訳ございませんが、再度アドバイスいただけますでしょか。

宜しくお願い致します。


(function() {

"use strict";
kintone.events.on(["app.record.create.show","app.record.index.edit.show", "app.record.edit.show", "app.record.create.change.Table", "app.record.edit.change.Table"], function(event) {
event.record.会議合計.disabled = true;
event.record.研修合計.disabled = true;
event.record.質問対応合計.disabled = true;
event.record.時間外.disabled = true;
event.record.実務日数.disabled = true;

var table = event.record.Table.value;
table.forEach(function(row) {
row.value.勤務時間.disabled = true;

row.value.時間外T.disabled = true;
});
return event;
});
kintone.events.on([
"app.record.create.show", "app.record.edit.show", "app.record.create.change.Table", "app.record.edit.change.Table",
"app.record.create.submit", "app.record.edit.submit",
"app.record.create.change.日付", "app.record.edit.change.日付",
"app.record.create.change.区分", "app.record.edit.change.区分",
"app.record.create.change.開始", "app.record.edit.change.開始",
"app.record.create.change.終了", "app.record.edit.change.終了",
"app.record.create.change.休憩", "app.record.edit.change.休憩",
], function(event) {
var record = event.record;
var mwork = {'会議合計': moment.duration(0), '研修合計': moment.duration(0), '質問対応合計': moment.duration(0),'時間外': moment.duration(0) };
var mcount = { '実務日数': {} };
var table = record.Table.value;
table.forEach(function(row) {
if (row.value.開始.value && row.value.終了.value && row.value.休憩.value) {
var whours = moment.duration(row.value.終了.value).subtract(moment.duration(row.value.開始.value)).subtract(Number(row.value.休憩.value), 'hours');

if (whours.as('hours') > 0) {
row.value.勤務時間.value = whours.as('hours');

mcount['実務日数'][row.value.日付.value] = 1;
var kubun = row.value.区分.value + '合計';
mwork[kubun] = mwork[kubun].add(whours);

if (whours.as('hours') > 8) {
row.value.時間外T.value = whours.as('hours') - 8;
mwork['時間外'] = mwork['時間外'].add(row.value.時間外T.value, 'hours');
}

}
else {
row.value.終了.error = '開始 > 終了';
}
} else {
row.value.勤務時間.value = '';
}
});
Object.keys(mwork).forEach(function(key) {
record[key].value = mwork[key].as('hours');
record['実務日数'].value = Object.keys(mcount['実務日数']).length;
});
return event;
});

})();

1
Avatar
rex0220

たぶんフィールドコード関連だと思いますが、とりあえずデバッグしてみてください。

デバッグ

ブレークポイントからの処理再開

 

処理中に、ブレークポイントを置いて、そこからステップ実行してみてください。

停止中に変数の中身も確認できるので、想定と異なる値が設定されていないかなどを確認しましょう。

1
Avatar
岡戸 智子

お世話になっております。

お返事ありがとうございます。

というエラーになっております。

0
Avatar
rex0220

区分の値が、mwork で指定した値以外の場合に、moment.duration 初期設定されていませんので、

'add' of undefined になります。

区分が、ドロップダウンであれば、下記以外と未設定のケースをどうするか決めましょう。

var mwork = {'会議合計': moment.duration(0), '研修合計': moment.duration(0), '質問対応合計': moment.duration(0),'時間外': moment.duration(0) };
0
Avatar
岡戸 智子

ありがとうございます。

おっしゃる通り、区分が、ドロップダウンです。ユーザーには必須項目でどっちか選ぶようにしております。

なにか設定したほうがよろしいでしょうか?どんなようにするべきでしょうか?

0
Avatar
rex0220

どのようにすべきかは、どのようにしたいかで決まります。

下記は、とりあえずエラーにならないようにします。

if (mwork.hasOwnProperty(kubun)) {
mwork[kubun] = mwork[kubun].add(whours);
}

どのようにしたいかは、御社の運用に合わせて検討してください。

rex0220により編集されました
2
Avatar
岡戸 智子

色々教えていただき、本当にありがとうございます。

「区分」を選択しなくてもエラーは出なくなりました。

ただ、問題となっている「時間外T」には、同じ日になん個かレコードになった場合、1日として認識されないままです…

 

0
Avatar
rex0220

>ただ、問題となっている「時間外T」には、同じ日になん個かレコードになった場合、1日として認識されないままです…

時間外の仕様がわかりませんが、1日の勤務時間が8時間以上か、またはある時間以降を時間外にするのかで処理も変わります。

1日の勤務時間が8時間以上の場合、日ごとに集計した勤務時間をもとに、「時間外T」を設定しましょう。

ある時間以降を時間外であれば、時間の判定をしましょう。

1
Avatar
岡戸 智子

ありがとうございます。

時間外:1日の勤務時間が8時間を超えた場合(終了ー開始ー休憩)計算されるようにしたいです。

「勤務時間」をもとにしたほうが素晴らしいです。ただテーブルには同じ日にユーザによって、なんレコードも登録する人がいるから、1日という設定で絞られることは可能でしょうか。。。

0
Avatar
rex0220

mcount['実務日数'] は、日付を設定しています。

同じような考え方で、日付単位に勤務時間を集計してみてください。

 

1
Avatar
岡戸 智子

何度もアドバイスいただき、本当にありがとうございます。

日付単位に勤務時間を集計ためし中ですが、初心者のため、なかなか進まない状態です。以下のソースをもっと工夫して踏ん張ってみますが、

できなかったら、まだアドバイスいただけたら幸いです。いつも本当にありがとうございます。

 

if (row.value.開始.value && row.value.終了.value && row.value.休憩.value) {
var whours = moment.duration(row.value.終了.value).subtract(moment.duration(row.value.開始.value)).subtract(Number(row.value.休憩.value), 'hours');
//var whours = moment.duration(row.value.終了.value).subtract(moment.duration(row.value.開始.value)).subtract(Number(row.value.休憩.value), 'minutes');
if (whours.as('hours') > 0) {
row.value.勤務時間.value = whours.as('hours');
//row.value.勤務時間.value = whours.get('hours') + '時間 ' + whours.get('minutes') + '分';
mcount['実務日数'][row.value.日付.value] = 1;
[row.value.勤務時間.value][row.value.日付.value] = 1;
var kubun = row.value.区分.value + '合計';
if (mwork.hasOwnProperty(kubun)) {
mwork[kubun] = mwork[kubun].add(whours);
}

//if (whours.as('hours') > 8) {
if (row.value.勤務時間.value >= 8) {

row.value.時間外T.value = row.value.勤務時間.value - 8;
mwork['時間外'] = mwork['時間外'].add(row.value.時間外T.value, row.value.時間外T.value);
}else{
row.value.時間外T.value = 0;
}

0
Avatar
rex0220

こんな感じでどうでしょうか?

まだ時間重複が可能など、いろいろ問題はあります。

(function() {

"use strict";
kintone.events.on(["app.record.create.show", "app.record.index.edit.show", "app.record.edit.show", "app.record.create.change.Table", "app.record.edit.change.Table"], function(event) {
event.record.会議合計.disabled = true;
event.record.研修合計.disabled = true;
event.record.質問対応合計.disabled = true;
event.record.時間外.disabled = true;
event.record.実務日数.disabled = true;
var table = event.record.Table.value;
table.forEach(function(row) {
row.value.勤務時間.disabled = true;
row.value.時間外T.disabled = true;
});
return event;
});
kintone.events.on([
"app.record.create.show", "app.record.edit.show", "app.record.create.change.Table", "app.record.edit.change.Table",
"app.record.create.submit", "app.record.edit.submit",
"app.record.create.change.日付", "app.record.edit.change.日付",
"app.record.create.change.区分", "app.record.edit.change.区分",
"app.record.create.change.開始", "app.record.edit.change.開始",
"app.record.create.change.終了", "app.record.edit.change.終了",
"app.record.create.change.休憩", "app.record.edit.change.休憩",
], function(event) {
var record = event.record;
var mwork = { '会議合計': moment.duration(0), '研修合計': moment.duration(0), '質問対応合計': moment.duration(0), '時間外': moment.duration(0) };
var dailyWHours = {};
var table = record.Table.value;
table.forEach(function(row, index) {
if (row.value.開始.value && row.value.終了.value && row.value.休憩.value) {
var whours = moment.duration(row.value.終了.value).subtract(moment.duration(row.value.開始.value)).subtract(Number(row.value.休憩.value), 'hours');

row.value.時間外T.value = '';
if (whours.as('hours') > 0) {
row.value.勤務時間.value = whours.as('hours');

var dt1 = row.value.日付.value;
if (dt1) {
if (!dailyWHours.hasOwnProperty(dt1)) {
dailyWHours[dt1] = { whours: whours.as('hours'), index: index };
} else {
dailyWHours[dt1].whours += whours.as('hours');
dailyWHours[dt1].index = index;
}
}
var kubun = row.value.区分.value + '合計';
if (mwork.hasOwnProperty(kubun)) {
mwork[kubun] = mwork[kubun].add(whours);
}
} else {
row.value.終了.error = '開始 > 終了';
}
} else {
row.value.勤務時間.value = '';
}
});
Object.keys(mwork).forEach(function(key) {
record[key].value = mwork[key].as('hours');
});
record['実務日数'].value = Object.keys(dailyWHours).length;
Object.keys(dailyWHours).forEach(function(dt) {
var dInfo = dailyWHours[dt];
if (dInfo.whours > 8) {
table[dInfo.index].value.時間外T.value = dInfo.whours - 8;
} else {
table[dInfo.index].value.時間外T.value = 0;
}
});
return event;
});

})();
1
Avatar
岡戸 智子

rex0220 様

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

ソースまで教えていただき、本当にありがとうございます。

var dt1 = row.value.日付.value;
if (dt1) {
if (!dailyWHours.hasOwnProperty(dt1)) {
dailyWHours[dt1] = { whours: whours.as('hours'), index: index };
} else {
dailyWHours[dt1].whours += whours.as('hours');
dailyWHours[dt1].index = index;
}
}

Object.keys(mwork).forEach(function(key) {
record[key].value = mwork[key].as('hours');
});
record['実務日数'].value = Object.keys(dailyWHours).length;
Object.keys(dailyWHours).forEach(function(dt) {
var dInfo = dailyWHours[dt];
if (dInfo.whours > 8) {
table[dInfo.index].value.時間外T.value = dInfo.whours - 8;
} else {
table[dInfo.index].value.時間外T.value = 0;
}
});
で「実務日数」と「時間外T」をカウントしながら、計算を求めているとは素晴らしいです。
初心者の私には何か月かけてもかけないソースです。
全然不具合を感じてなかったので、このまま使わせていただきます。
本当にとても助かりました。ありがとうございました。(TT)⤴⤴⤴

0
Avatar
岡戸 智子

rex0220 様

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

お忙しいところ大変恐縮でございます。もしお時間許すであれば、以下のソースを解釈していただけますでしょか?

var dt1 = row.value.日付.value;
if (dt1) {
if (!dailyWHours.hasOwnProperty(dt1)) {
dailyWHours[dt1] = { whours: whours.as('hours'), index: index };
} else {
dailyWHours[dt1].whours += whours.as('hours');
dailyWHours[dt1].index = index;
}
}
⇒同じ日付の時間を何で計算されるのでしょうか?
Object.keys(mwork).forEach(function(key) {
record[key].value = mwork[key].as('hours');
});
record['実務日数'].value = Object.keys(dailyWHours).length;
Object.keys(dailyWHours).forEach(function(dt) {
var dInfo = dailyWHours[dt];
if (dInfo.whours > 8) {
table[dInfo.index].value.時間外T.value = dInfo.whours - 8;
} else {
table[dInfo.index].value.時間外T.value = 0;
}
});
⇒dtとは最初から定義されてないのに、どうして同じ日の時間外Tを合計されるでしょうか?

調べながら解釈したかったが、全然わからなくて、頂いたソースで同じ日であれば時間外Tがちゃんと8時間を超えた場合計算されるのが不思議で不思議で・・

いつもご迷惑をおかけ大変申し訳ございませんが、もしよかったら教えていただけますでしょうか?
どうぞよろしくお願いいたします。
0
Avatar
rex0220

まあ、最初は分かりにくいかもしれませんので、ステップ実行して処理を確認してみてください。

処理が進むにしたがって、変数の内容が変わる様子を見るとわかりやすいと思います。


・追加処理

// 処理するテーブル行
row.value : {
"日付": { "value": "2018-02-06", "type": "DATE" },
"勤務時間": { "value": "8", "type": "DATE" },
...
}
// 処理前のオブジェクト
dailyWHours :
{
"2018-02-05": {
"whours": 8,
"index": 0
}
}

⇒ "2018-02-06" が無ければ、追加

// 処理後のオブジェクト
dailyWHours :
{
"2018-02-05": {
"whours": 8,
"index": 0
},
// "2018-02-06" オブジェクトを追加
"2018-02-06": {
"whours": 8,
"index": 1
},
}


・加算処理

// 処理するテーブル行
row.value : {
"日付": { "value": "2018-02-06", "type": "DATE" },
"勤務時間": { "value": "4", "type": "DATE" },
...
}

⇒ "2018-02-06" が有れば、加算

// 処理後のオブジェクト
dailyWHours :
{
"2018-02-05": {
"whours": 8,
"index": 0
},
"2018-02-06": {
"whours": 12, // 加算
"index": 2 // "2018-02-06"の最終行位置
},
}

 

・ループ処理 forEach

与えられた関数を、配列の各要素に対して一度ずつ実行します。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach


処理する配列

Object.keys(dailyWHours) : ["2018-02-05","2018-02-06"]

ループ処理

Object.keys(dailyWHours).forEach(function(dt) {
var dInfo = dailyWHours[dt];
...
});

dt に、"2018-02-05", "2018-02-06" と配列の要素が順番に渡されて処理します。

 

2
Avatar
岡戸 智子

rex0220 様

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

とても分かりやすく説明までしていただき、本当にありがとうございます。すごく勉強になりました。

重ね重ね、誠にありがとうございました。

0
Avatar
岡戸 智子

rex0220 様

いつも大変お世話になっております。前回は本当になにからなにまで助け頂き、本当にありがとうございました。

またその続きで⇒  テーブル項目の非表示について を投稿しておりますが、もしお時間ありましたら、アドバイスいただけますでしょうか?

毎度お手数をおかけして申し訳ございませんが、よかったらぜひご指導お願い致します。

岡戸 智子により編集されました
0
サインインしてコメントを残してください。