アプリ版:「スタンプのみでお礼する」機能のリリースについて

 出勤退庁が全く不定時な特殊派遣業務の管理作業をファイルメーカーPro9で行っております。
 派遣報酬は時間制で、
実働時間(30分単位)×職務別時間制定額+深夜(22時~5時)従事時間×深夜加算定額
 により構成されています。
 不定時な出勤退庁の例は下記のとおりです。
(勤務)開始時刻~終了時刻(実働時間、深夜時間)     
9:00~18:00(実働9.0H、深夜0)     
20:00~3:00(実働7.0H、深夜5.0H)      
23:00~7:30(実働8.5H、深夜6.0H)       
23:30~4:00(実働4.5H、深夜4.5H)       
1:00~4:30(実働3.5H、深夜3.5H)       
2:00~9:00(実働7.0H、深夜3.0H)       
21:00~7:00(実働10.0H、深夜7.0H)      

 まず実働時間の計算ですが、入力は上記の時刻どおり行うため、翌日にまたがる勤務のときはそのままだと実働時間がマイナスになります。 これを避けるため、その場合は終了時刻に1日(86400秒)を加算する次の式を定義しております。
 出退庁時刻等の定義は、次のとおりです。
出勤時刻→「開始時刻」
退庁時刻→「終了時刻・入力」と「終了時刻・換算」
実働時間→「実働時間・時刻」と「実働時間・数値」

終了時刻・換算=If( 開始時刻>終了時刻・入力; 終了時刻・入力 + 86400; 終了時刻・入力 )
 そして実働時間は
実働時間・時刻=終了時刻・換算-開始時刻
 とし、これを数値化するため、
実働時間・数値=Hour(実働時間・時刻 ) + Round(Minute(実働時間・時刻) / 60; 2 )
 としております。

 さて最大の問題は前記実働時間中の深夜従事時間の算出です。
 まずフィールド定義を
深夜開始=Time(22; 0;0)
深夜終了=Time(5; 0; 0)
深夜終了29時=Time(29; 0; 0 )
深夜従事時間=深夜時間
深夜時間の数値=深夜時間・数値
 とし、次の式により深夜従事時間を求めています。

深夜時間=If(終了時刻・換算 > 深夜開始; If( 終了時刻・換算> 深夜終了29時; 深夜終了29時;終了時刻・換算 )-If( 開始時刻>深夜開始; 開始時刻; 深夜開始 );0) + If( 終了時刻・換算>深夜終了; 深夜終了; 終了時刻・換算 )- If(開始時刻 <深夜終了; 開始時刻; 深夜終了 )
 これを数値化するため、
深夜時間・数値=Hour(深夜時間) + Round( Minute(深夜時間) / 60; 2 )

 以上が一連の式の流れですが、これらの式は何とも冗長で分かりにくいので、もっと簡単で分かりやすい計算式ができないか、悪戦苦闘しましたがいい智恵が浮かびません。
 思い余ってファイルメーカーの時間計算に詳しい方のご指導をいただきたく投稿しました。
 よろしくお願いします。

A 回答 (1件)

条件判断を何でもかんでもif関数に頼ると冗長になります。

ETC時間
帯割引のように数直線を描いてみるのが幸せになる第一歩ですよ。

   5:00        22:00      29:00
├──╂──────────╂───────╂────┤
  ┣━━━━━━━━━━━━━━┫
    ┣━━━━━━━━┫
           ┣━━━━━━━━━━━━━━┫

最初の深夜加算は開始時刻と5:00の早い方から始まり、終了時刻と
5:00の早い方で終わります。後の深夜加算は開始時刻と22:00の遅い
方から始まり、終了時刻と22:00の遅い方で終わるけど29:00で頭打
ちですね。

この「早い方/遅い方」はmin関数やmax関数で書けます。
開始時刻と5:00の早い方 =min(開始時刻;time(5;0;0))
開始時刻と22:00の遅い方 =max(開始時刻;time(22;0;0))
終了時刻と22:00の遅い方だけど29:00で頭打ち
 =min(max(終了時刻・換算;time(22;0;0));time(29;0;0))

整理すると、
深夜時間 = min(終了時刻;深夜終了)-min(開始時刻;深夜終了) +
      min(max(終了時刻・換算;深夜開始);深夜終了29時)-max(開始時刻;深夜開始)
こんな感じですかね。

この回答への補足

早速のご回答ありがとうございました。
Min・Max関数を使用するという考え方は何となく分かるような気がしましたので、早速お示しの計算式で試算しましたが、残念ながら正しい答が得られませんでした。
誤答の例は次のとおりです。
20:30~3:00=3.0H(正解5.0H)
23:30~4:30=5.0H(正解5.5H)
23:00~1:30=▲1.0H(正解2.5H)
18:30~3:30=4.0H(正解5.5H)
誤りの原因は目下研究中ですが、結論を出すのにちょっと時間がかかりそうなので、とりあえず試算結果のみお知らせして、お礼に代えさせていただきます。

補足日時:2009/04/22 20:40
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!