みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
いつもお世話になっております。
FMはバージョンは16 OSはwin になります。
品番 作業開始 終了予定 標準時間
A 9: 00 10:00 1:00
B 10: 10 11 : 10 1:00
C 11: 10 12 : 00 0:50
D 12: 50 13 : 30 0: 40
上のように以下の休憩時間を含めたスケジュールの表示をしたいです。
「10:00~10:10」「12:00~12:50」「15:00~15:15」
フィールドは 「品番」「作業開始」「作業終了予定」 「標準時間」
別ファイルより「休憩時間」 があります。
休憩時間を加味していない場合はこちらの関数で表示できました。
Case ( Get ( レコード番号 ) = 1 ; 加工者一覧 2::勤務時間 ; GetNthRecord( 作業終了時間 ; Get ( レコード番号 ) - 1 ))
加味する場合はどう記述すればよいのでしょうか?
どうかご教示のほどお願いいたします。
元のテーブルを仮に「作業」テーブルとし、
フィールドを追加
作業開始予定時刻
計算フィールド 計算式を popo 1さんが提示された計算式とします。
作業終了予定時刻 (ご説明の「作業終了予定」は「作業終了」としてください)
計算フィールド 計算式 作業開始 + 標準時間
休憩テーブルのフィールドを
休憩開始時刻
休憩終了時刻
として、1休憩を1レコードで各時刻を入力。
リレーション
作業 休憩
作業開始予定時刻 > 休憩開始時刻
and
作業開始予定時刻 < 休憩終了時刻
として、
この関連レコードがあれば作業開始が休憩時間内にあるということですから、
関連レコードの休憩終了時刻を作業開始とします。
作業終了も同様に考えて設定します。
と書いて、、
もし作業終了が休憩時間内の場合、
1. 休憩時間を加えて終了をのばす
2. 二つのレコードに分ける
(二つ以上の休憩にまたがるような作業もあるのか?・・とても面倒そう!)
と考えられましたが、いかがでしょう?
Offline
チポ様
リレーションまでは設定できたのですが
その先の作業終了が休憩時間内の場合、休憩時間を加えて終了をのばす
というのはどう関数を記述すればよいのでしょうか?
私の前レスであげたリレーションは、
作業開始時刻のためのものですが、
それは出来たのでしょうか?
作業終了時刻のためには新たなリレーションが必要ですが、
それも出来ているのでしょうか?
また、
前レスの私の質問の解答がないとその先へ進めません。
Offline
チポ様
やりたいことは作業終了が休憩時間内の場合、その休憩時間を含めて表示させたい...ですので
1. 休憩時間を加えて終了をのばす。というのができればいいです。
また、2つ以上の休憩をまたぐような作業は今のところありません。
リレーションについてですが、作業開始はチポ様が書いてくださったように設定。終了時間も同じように
作業 休憩
作業終了 > 休憩開始時刻
and
作業終了 < 休憩終了時刻
で設定しました。
関連レコードの休憩終了時刻を作業開始とします。
の作業開始とは、「作業開始予定時刻」とは別のフィールドということでよろしいでしょうか?
作業開始予定時刻
は休憩時間を加味しない時刻で、
この時刻から休憩を考慮して作業開始時刻に入力します。
終了も同様です。
前々レスのリレーションを使い、作業開始時刻は
Case ( IsValid ( 休憩テーブル::休憩開始時刻 ) ; 休憩テーブル::休憩終了時刻 ; 作業テーブル::作業開始予定時刻 )
↑ ↑
作業テーブルとリレーションした休憩テーブルのテーブル名
で求められます。
作業終了は、終了時刻が休憩をまたいだ先もあり得ると考慮して、
リレーションを
作業 休憩 2(休憩テーブルのコピー、作業テーブルをコピーしては行けません)
作業開始時刻 < 休憩終了時刻
and
作業終了予定時刻 > 休憩開始時刻
として、
作業終了時刻の計算式
作業テーブル::作業終了予定時刻 + Case ( IsValid ( 休憩 2テーブル::休憩開始時刻 ) ; 休憩 2テーブル::休憩終了時刻 - 休憩 2テーブル::休憩開始時刻 )
で求められます。
Offline
スクリプトで1個ずつ計算していけば簡単なのですが、一挙に計算で行うとすると、相当ややこしい問題です。
9時作業開始、休息時間は #1 の条件ですと、休息を無視してタイムテーブルを作り(終了時刻は10:59分などで)、すべての時刻に対して
10:00以降は、10分遅らせる
11:50以降は、60分遅らせる
14:00以降は、75分遅らせる
という計算をすればいいです。これを汎用にするのが結構面倒で、特に開始時刻が変わると相当面倒です開始時刻が9:00以外の場合には、ダミーの作業を入れておく、という運用が簡単です。
とりあえず、開始時刻が9:00に固定されているサンプルです。
https://www.dropbox.com/s/66ctmdbbbycsl … 7.zip?dl=0
Last edited by Shin (2018-06-26 13:53:07)
Offline
チポ様
#6のように入力をしてみましたが以下のようになってしまいます。
品番 作業開始 作業終了 標準時間
A 9: 15 10:00 0:45
B 10: 00 10 : 29 0:19
C 10: 19 10 : 49 0:30
D 10: 49 11 : 06 0 : 17 ...
~
F 11:42 13 : 06 0 : 34
G 12:50 13 : 10 0 : 20 ...
A→Bまでは休憩時間を含まれていますが、Cの「作業開始」が前レコードの「作業終了」を引き継いで表示されませんでした。
それ以降も休憩時間をまたいだ次のレコードから上記のようになってしまいます。
自分のやり方が間違っているのでしょうか...
それと休憩テーブルについての確認ですが、1休憩を1レコードで各時刻を入力。
休憩開始時刻 休憩終了時刻
レコード1 10:00 10:10
レコード2 12:00 12:50
レコード3 15:00 15:15
という表記で間違いはないでしょうか。
Shin様
サンプルありがとうございます。ダミーを使う方法もあるのですね、参考にさせていただきます。
作業開始予定時刻の計算式はpopo1さんが書かれた
Case ( Get ( レコード番号 ) = 1 ; 加工者一覧 2::勤務時間 ; GetNthRecord( 作業終了時間 ; Get ( レコード番号 ) - 1 ))
ですが、
ここで使っている
作業終了時間
が、
作業終了予定時刻
になっていませんか?
私が書いた
作業終了時刻
が正しいですよ。
Offline
書き落とした!
休憩テーブルのレコードは、
popo1さんが書かれた通りでいいですね。
Offline
チポ様
ご指摘の通り「作業開始予定時刻」の式を直したらうまく表示されました。
このたびはありがとうございました。
解決したといいましたが問題が発生してしまったので質問させてください。
以前、2つ以上の休憩時間またぐ作業はないといいましたが超える作業が出てきました。
それが原因なのか休憩時間が加味される時とされない時があります。
問題が発生した時の表示です。休憩時間が加味されているなら...
9:00開始として標準時間が195分だった場合 終了時間が13:15になります。
休憩時間 10分+50分込
しかし、終了時間が12:25と10時の分は足されていますが12時の分は足されませんでした。その時によりますが、10時、12時、15時の全ての休憩時間が足されない時もあります。
やはりまだこちらのリレーション等が間違っているところがあるのでしょうか...
私お作例では、考慮していますよ。
Offline
私の提案は休憩1回に限ります。
2回以降もあるのなら、
まず1回を出して、その作業終了時刻を2回目の作業終了予定時刻として、同様に求めればいいでしょう。
Offline
shin様
確認しましたが2目の休憩をまたぐときもしっかりカウントされていますね。
それをもとにそっくりそのまま作成してみたのですが、自分の場合は2回をまたぐ場合、何故か足されませんでした。
チポ様
申し訳ありません、それを関数等で表してはもらえないでしょうか...
休憩1回を前提とした、前回までの
「作業終了時刻」
を仮に
「作業終了時刻1」
と変更して、
これを前回の
「作業終了予定時刻」
と同じ扱いにして、
「作業終了時刻2」
を求めます。
休憩を3回までまたぐ可能性があるのなら同様に
「作業終了時刻3」
を求めて、それが最終的な作業終了時刻になりますね。
Offline
どこかに、設定の違いがあるのでしょう。
結構微妙な構造で動いていますので、違いをよく探してみてください。
Offline
チポ様
「作業終了時刻1」を「作業終了予定時刻」と同じ扱いにする。
というのは、式も「作業終了予定時刻」と同じものを使い、リレーションも新たに作るのでしょうか?
shin様
やはりどこか見落としがあるのでしょうね。
もう一度チェックしてみます。
そうです。
リレーションから新たに、第一回と同様に設定します。
Offline
チポ様
リレーションは休憩時間を複製して作業テーブルにそれを同様に設定しました。
作業→休憩時間
→休憩時間2
→休憩時間3
フィールドは 「作業終了時刻」を「作業終了時刻1」へ変更、「作業終了時刻2」を作成
して以下のようにしました。
・作業終了時刻1
作業開始 + 標準作業時間
・作業終了時刻2
作業終了予定 + Case( IsValid ( 休憩時間 3::休憩開始 ) ; 休憩時間 3::休憩終了 - 休憩時間 3::休憩開始 )
まだ追加する点、間違っている点あると思うので教えていただきたいです。
> ・作業終了時刻1
> 作業開始 + 標準作業時間
ではないですよ、
前の
作業テーブル::作業終了予定時刻 + Case ( IsValid ( 休憩 2テーブル::休憩開始時刻 ) ; 休憩 2テーブル::休憩終了時刻 - 休憩 2テーブル::休憩開始時刻 )
この計算式は変わりません。
これで得られた作業終了時刻1を使って、
新たなリレーション
作業 休憩 3
作業開始時刻 < 休憩終了時刻
and
作業終了時刻1 > 休憩開始時刻
として、
上記と同様に作業終了時刻2を求めます。
Offline
チポ様
作業テーブルと休憩時間3の設定は終わりました。
作業終了時刻2の式ですが、
作業終了1 + Case( IsValid ( 休憩時間 3::休憩開始 ) ; 休憩時間 3::休憩終了 - 休憩時間 3::休憩開始 )
ということでしょうか..?
それでいいでしょう、
お試しください。
Offline
マラソン・スレッツに、外から大後出し失礼します。
一連の流れを見ていて思ったのですが、
条件付き繰越計算にリレーションを利用すると段取り設定が面倒なので、
リレーション設定を必要としない、複合ExecuteSQL関数式で計算取得
する方法も検討に値するかなぁ? ...と。
Offline
[ Generated in 0.027 seconds, 11 queries executed - Memory usage: 581.49 KiB (Peak: 618.4 KiB) ]