みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
FMpro12を使っています。
あるスクリプトステップを教えてほしいです。
ポータル表示にて、「開始時間」と「終了時間」のフィールドがあります。
この開始時間と終了時間には、ある部屋を予約するために不特定多数のスタッフがこのレイアウトにアクセスして予約を入れます。
例えば、
ポータル標示
「スタッフ名」 「開始時間」 「終了時間」
佐藤 12:00 13:00
後藤 13:10 14:00
今田 15:00 16:00
というように個々のスタッフが部屋を使いたい時間を入力していきます。
日付は今回はいりません。
今回、やりたいのは、開始時間と終了時間で使用する時間帯が他のスタッフと重なってたらダイヤログボックスで「時間が重なっています」という警告表示を表示させたいです。
素人ながら色々考えてみたのですが、終了時間フィールドにスクリプトトリガ設定でOnObjectSaveに「1つの開始時間レコードが他の終了時間レコードよりも前にあったら警告」というスクリプトステップを入れればいいのかなというところまでは考えました。
ポータル表示していて、レコードが複数あるのでどんなスクリプトステップを使えばいいのか分かりません。
「そもそもフィールドの置き方をこうした方がいい」などの意見があればご教授いただきたいです。
考え方が浅はかですが、このスクリプトステップを教えてもらえないでしょうか?
Offline
・「時間帯」計算フィールド(式:開始時間 &","& 終了時間)をポータルテーブルに作っておくこと
・ポータルに新規入力した開始時間と終了時間を取得、下記式に代入できること
を前提とした式は、(かなり冗長なループ式になってしまい、もっとシンプルな式が有るかも?)
Let(
[
$vlt=List(ポータル::時間帯);
$str=入力開始時間;
$end=入力終了時間;
$i=0;
$flg="";
$fnc=
"Case($i=ValueCount($vlt); $flg;
Let([
$i=$i+1;
#itm=GetValue($vlt; $i);
#itm=Substitute(#itm; [\",\";\¶]);
#str=GetAsTime(GetValue(#itm; 1));
#end=GetAsTime(GetValue(#itm; 2));
$flg=List($flg
;Case($str>=#str and $str<=#end; 1)
;Case($end>=#str and $end<=#end; 2)
;Case($str<#str and $end>#end; 3)
)
]; Evaluate($fnc))
)";
$flg=Evaluate($fnc);
$flg=FilterValues(List(1;2;3); $flg);
$flg=Substitute($flg
;[1;"・開始時間が重複予約です。"]
;[2;"・終了時間が重複予約です。"]
;[3;"・終了時間内に予約済時間帯が含まれています。"]
)
];
$flg
)
Last edited by Hiro (2017-07-26 03:23:25)
Offline
Hiro様 ありがとうございます。
1点質問ですが、このlet関数はスクリプトですか?
スクリプトでlet関数は作れるのでしょうか?
>・「時間帯」計算フィールド(式:開始時間 &","& 終了時間)をポータルテーブルに作っておくこと
これはつくることができました。
その後の、作って頂いた式の運用方法を教えて頂きたいです。
Offline
> 1つの開始時間レコードが他の終了時間レコードよりも前にあったら警告
これは正確ではないですよ。
開始時刻が他方の終了時刻より前
かつ
終了時刻が他方の開始時刻より後
これが重複です。
これをリレーションにすれば、
関連レコードの有無で重複判定ができますね。
Offline
チポ様
ありがとうございます。
ということは、ポータル表示しているテーブルをもう1つ作って、リレーションすればいいのですかね。
(あまりしっかり理解できていないかもしれませんが。。。)
予定表示ポータル1 予定表示ポータル2
開始時刻 < 終了時刻
終了時刻 > 開始時刻
こうすれば、該当するレコードだけ表示されますかね?
関連レコードが無い場合、ダイヤログボックスで注意喚起できるのでしょうか?
Offline
リレーションシップグラフでテーブルを複製してそれで自己リレーションですね。
その照合ですが、
書かれたのに加えて、
部屋の照合も必要なのでは。
さらにこのままでは自身とも照合されますので、
関連レコードが1か2以上かで重複の判定になります。
しかし、これはレコード確定後ではないと判定出来ません。
ユニークな値のフィールドを ≠ で照合させれば、
レコード確定以前でも判定出来ます。
その判定の表示は、
計算フィールドにして、判定結果の表示でもいいでしょうし、
スクリプトトリガでスクリプト実行させ、カスタムダイアログで表示でもいいでしょう。
Offline
嗚呼、入力時間ごと個別精査せず、範囲にマルメて一括精査するチポさん案が断然楽ですネ。
2入力値の個別アラートは無用なようなので、私の案はボツください。
Offline
入力時に、GUIでダブルブッキングを防ぐサンプルです。
https://fm-aid.com/bbs2/viewtopic.php?id=1616
のスレッドを参照ください。
Offline
チポ様
ありがとうございます。
リレーションシップグラフでテーブルを複製してそれで自己リレーションですね。
その照合ですが、
書かれたのに加えて、
部屋の照合も必要なのでは。さらにこのままでは自身とも照合されますので、
関連レコードが1か2以上かで重複の判定になります。
しかし、これはレコード確定後ではないと判定出来ません。ユニークな値のフィールドを ≠ で照合させれば、
レコード確定以前でも判定出来ます。その判定の表示は、
計算フィールドにして、判定結果の表示でもいいでしょうし、
スクリプトトリガでスクリプト実行させ、カスタムダイアログで表示でもいいでしょう。
ポータル表示しているテーブルを複製して自己リレーションするところまでやりました。
分からない点を3点ほど質問させていただいていいでしょうか?
①部屋の照合は必要でしょうか?
予約に使う部屋は1つなので照合はいらないと思うのですが・・・
②あと、「自身とレコードが重複する」というのは、どういうことですか?
同じ名前のスタッフが重複しないようにするということですか?
同じ名前のスタッフが違う時間帯で予約することもあります。
例えば、「佐藤」が10:00~12:00と14:00~15:00といった感じです。
③あと最後に、判定の表示はどのようなスクリプトステップを踏めばいいでしょうか?
今回、このスクリプトステップが分からず相談をさせて頂きました。
すいません。
Offline
> 予約に使う部屋は1つなので照合はいらないと思うのですが
部屋一つなら照合の必要はありませんね。
> 「自身とレコードが重複する」
時刻の範囲のみの照合だと、自身のレコードとも照合するということです。
> ユニークな値のフィールドを ≠ で照合させれば
こうすることによって自身のレコードとは照合しない様にできます。
これは試してみればお分かりになるかと思いますよ。
スクリプトの考え方は、
関連レコードの有無を見て、あれば重複ですから、カスタムダイアログを出す。
でいいでしょう。
If [ IsValid ( 予約表示ポータル2::適当なフィールド ) ]
カスタムダイアログ
・・・
End If
こんなかんじで。。
Offline
チポさん案をお借りして、
リレーション計算式だけを使い、
ポータル内の新規入力行に「重複」警報をフィールド表示する
サンプルをアップしました。
●サンプル「ポータル内重複入力チェック.fmp12」 → https://yahoo.jp/box/th7faC
Offline
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 550.7 KiB (Peak: 571.6 KiB) ]