みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっています。
環境はwin10 fmp13です
とても説明しずらいのですが、フィールドは日付と曜日とシフトがあります。
下記のように1か月分が表示されています。
シフトには公休がランダムに入ってるのですが、月曜から木曜までの4日間のうちの
公休じゃない日でかつ、できるだけ曜日の早い2日間を”特別”とシフト2フィールドを作って
表示し残りを”普通”と表示できるフィールドを作りたいのです。
すっとifとcaseでできるかといろいろとやってみたのですが目的のものが達成できなかったので
教えていただければと思い投稿いたしました。
初歩的な質問かもしれませんが煮詰まっています。
ご教授お願いします
日付 曜日 シフト
1 土
2 日
3 月 公休
4 火
5 水
6 木
7 金
8 土
9 日
10 月
11 火
12 水 公休
13 木
14 金
15 土
16 月
Offline
日付とシフトだけで計算できます。
ただし、データは日付で昇順ソートされているものとし、
また、月曜~木曜が月を跨ぐ場合は、その前または後月のデータが必要です。
Let([
$dow=DayOfWeek(日付);
$n=2-$dow;
$sub="List(
Case(GetNthRecord(シフト;Get(レコード番号)+$n+0)<>\"公休\"; 日付+$n+0);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+1)<>\"公休\"; 日付+$n+1);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+2)<>\"公休\"; 日付+$n+2);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+3)<>\"公休\"; 日付+$n+3)
)";
$fnc="Case(FilterValues(LeftValues(Evaluate($sub); 2); 日付+0)<>\"\"; \"特別\"; \"普通\")"
];
Case(Filter("2345";$dow)<>""; Evaluate($fnc))
)
なお、公休は普通を表示しない場合は、
\"普通\")" → Case(シフト<>\"公休\"; \"普通\"))"
Last edited by Hiro (2017-05-13 01:24:37)
Offline
Hiro様
ご返信ありがとうございます。
まさに私がか教えてほしいとお願いしたまんまの答えでしたありがとうございます。
私には何をしているのかがわからなかったのでこの内容をしっかり読み解いていきます。
しかし、教えていただいたものは完ぺきだったのですが、私が無能すぎでした。
教えていただいた内容から工夫して答えを出そうとしてみたのですがどうしてもできなかったので
もう一度教えていただきたいです。
内容的に違った理解でした。
1週間7日のうち、日曜日から木曜日の中で”公休”が1回の時もあれば2回の時もあり
”公休”が1回であれば”特別”は2回、”公休が”2回であれば”特別”は1回、”公休”が0回であれば”特別”が3回
”公休”が3回であれば”特別”が0回
というように1週間の”公休”が何回あるかという条件が変更する中で”特別”がつくようにしなければなりませんでした。
もし可能なら1週間の”公休”でも”特別”でもない日(金・土と平日の1日)は”普通”と表示できるようだと便利です。
教えてくださいばかりで申し訳ないのですが、困っています。
どうぞよろしくお願いします
Offline
修正箇所を赤色で示しておきます。
ただし、この修正式は、"特別"は、日曜も、平日の月初日でも、
付くことができるように条件を組んであります。
都合が悪い場合はお知らせください。
(また、前と同じく、データは日付で昇順ソートされているものとし
、日曜~木曜が月を跨ぐ場合は、その前または後月週のデータが必要です。)
Let([
$dow=DayOfWeek(日付);
$n=1-$dow;
$sub="List(
Case(GetNthRecord(シフト;Get(レコード番号)+$n+0)<>\"公休\"; 日付+$n+0);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+1)<>\"公休\"; 日付+$n+1);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+2)<>\"公休\"; 日付+$n+2);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+3)<>\"公休\"; 日付+$n+3);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+4)<>\"公休\"; 日付+$n+4)
)";
$fnc="Case(FilterValues(LeftValues(Evaluate($sub); 3-(5-ValueCount(Evaluate($sub)))); 日付+0)<>\"\"; \"特別\"; \"普通\")"
];
Case(Filter("12345";$dow)<>""; Evaluate($fnc) ; "普通")
)
※データ変更を全表示レコードに更新・反映するには「ウインドウ内容の再表示」を行います。
Last edited by Hiro (2017-05-14 13:21:44)
Offline
【 訂 正 】
> 1週間7日のうち、日曜日から木曜日の中で
は、ヒョットして他の文脈から、「月曜日から木曜日」の誤りですかネ?
すると、先の#4式は誤式なので以下に訂正して下さい。
条件を再確認します、
・月曜~木曜の中で、"公休"数に応じた数の"特別"を上位順で代入(0:3, 1:2, 2:1; 3:0)
・月曜~土曜の中で、"公休"と"特別"以外は"普通"を代入(金・土と[月~木]中残1日の計3日)
・金曜~日曜は "公休"の指定は無く、日曜は計算対象外とする
Let([
$dow=DayOfWeek(日付);
$n=2-$dow;
$sub="List(
Case(GetNthRecord(シフト;Get(レコード番号)+$n+0)<>\"公休\"; 日付+$n+0);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+1)<>\"公休\"; 日付+$n+1);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+2)<>\"公休\"; 日付+$n+2);
Case(GetNthRecord(シフト;Get(レコード番号)+$n+3)<>\"公休\"; 日付+$n+3)
)";
$cnt="3-(4-ValueCount(Evaluate($sub)))";
$fnc="Case(
FilterValues(LeftValues(Evaluate($sub); Evaluate($cnt)); 日付+0)<>\"\"; \"特別\";
GetValue(Evaluate($sub); Evaluate($cnt)+1)=日付+0; \"普通\"
)"
];
Case(Filter("2345";$dow)<>""; Evaluate($fnc); Filter("67";$dow)<>""; "普通")
)
※前と同じく、データは日付で昇順ソートされているものとし
※月曜~木曜が当月を跨ぐ場合は、その前後月週のデータが必要です。
※データ変更を全表示レコードに更新・反映するには「ウインドウ内容の再表示」を行います。
Last edited by Hiro (2017-05-15 11:23:17)
Offline
Pages: 1
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 562.48 KiB (Peak: 578.05 KiB) ]