みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
ご無沙汰しております。また一つ教えていただきたいことがありましてトピックを立てさせてもらいます。
よろしくお願いします。
テストを受けた日付を、学年ごとにクロス集計を、繰り返しフィールドを用いて行おうと思います。
【テーブルA:レコード】[フィールド名]
[テスト日] [学年] [名前]
3/1 4年 AAA
3/1 4年 BBB
3/1 5年 あああ
3/2 4年 おおお
3/8 4年 CCC
3/8 4年 DDD
3/8 4年 EEE
3/10 5年 かかか
3/11 4年 HHH
3/13 4年 FFF
3/13 5年 いいい
3/13 5年 ううう
3/16 4年 GGG
3/17 5年 えええ
というようなレコードがあります。
基本的に3/1、3/8、3/13というように、日付のデータが共通したレコードがメインで、
一部、そのメインの日付ではないレコードが混じります。
これを繰り返しフィールドに、
3/1、3/2〜3/8、3/9〜3/13、3/14以降 というような感じで分類し、
その下に、繰り返し集計フィールドと、集計パートを利用して、次のようにクロス集計を行いたいわけです。
【テーブルA:集計レイアウト】〈繰り返しフィールド〉
<日付一覧> 3/1 3/8 3/13 3/14以降
[学年]<人数一覧>
4年 2 4 2 1
5年 1 0 3 1
繰り返しフィールドの日付の境目になるレコードは、テーブルを別にしておきます。
【テーブルB:レコード】
[日付]
3/1
3/8
3/13 ←★これが最後の境目になる
このテーブルBの全データを参照する値一覧「全日程」を作っておきます。
集計レイアウトのほうは、テーブルBの日付の全データを参照して、繰り返しフィールドに、
先頭から順に埋めていきます。
<日付一覧>は、GetValue ( ValueListItems (Get(ファイル名) ; "全日程" ) ; Get ( 計算式繰り返し位置番号 ) )
<人数一覧>は、Case(テスト日[1]<=日付一覧[Get(計算式繰り返し位置番号)] and テスト日[1]>日付一覧[Get(計算式繰り返し位置番号)-1];1;"")
というような式にしてとりあえず、イメージに近い状態になっているのですが、
繰り返しフィールドの方に「3/14以降」をどのように表示すればいいかと、人数一覧に設定する数式のイメージが掴めなくて質問をさせていただこうと思いました。
Letを使って再帰式・・・といういつかHiroさんに教えていただいた方法なのか?!とも思うのですが・・・・相変わらず再帰式はよくわかっていません。
わかりやすい方法があれば教えていただければ幸いです。
よろしくお願いいたします。
FMP11
MacOSX10.9
Offline
内容読み切れていませんが、こんなこと?
<日付一覧の式>
Let([
#vl=ValueListItems(Get(ファイル名);"全日程");
#mx=ValueCount(#vl)+1;
#n=Get(計算式繰り返し位置番号)
];
Case(
#n<#mx; GetValue(#vl;#n);
#n=#mx; Let([#dt=GetValue(#vl;#n-1);#y=Year(#dt);#m=Month(#dt)];Date(#m+1;0;#y))
)
)
<人数一覧の式>
Case(日付一覧[Get(計算式繰り返し位置番号)-1]<テスト日[1] and テスト日[1]<=日付一覧; 1)
Offline
Case (
Day (テスト日[1] ) = 1 and Get ( 計算式繰り返し位置番号 ) = 1 ; 1 ;
1< Day (テスト日[1] ) and Day (テスト日[1] ) < 9 and Get ( 計算式繰り返し位置番号 ) = 2 ; 1 ;
9 < Day (テスト日[1] ) and Day (テスト日[1] ) < 14 and Get ( 計算式繰り返し位置番号 ) = 3 ; 1 ;
15 < Day (テスト日[1] ) and Get ( 計算式繰り返し位置番号 ) = 4 ; 1
)という繰り返し計算フィールドを作り、これの集計フィールドを作ります。
集計レイアウトで、学年をキーとする小計パートを作り、学年でソートすれば良いです。
Last edited by Shin (2014-03-19 14:55:31)
Offline
Shinさんのだと「メインとなる日付」が固定になってしまうのでは。
全然分かってないけど、日付一覧に「3/14以降」が作れないということなのかな?
他の日付もテスト日と同じではないわけですから単に「3/14」にしたらいいのでは。
Shinさんのだと「メインとなる日付」が固定になってしまうのでは。
ご指摘の意味がよくわからないですが、
とりあえず、上の式の不具合を訂正しておきました。
https://dl.dropboxusercontent.com/u/926 … 85.fp7.zip
Offline
計算式に1,9,15が埋め込まれてるので、「繰り返しフィールドの日付の境目になるレコードは、テーブルを別にしておきます。」という仕様が反映されてないという意味です。
テスト実施日だから、毎月変わるのでは。
Hiroさんのは、「3/14以後」じゃなく「3/31」でやろうとしてるんですね。1か月分の集計ならそれでもよさそうだけど、どうかな
「以降」を付けたがために面倒なことになったサンプル
http://pupld.net/21/140319/bfpojab498/index.cgi
テスト日付.fp7 (検証不十分)
わざわざ別テーブルに置く必要があるのかな。
同じテーブル内の繰り返しグローバルフィールドに設定(別テーブルに置いても参照が変わるだけ)するとして、
Let (
n = Get ( 計算式繰り返し位置番号 ) ;
Case (
n = 1 ; テスト日[1] ≤ 日区切[n] ;
IsEmpty ( 日区切[n-1] ) ; "" ;
IsEmpty ( 日区切[n] ) ; 日区切[n-1] < テスト日[1] ;
日区切[n-1] < テスト日[1] and テスト日[1] ≤ 日区切[n] ; 1
)
)という式に置き換えればいいだけ。(却って簡潔になりました)
ところで、例で言えば、3/1以前はどう扱うのでしょうか。
Last edited by Shin (2014-03-19 17:34:55)
Offline
私のは3/16と3/17を3/13に変更すると3/13グループに入るのに
日付一覧が「3/13以降」になってまう。で、没ということで・・・
沢山のアイデアありがとうございます。
みなさん、相変わらずすばらしい腕前ですね^^;
質問した僕がついて行けなくなりそうです・・・(笑
Shinさん、ひとつ質問なんですが、Caseの中の、
Case (
n = 1 ; テスト日[1] ≤ 日区切[n] ;の部分ですが、caseって、条件1;結果1;条件2;結果2と使いますよね?
この部分が、複数の条件のようになっていませんか?なぜこれで動作するのですか?
Offline
あ、Shinさんちなみに3/1より前は、前年度の最終日以降という分類になります。
毎年、一番最初のテストの開始日から集計をはじめていきます。
それと、区切りを別テーブルにしているのは、教室Aと教室Bでは、区切りとなる日程が異なるからです。
それは集計表示の都合だけで、データベースとしてはあまり意味がないので、Shinさんのアイデアのように、区切りフィールドを持たせるのもありだと思います。
ただ、複数の教室が同時に使用するものになるので、分けておく方がいいのかなと考えた次第です。
Last edited by youkazu7777 (2014-03-20 02:02:43)
Offline
Travellerさんのサンプルもわかりやすいですね。
もうしわけありません、私が「以降」とわざわざ付けてしまったので、無駄にややこしかったかも知れません。
特に、「以降」と表示が絶対に必要というわけでもなかったのですが、この方法ですとスマートに表示できています。参考にさせていただきます。
あ、それとボツとおっしゃっていますが、特にこの仕様でも問題ないと思います。最後のテスト日以降はぜんぶ以降として集計してもとくに差し支えはないので・・・
Offline
Hiroさんありがとうございます。
timさんご指摘のように、月末締めの集計という仕様ですね。
意図しているのは、テストの実施日を数回のチラシで告知するのですが、そこで設定されたテスト日とテスト日の間に、どれだけの人が受けに来たかがわかるようにするためのものです。
Offline
やはり、前年度があったのですね。皆さん作り直しかと。
そちらのテーブルから集計毎に期日を取り出して、繰り返しフィールドに設定するようにすれば良いでしょう。
FMは、論理計算の結果を、真なら1,偽なら0を返します。それを利用しています。
また、条件式も、0またはnull以外を設定しておけば真、として処理されます。
Offline
あ、そうか・・・
このままだと前年度が全部一番最初のところに集計されてしまうのか。
最初の所、
n = 1 ; テスト日[1] = 日区切[n] ;でも、いけますよね?
Offline
第1の区切りが、今回は1日だったので、=でもいいけど、それが1日以外になるかもしれないので、駄目です。
Offline
未だ完全には読み切れてませんが、
もし、例示の3/1が期首日付(2014/03/01)、3/14以降が期末日付(2015/02/28)を意味するとしたら、こんな式かな?
<日付一覧の式>
Let([
#vl=ValueListItems(Get(ファイル名);"全日程");
#mx=ValueCount(#vl)+1;
#n=Get(計算式繰り返し位置番号)
];
Case(
#n<#mx; GetValue(#vl;#n);
#n=#mx; Let([#dt=GetValue(#vl;1);#y=Year(#dt);#m=Month(#dt);#d=Day(#dt)];Date(#m;#d-1;#y+1))
)
)
<人数一覧の式>
Let([
#n=Get(計算式繰り返し位置番号)
];
Case(
#n=1; Case(テスト日[1]=日付一覧; 1);
Not(IsEmpty(日付一覧)); Case(日付一覧[#n-1]<テスト日[1] and テスト日[1]<=日付一覧; 1)
)
)
Offline
日の区切りを
Let (
[
yy = Int ( 月度[1] ) ;
mm = ( 月度[1] - yy ) * 100 ;
dl = List ( Date ( mm ; 0 ; yy ) ; List ( 教室毎締日::締日 ) ; Date ( mm + 1 ; 0 ; yy ) )
] ;
GetValue ( dl ; Get ( 計算式繰り返し位置番号 ) )
)繰り返し側を
Let (
n = Get ( 計算式繰り返し位置番号 ) ;
Case (
IsEmpty ( 日区切[n] ) ; "" ;
日区切[n] < テスト日[1] and テスト日[1] ≤ 日区切[n+1] ; 1
)
)にしておいて、集計。
https://dl.dropboxusercontent.com/u/926 … 85.fp7.zip
も更新。
Last edited by Shin (2014-03-21 22:44:22)
Offline
みなさんありがとうございます。
とりあえず、今回はShinさんのご提案いただいた方法が簡単に思いましたので、そちらの方向で作っていくことにしました。
ただ、サンプルデータの偏りが、誤解を与えてしまったようです。申し訳ありません。
年度の開始は、10月途中で、そのまま半年間ぐらいずっとテストの実施期間が続きます。また期間の終わりはきちっと決まっておらず、必要に応じてその都度集計期間を限定して集計しなければなりません。
Hiroさんの式や、Shinさんの式を参考に改変して使わせていただきました。
Let ([
n = Get ( 計算式繰り返し位置番号 )
];
Case (
n = 1 and テスト日[1] = 区分[n] ; 1;
IsEmpty ( 区分[n] ) ; "" ;
区分[n-1] < テスト日[1] and テスト日[1] ≤ 区分[n] ; 1;
IsEmpty ( 区分[n+1] ) and テスト日[1] >= 区分[n];1
)
)「以降」の文字もTravellerさんのサンプルを参考に表示できるようにしました。
Offline
作業していく中で、値一覧の絞り込みに関して新たな問題が出てきました・・・
こちらは解決フラグを立てますので、別トピックのほうで引き続き質問させて下さい。
よろしくお願いします。
Offline
[ Generated in 0.009 seconds, 11 queries executed - Memory usage: 620.16 KiB (Peak: 653.07 KiB) ]