みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっております。
祝休日開けの日付を出す計算式を教えて頂きたいです。
銀行の休業日開けを出したいのですが現在別テーブルで祝日一覧を持っています。
振込日が祝日一覧と同じ、及び12/31~1/4、及び土日ならば入金日が翌平日、となる計算を行いたいです。
宜しくお願い致します。
FM18
Last edited by 中田 (2020-01-25 17:35:03)
Offline
FM18限定の回答です(17以前はWhile関数が使えないので)
1)祝日一覧と現在のテーブルをデカルト積[X}でリレーションします。
2)入金日フィールド(計算フィールド)の計算式を以下のように設定します(結果タイプ:日付)。
While (
[
theDay = 振込日 //振込日で初期化
];
/*** 下記に該当する日の間は繰り返す ***/
DayOfWeek ( theDay ) =1 or DayOfWeek ( theDay ) = 7 //日曜日、土曜日
or PatternCount ( List ( 祝日一覧::日付 ) ; theDay ) //祝日
or DayOfYear ( theDay ) ≤ 3 or DayOfYear ( theDay ) ≥ 365; //年末年始
[
//日付を1日繰り上げながら調べる
theDay = theDay + 1
] ;
theDay
)
※最初の投稿では、年末年始を見落としていました。
Last edited by koeda (2020-01-25 20:35:09)
Offline
私の#2の回答だと、振込日の"2020/02/24"が祝日一覧の"2020/2/24"とPatternCountで一致しないと判定されてしまいます。
とりあえず祝日一覧の日付フィールドと振込日フィールドについて、ゼロ埋めの有無について書式を揃えておけば良いとは思いますが。
お金がからむ機能だけに、しっかりと検証する必要がありそうです。
Last edited by koeda (2020-01-25 20:43:34)
Offline
私の#2の回答だと、振込日の"2020/02/24"が祝日一覧の"2020/2/24"とPatternCountで一致しないと判定されてしまいます。
「日付」の照合精査を「テキスト」判別に持ち込んでいるのがそもそもの原因なので、
ExecuteSQLで直接日付同士で照合判別するようにする策が抜本的解決策となるでしょう。
(※ExecuteSQLだと[X]リレーションなど一切の他の事前設定も不要となる利点もあり)
・or PatternCount ( List ( 祝日一覧::日付 ) ; theDay )
↓
・or ExecuteSQL("SELECT COUNT(*) FROM ""祝日一覧テーブル"" WHERE ""祝日""=? "; ""; ""; theDay)
Offline
Hiroさん、ありがとうございます!
日付で照合してCountを取るところまでは思いついたのですが、それをExceuteSQLで解決するアイディアは浮かびませんでした。
下記コードを動かして、狙いどおりに動作することを確認できました。
While (
[
theDay = 振込日 //振込日で初期化
];
/*** 下記に該当する日の間は繰り返す ***/
DayOfWeek ( theDay ) =1 or DayOfWeek ( theDay ) = 7 //日曜日、土曜日
or ExecuteSQL("SELECT COUNT(*) FROM ""祝日一覧"" WHERE ""日付""=? "; ""; ""; theDay) //祝日
or DayOfYear ( theDay ) ≤ 3 or DayOfYear ( theDay ) ≥ 365; //年末年始
[
//日付を1日繰り上げながら調べる
theDay = theDay + 1
] ;
theDay
)
Last edited by koeda (2020-01-26 00:22:50)
Offline
koeda様、Hiro様、丁寧に分かりやすく教えて下さり本当にありがとうございます。
無事思うとおりの結果が得られるようになりました。
重ねて大変申し訳ないのですがWhile関数を使わない方法はありますでしょうか?
クライアントの1台が古いiMacでElCapitanまでしか入らずFM16だったのを失念しておりました。
後出し、申し訳ありません。
大変身勝手なお願いですが宜しくお願い致します。
Offline
銀行の営業日テーブルを作った方が、簡単でシンプルかも、ですよ。
Offline
重ねて大変申し訳ないのですがWhile関数を使わない方法はありますでしょうか?
While関数を使わない自家ループ式は、(※式は脳内式で、動作検証は行っていません)
Let(
[
$LOOP=
"
Case(
/*** 下記に該当する日の間は繰り返す ***/
DayOfWeek($theDay)=1 or DayOfWeek($theDay)=7 /*日曜日、土曜日*/
or ExecuteSQL("SELECT COUNT(*) FROM ""祝日一覧"" WHERE ""日付""=? "; ""; ""; theDay) /*祝日*/
or DayOfYear($theDay)<=3 or DayOfYear($theDay)>=365 /*年末年始*/
; Let([$theDay=$theDay+1]; Evaluate($LOOP))
; $theDay
)
"
];
Let([$theDay=振込日付 /*振込日で初期化*/]; Evaluate($LOOP))
)
Last edited by Hiro (2020-01-26 12:25:11)
Offline
Shin様、確かにその方が簡単な気がしましたがこれを機会に疑似ループ的なものを勉強させて頂きます。
Hiro様、いつも教えて下さりありがとうございます!
Hiro様の式を元にエスケープなど加えたら出来ました!
式の内容はまだ理解出来ていませんが勉強させて頂きます。
ありがとうございました。
Offline
すいません、一度解決としましたが再度質問させて下さい。
Hiro様の式を元にして出来るようになったのですが恐らくですが式の内容が変更されたように思います。
変更前のものを元にしたのですが下記の式でも合っていますでしょうか?
それと何故これでループになるのか概念的なものを教えて頂けないでしょうか?
重ね重ね宜しくお願い致します。
Let(
[
$theDay=振込日付;
$LOOP=
"
Case(
DayOfWeek($theDay)=1 or DayOfWeek($theDay)=7
or
ExecuteSQL(\"SELECT COUNT(*) FROM \\\"祝日一覧\\\" WHERE \\\"日付\\\"=? \"; \"\"; \"\"; $theDay)
or
DayOfYear($theDay)<=3 or DayOfYear($theDay)>=365
; Let([$theDay=$theDay+1]; Evaluate($LOOP))
; $theDay
)
"
];
Evaluate($LOOP)
)
Last edited by 中田 (2020-01-26 13:05:38)
Offline
お世話になっております。
何となくですが理解出来てきました。
最初の$Loopでテキスト式を出しそれを最後のEvaluateでCaseから外れるまで自己参照的に繰り返される、のかなと。
なので
$theDay=振込日付
が最初のLetで規定しても最後のEvaluateの前で規定しても同じなのだろうと理解しました。
ありがとうございました。
Last edited by 中田 (2020-01-26 15:40:17)
Offline
Pages: 1
[ Generated in 0.011 seconds, 9 queries executed - Memory usage: 531.98 KiB (Peak: 552.52 KiB) ]