いつも大変お世話になっております。
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時間を超えた場合に計算して入れて、総時間外で合計をしたいです。
アドバイスいただければとても助かります。よろしくお願いいたします。
20件のコメント
岡戸さん
moment.duration の加算で数値を指定する場合は、時間の単位を指定します。
rex0220 様
いつもお世話になっております。
本当にありがとうございます。
お忙しいところ、大変恐縮でございますが、
このようなテーブルになっておりまして、一行で開始と終了を入力した場合はお陰様で無事動きましたが、
1日中何件も入力した場合、それがまだ反応されなくなります。
この場合でも計算可能でしょうか?アドバイスいただけると幸いです。ぜひどうぞ宜しくお願い致します。
たぶん、テーブル行追加・削除時、項目の変更時に、イベント処理がされていないのではないかと思います。
テーブル・項目のイベント処理が指定されているか、テーブル・項目のフィールドコードが正しいか確認してみてください。
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;
});
})();
たぶんフィールドコード関連だと思いますが、とりあえずデバッグしてみてください。
デバッグ
ブレークポイントからの処理再開
処理中に、ブレークポイントを置いて、そこからステップ実行してみてください。
停止中に変数の中身も確認できるので、想定と異なる値が設定されていないかなどを確認しましょう。
お世話になっております。
お返事ありがとうございます。
区分の値が、mwork で指定した値以外の場合に、moment.duration 初期設定されていませんので、
'add' of undefined になります。
区分が、ドロップダウンであれば、下記以外と未設定のケースをどうするか決めましょう。
ありがとうございます。
おっしゃる通り、区分が、ドロップダウンです。ユーザーには必須項目でどっちか選ぶようにしております。
なにか設定したほうがよろしいでしょうか?どんなようにするべきでしょうか?
どのようにすべきかは、どのようにしたいかで決まります。
下記は、とりあえずエラーにならないようにします。
どのようにしたいかは、御社の運用に合わせて検討してください。
色々教えていただき、本当にありがとうございます。
「区分」を選択しなくてもエラーは出なくなりました。
ただ、問題となっている「時間外T」には、同じ日になん個かレコードになった場合、1日として認識されないままです…
>ただ、問題となっている「時間外T」には、同じ日になん個かレコードになった場合、1日として認識されないままです…
時間外の仕様がわかりませんが、1日の勤務時間が8時間以上か、またはある時間以降を時間外にするのかで処理も変わります。
1日の勤務時間が8時間以上の場合、日ごとに集計した勤務時間をもとに、「時間外T」を設定しましょう。
ある時間以降を時間外であれば、時間の判定をしましょう。
ありがとうございます。
時間外:1日の勤務時間が8時間を超えた場合(終了ー開始ー休憩)計算されるようにしたいです。
「勤務時間」をもとにしたほうが素晴らしいです。ただテーブルには同じ日にユーザによって、なんレコードも登録する人がいるから、1日という設定で絞られることは可能でしょうか。。。
mcount['実務日数'] は、日付を設定しています。
同じような考え方で、日付単位に勤務時間を集計してみてください。
何度もアドバイスいただき、本当にありがとうございます。
日付単位に勤務時間を集計ためし中ですが、初心者のため、なかなか進まない状態です。以下のソースをもっと工夫して踏ん張ってみますが、
できなかったら、まだアドバイスいただけたら幸いです。いつも本当にありがとうございます。
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;
}
こんな感じでどうでしょうか?
まだ時間重複が可能など、いろいろ問題はあります。
rex0220 様
いつも大変お世話になっております。
ソースまで教えていただき、本当にありがとうございます。
rex0220 様
いつも大変お世話になっております。
お忙しいところ大変恐縮でございます。もしお時間許すであれば、以下のソースを解釈していただけますでしょか?
まあ、最初は分かりにくいかもしれませんので、ステップ実行して処理を確認してみてください。
処理が進むにしたがって、変数の内容が変わる様子を見るとわかりやすいと思います。
・追加処理
・加算処理
⇒ "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" と配列の要素が順番に渡されて処理します。
rex0220 様
いつも大変お世話になっております。
とても分かりやすく説明までしていただき、本当にありがとうございます。すごく勉強になりました。
重ね重ね、誠にありがとうございました。
rex0220 様
いつも大変お世話になっております。前回は本当になにからなにまで助け頂き、本当にありがとうございました。
またその続きで⇒ テーブル項目の非表示について を投稿しておりますが、もしお時間ありましたら、アドバイスいただけますでしょうか?
毎度お手数をおかけして申し訳ございませんが、よかったらぜひご指導お願い致します。