みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
https://fm-aid.com/bbs2/viewtopic.php?id=8932
で質問させていただいたもので、更に複雑なことがしたいのですが、やってみると長くなり過ぎ且つうまくいきません。
やりたい事を文章にすると
勤務時間を1部2部に分けて給与計算したい。
<使用フィールド>
クラス
出勤時間
退勤時間
基本給 これを計算フィールドにして金額が出るようにしたいです。
<やりたい事>(10円単位切捨て)
もし退勤時間が空じゃない且つ、
クラスが掃除スタッフであるなら21時までは1000円で21時以降は1200円 (第2部時間の方を15分単位切捨て(*1))
クラスがバイドであるなら20時までは1000円で20時以降は1200円 (第2部時間の方を15分単位切捨て(*1))
退勤時間が空なら0
*1)第2部時間の方を15分切捨て
(例)掃除スタッフが20時20分に出勤して22時に退勤した場合
40分第1部時給=666円
1時間40分=(15分単位切捨てで)1時間30分-40分=50分は(15分単位切捨てで)45分第2部時給=900円
666円+900円=1566円=(10円単位切捨て)1500円 が基本給
というようにしたいです。
かなり複雑なのですが、計算式を教えていただければと思います。宜しくお願いします。
次のレスでは自分なりにトライしてみた式を投稿します。
自分でやってみたのが以下ですが、うまく行かず、無駄が多い気がします・・・。
If ( not IsEmpty ( 退勤時間 ) ;
Case (
クラス="掃除スタッフ" ;
Truncate (
Let(
[
#仮2部勤務時間=Max(退勤時間-Time(21;0;0); 0);
#1部勤務時間=If ( Div ( 退勤時間-出勤時間-#仮2部勤務時間 ; 15 * 60 ) * 15 * 60 < Time(1;0;0) ; 0 ; 退勤時間-出勤時間-#仮2部勤務時間);
#2部勤務時間=If ( Div ( 退勤時間-Time(21;0;0) ; 15 * 60 ) * 15 * 60 < 0 ; 0 ; Div ( 退勤時間-Time(21;0;0) ; 15 * 60 ) * 15 * 60) - #1部勤務時間
];
Int(#1部勤務時間*(1000/3600)+#2部勤務時間*(1200/3600))
)
; -2);
クラス ≠ "アルバイト" ;
Truncate (
Let(
[
#仮2部勤務時間=Max(退勤時間-Time(20;0;0); 0);
#1部勤務時間=退勤時間-出勤時間-#仮2部勤務時間;
#2部勤務時間=If ( Div ( 退勤時間-Time(20;0;0) ; 15 * 60 ) * 15 * 60 < 0 ; 0 ; Div ( 退勤時間-Time(20;0;0) ; 15 * 60 ) * 15 * 60)
];
Int(#1部勤務時間*(1000/3600)+#2部勤務時間*(1200/3600))
)
; -2)
;0
))
Let(
[
#クラス=PatternCount(クラス; "掃除スタッフ") + PatternCount(クラス; "バイト")*2; //#クラスは、掃除スタッフ=1、バイト=2
#2部切替時刻=Choose(#クラス; ""; Time(21;0;0); Time(20;0;0));
#勤務時間=退勤時間 - 出勤時間;
#仮2部勤務時間=Max(退勤時間 - #2部切替時刻; 0);
#2部勤務時間=Div(#仮2部勤務時間; (15*60))*(15*60);
#1部勤務時間=#勤務時間 - #仮2部勤務時間;
#仮基本給=Int(#1部勤務時間*(1000/3600)+#2部勤務時間*(1200/3600))
];
Choose(IsEmpty(退勤時間); Div(#仮基本給; 10)*10)
)
Offline
Hiroさん大変スマートな式をありがとうございます。
試したところ、出勤と退勤の時間が同じ時、基本給が 0 にならず、70だったり値が出てきてしまいます。
これはなぜでしょうか?
また 23:00出勤 24:00退勤 で2部時給が1200円ですと 基本給が1490円になったりします。
1部2部の時間をまたぐとうまく行きますが、2部だけの時間帯で出退勤するとおかしくなるようです。
【 修正式 】
>#4と>#5の指摘誤算を修正しました。(修正箇所は、赤字で明示)
Let(
[
#クラス=PatternCount(クラス; "掃除スタッフ") + PatternCount(クラス; "バイト")*2; //#クラスは、掃除スタッフ=1、バイト=2
#2部切替時刻=Choose(#クラス; ""; Time(21;0;0); Time(20;0;0));
#勤務時間=退勤時間 - 出勤時間;
#仮2部勤務時間=Max(退勤時間 - Max(出勤時間; #2部切替時刻); 0);
#2部勤務時間=Div(#仮2部勤務時間; (15*60))*(15*60);
#1部勤務時間=#勤務時間 - #仮2部勤務時間;
#仮基本給=Int(#1部勤務時間*1000/3600 + #2部勤務時間*1200/3600)
];
Choose(IsEmpty(退勤時間); Div(#仮基本給; 10) * 10)
)
Last edited by Hiro (2019-03-31 00:58:06)
Offline
完璧です!
全ての状況で思った通り計算できるようになりました。
Hiroさんありがとうございました!!
Pages: 1
[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 559.73 KiB (Peak: 578.34 KiB) ]