みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
お世話になります。
環境:FM Pro14 Win版64bit
テーブルA:スタッフマスタ
テーブルB:予約テーブル
2つのテーブルは、スタッフIDでリレーションしています。
予約は1日指定ではなく期間指定で、予約テーブルには、開始日と終了日のフィールドがあります。
この状態で検索条件として、今日から5日後まででAさんに予約が入っているか確認はできるのですが、
今日から5日後までの間に、空いているスタッフの一覧抽出の方法が構築できずに悩んでいます。
ご教示のほど、よろしくお願いいたします。
Offline
今日と5日後を入力するグローバルフィールドを二つ作り、
リレーションを
今日 <= 終了日
and
5日後 >= 開始日
とすると、
今日から5日後までに予約が有るレコードが照合されます。
ですから、
上記のリレーションで
関連レコードへ移動
とし、
対象レコードを絞り込んだ状態で、
テーブルAへ
関連レコードへ移動[対象レコード内の全てのレコードを照合]
として、
テーブルAで対象、対象外を入れ替えれば、
予約の無いスタッフのレコードが対象レコードとなりますね。
もっと簡単にできるかな・・?
Offline
スタッフマスタに次の形で判定フィールドを作成し、今日+5日の間に予約が入っているスタッフを検索して対象外と入替すれば抽出可能です。
G_日付[計算] 日付型 グローバル 繰り返し:5
Get( 日付 )+ Get(計算式繰り返し位置番号) - 1
予約一覧[計算] 数字型 繰り返し:5
Let ( [
%day = GL_DAY;
%start = Min ( 予約::予約開始日 );
%end =Max ( 予約::予約終了日 )
];
Case ( %start <= %day and %end >= %day ;"1";"0")
)
リレーションは スタッフマスタのスタッフと予約のスタッフのフィールドを=で
このようにすると、予約一覧フィールドには本日から+5日を繰り返しで表現し、
予約が入っていれば"1"、なければ"0"を表示します。
この状態で次のようなスクリプトを実行すると、予約一覧の全ての繰り返しフィールドが"0"であるスタッフが取得可能です。
レイアウト切替[スタッフマスタ]
検索モードに切替
変数を設定[$i;1]
Loop
Exit Loop If[$i > 5]
フィールドを名前で設定[GetFieldName(Evaluate("スタッフマスタ::予約一覧["& $i &"]";"1"]
変数を設定[$i;$i+1]
End Loop
検索実行
あとは特定のレイアウトのスクリプトトリガに設定するなどすればよいかと思います。
訂正です
検索実行の後に「対象外のみを表示」しないと全てが0(5日間予約なし)のスタッフが抽出できません
また、予約レコードが多くなると Min,Maxの計算が遅くなりますので
必要に応じて日付でリレーションを絞り込むか、レコード全置換で行うなどした方がいいかと思います。
>チポさま
回答ありがとうございます。
関連レコードがどういうものかもわかっていない初心者ですが、これより取り組んでみます!
>ゲストユーザーさま
回答ありがとうございます。
取り急ぎ、お返事を。
予約5日後としたは固定ではないのです。1日もあれば10日もあるのです。
詳細記述が足らず、申し訳ありませんでした。
Offline
>チポさま
>ゲストユーザーさま
結局、関連レコードへ移動のスクリプトの組み立てが分からず・・・
●リレーション
スタッフIDのみ連結。
●呼び出し元のレイアウトに設置したボタンのスクリプトに、
レイアウト切り替え[テーブルA]
「検索モードに切り替え」にて、
レコードを対象外に、開始日:[>=検索開始日(改行)<=検索終了日]
レコードを対象外に、終了日:[>=検索開始日(改行)<=検索終了日]
を指定してみました。うまく抽出できたように思います。
Offline
今日と5日後を入力するグローバルフィールドを二つ作り、
リレーションを
今日 <= 終了日
and
5日後 >= 開始日
とすると、
今日から5日後までに予約が有るレコードが照合されます。
・・・・・
・・・・・
もっと簡単にできるかな・・?
1度設定しておけば、後は計算式で自動算出できる方法が楽かな。
・チポさんのリレーションで動的値一覧「予約済みスタッフ一覧」を作ります。
・また、スタッフテーブルで値一覧「全スタッフ一覧」を作ります。
用意はこれで完了。
後は、「全スタッフ一覧」集合と「予約済みスタッフ一覧」集合との差集合を求めれば良いので、
ちょうど、FilterValuesの逆関数、すなわち、非フィルター値の方を得る式を組みます。
・式は、(計算結果は非保存へ設定、値は「空きスタッフの一覧リスト」が返ります。)
Let([
$prm[1]=ValueListItems(Get(ファイル名);"全スタッフ一覧");
$prm[1]=¶ & $prm[1] & ¶;
$prm[2]=ValueListItems(Get(ファイル名);"予約済みスタッフ一覧");
$prm[2]="[\"\¶" & Substitute($prm[2]; [¶; "\¶\";\"\¶\"];[\"\¶"]) & "\¶\";\"\¶\"]";
$prm[2]="Substitute($prm[1];" & $prm[2] & ")";
$res=Evaluate($prm[2]);
$res="\"" & Substitute($res;[¶;"\";\""]) & "\";\"\"";
$res="List(" & $res & ")"
];
Evaluate($res)
)
Offline
>Hiroさま
いつも回答ありがとうございます。
夜遅くまでお疲れ様です。
イメージは掴めましたし、こんな方法があるのかと感心しました。
大変申し訳ありませんが、初心者に高度なテクニックは理解しにくいのです。
触ったことのないスクリプトが出てきて分からないので、詳しくご教示いただけないでしょうか?
Get(ファイル名)と使うということは、スタッフテーブルと予約テーブルがあるFMファイルと、空きリストを抽出したいFMファイルとが離れているということでしょうか?
それとも自身を見にいくイメージでしょうか?
こんなことも理解できないのは自分でも残念ですが、あまり時間がないので頼らせてください。
よろしくお願いいたします。
Offline
値一覧の内容を得るValueListItems関数の用法は、ValueListItems("ファイル名"; "値一覧名")
の様にファイル名と値一覧名とを指名して呼び出します。
その時に、自己ファイルならファイル名をGet(ファイル名)関数で動的に取得するようにすると、
何かと重宝です。
例えば、ファイル名を変更したときでも自動的に更新されますし、また、式は抽象化されるので、
他のファイルでも汎用式として使い回しも可能です・
Last edited by Hiro (2016-05-20 00:09:28)
Offline
>Hiroさま
ご丁寧なご教示ありがとうございました。
とても参考になります!
ご提示の方法ではありませんが、一応、目的は達成できましたので、解決とさせていただきます。
ありがとうございました。
Offline
[ Generated in 0.009 seconds, 9 queries executed - Memory usage: 588.22 KiB (Peak: 604.76 KiB) ]