みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもこのサイトで勉強させていただいております。
不明な点が出たため、どうかご教授いただきたく思います。
FMP14 WIN7です。
レイアウトに
「開始_年(例:2016)」「開始_月(例:1)」「開始_日(例:1)」を値一覧で選択、「開始日(2016/1/1)」で日付に計算。
「期間(例:3)」→3ヶ月なんですが、期間が変わる(2ヶ月や4ヶ月)ことを考えてフィールド作成。
「開始(例:2016/1/1)」→「Date(Month(開始日);1;Year(開始日))」で開始月の「1日」を表示。
「終了(例:2016/1/1)」→「Date(Month(開始日)+期間;0;Year(開始日))」で終了月の「月末」を表示しています。
これをもとに、
「日付1」「日付2」「日付3」「日付4」・・・「日付11」「日付12」「日付13」・・・「日付15」「日付16」フィールドを作成し、
毎週水曜日の日付を計算して入れたいのですが、
①毎週水曜日の求め方
②「日付」フィールドが16まであるので、終了月を超えた場合は非表示
の方法がわかりません。
1週間後ということなら「(日付)+7」で1週間後は求められますが、「毎週水曜日」DayNameJを使用するのだと思うのですが・・・
よろしくお願いいたします。
日付フィールドを "水" で検索すれば水曜日だけ検索できます。
3ヶ月を範囲検索で検索しておいて水曜日で絞り込めば良いでしょう。
Offline
すんません。よく読んでいなかった(汗)
スクリプトで開始日から +1 日ずつしていき、DayNameJ で水曜日か否か判定すれば最初の水曜日は求められます。
あとは最初の水曜日に +7 日ずつしていけば次の水曜日が求められます。
Loop で回して水曜日の日付が終了日を越えたら抜ければ良いでしょう。
各水曜日の日付を変数にでも入れておいてあとで展開すればいいのかな、と。
どんなテーブル構成を何の目的で使うかよく分かりませんが、日付1...と作っていくと
期間が延びれば伸びるほどフィールドを作らなくてはいけないので適切ではない気がします。
Offline
Moz様
早速のご回答ありがとうございます。
まったく思いもよらなかったご回答なんですが、
日付フィールドを「水」で検索というのは、どのようにしたらいいのでしょうか?
日付フィールドを計算として、検索の計算式を作るということでしょうか?
お手数ですみません・・・
そっちに質問が(汗)
検索モードで日付フィールドに 水 と入力して検索実行するだけです。
Offline
変数を設定[$dow;DayOfWeek(開始日)]
変数を設定[$next_wed;$start+7+(4-$dow)]//4の部分は求める曜日のDayOfWeek関数の返り値
変数を設定[$end;終了日]
変数を設定[$i;1]
Loop
フィールドを名前で設定[GetFieldName(Evaluate(Get(レイアウトテーブル名)&"::日付"&$i)));$next_wed]
変数を設定[$next_wed;$next_wed+7]
変数を設定[$i;$i+1]
Exit Loop If[$next_wed > $end or $i > 16]
End Loop
検証してませんがこんな感じのスクリプトで動作するんじゃないかと思います。
最初の水曜日を求めるところに NoName さんの計算式を流用したサンプル。
http://xfs.jp/KEpjp
Offline
求める各日付のフィールドを繰り返しにすれば、
計算フィールドに出来ますね。
別テーブルでカレンダーを作れば、
リレーションで持って来ることもできます。
Offline
最初のサンプルは最初の水曜日を求めるところに不具合があったので修正。すんません。
チポさんの繰り返しフィールドのアイデアも盛り込んでみたサンプル。
http://xfs.jp/rUhIv
Last edited by Moz (2016-01-15 12:12:24)
Offline
NoName様
スクリプトありがとうございました。
なるほど、Moz様の「スクリプトで開始日から・・・」のイメージがまったく思い浮かばなかったのですが、
NoName様のスクリプトを見て、なるほどなと思いました。
しかし、私の入力がおかしいのでしょうか・・・スクリプトを実行しても日付の表示がされず、悩んでいたところでした。
Moz様
すみません、前の投稿は行き違いになってしまいました。
また、サンプルまで作成いただき、ありがとうございます。
まさにサンプルの通りの方法です。
レイアウトの下は「繰り返しフィールド」というのを使っているのだと思うのですが、
これだとフィールドをわざわざ16個も作らなくていいので便利ですね。
フィールドを16個も作って、各フィールドに16個(日付○○+7)の計算式を入れていたんですが・・・、
「繰り返しフィールド」の存在は知っていたのですが、データの置き方や抽出時の位置の指定などの概念が
まったく理解できず、繰り返しフィールドのあきらめていました。
サンプルを今からじっくり拝見してみて、どのように処理しているのかを確認してみます。
少々、お時間をいただき、不明な箇所はご質問させていただきます。
水曜日の日付を得てから何をしたいのか分りませんが、
その運用をよく考えてファイル構造を決めた方がいいと思いますよ。
日付だけ得られればいい、
ならば繰り返しでもいいですが、
集計等絡んで来るものなら、繰り返しだと問題が出ることが有るでしょう。
Offline
繰り返しの場合の式例を記述しておきます。
Let(
[
#std=開始日;
#end=終了日;
#dow=DayOfWeek(#std); //開始日の曜日番号
#kyd=4; //水曜日番号
#n=Get(計算式繰り返し位置番号);
#x=#std+(#kyd-#dow)+(#kyd<#dow)*7*#n
];
Case(#x<=#end; #x)
)
↓ 今、実地テストしたら間違ってた。以下に修正ください。
Let(
[
#std=開始日[1];
#end=終了日[1];
#dow=DayOfWeek(#std); //開始日の曜日番号
#kyd=4; //水曜日番号
#n=Get(計算式繰り返し位置番号);
#x=#std+(#kyd-#dow)+(#n-(#kyd>=#dow))*7
];
Case(#x<=#end; #x)
)
Last edited by Hiro (2016-01-15 15:05:02)
Offline
繰り返しフィールドでいいならば、
Let (
d = ( Div ( 開始日[1] - 4 ; 7 ) + Get ( 計算式繰り返し位置番号 ) ) * 7 + 3 ;
Case ( d ≤ 終了日[1] ; d )
)
という簡単な式で良いでしょうね。
Last edited by Shin (2016-01-17 01:17:10)
Offline
Shinさんの式は、
計算の起算日、
0001/1/1(FMの日付データの起算日です)が月曜日
で有ることを使っていますね。
それが分からなければ、
DayOfWeek
を使うことになります。
独白・・
日付に対する曜日って誰がどのように決めたんでしょう?
Offline
結果的にはそうですが、発想の起点は、開始日が西暦1年以降の第何週目か、を計算させています。それがわかれば後は簡単ですね。
Offline
Pages: 1
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 550.43 KiB (Peak: 571.34 KiB) ]