初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2014-03-18 20:41:50

youkazu7777
Member

繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

ご無沙汰しております。また一つ教えていただきたいことがありましてトピックを立てさせてもらいます。
よろしくお願いします。


テストを受けた日付を、学年ごとにクロス集計を、繰り返しフィールドを用いて行おうと思います。

【テーブル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

#2 2014-03-19 04:11:16

Hiro
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

内容読み切れていませんが、こんなこと?

<日付一覧の式>
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

#3 2014-03-19 09:28:12

Shin
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

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

#4 2014-03-19 09:49:19

tim
Guest

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

Shinさんのだと「メインとなる日付」が固定になってしまうのでは。

#5 2014-03-19 10:03:56

Traveller
Guest

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

全然分かってないけど、日付一覧に「3/14以降」が作れないということなのかな?
他の日付もテスト日と同じではないわけですから単に「3/14」にしたらいいのでは。

#6 2014-03-19 14:58:19

Shin
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

tim wrote:

Shinさんのだと「メインとなる日付」が固定になってしまうのでは。

ご指摘の意味がよくわからないですが、
とりあえず、上の式の不具合を訂正しておきました。
https://dl.dropboxusercontent.com/u/926 … 85.fp7.zip

Offline

#7 2014-03-19 15:07:38

tim
Guest

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

計算式に1,9,15が埋め込まれてるので、「繰り返しフィールドの日付の境目になるレコードは、テーブルを別にしておきます。」という仕様が反映されてないという意味です。
テスト実施日だから、毎月変わるのでは。

Hiroさんのは、「3/14以後」じゃなく「3/31」でやろうとしてるんですね。1か月分の集計ならそれでもよさそうだけど、どうかな

#8 2014-03-19 16:06:25

Traveller
Guest

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

「以降」を付けたがために面倒なことになったサンプル

http://pupld.net/21/140319/bfpojab498/index.cgi
テスト日付.fp7  (検証不十分)

#9 2014-03-19 16:49:06

Shin
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

わざわざ別テーブルに置く必要があるのかな。
同じテーブル内の繰り返しグローバルフィールドに設定(別テーブルに置いても参照が変わるだけ)するとして、

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

#10 2014-03-19 17:38:15

Traveller
Guest

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

私のは3/16と3/17を3/13に変更すると3/13グループに入るのに
日付一覧が「3/13以降」になってまう。で、没ということで・・・

#11 2014-03-20 01:39:57

youkazu7777
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

沢山のアイデアありがとうございます。
みなさん、相変わらずすばらしい腕前ですね^^;
質問した僕がついて行けなくなりそうです・・・(笑

Shinさん、ひとつ質問なんですが、Caseの中の、

Case (
  n = 1 ; テスト日[1] ≤ 日区切[n] ;

の部分ですが、caseって、条件1;結果1;条件2;結果2と使いますよね?
この部分が、複数の条件のようになっていませんか?なぜこれで動作するのですか?

Offline

#12 2014-03-20 01:57:58

youkazu7777
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

あ、Shinさんちなみに3/1より前は、前年度の最終日以降という分類になります。

毎年、一番最初のテストの開始日から集計をはじめていきます。

それと、区切りを別テーブルにしているのは、教室Aと教室Bでは、区切りとなる日程が異なるからです。
それは集計表示の都合だけで、データベースとしてはあまり意味がないので、Shinさんのアイデアのように、区切りフィールドを持たせるのもありだと思います。
ただ、複数の教室が同時に使用するものになるので、分けておく方がいいのかなと考えた次第です。

Last edited by youkazu7777 (2014-03-20 02:02:43)

Offline

#13 2014-03-20 02:12:50

youkazu7777
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

Travellerさんのサンプルもわかりやすいですね。
もうしわけありません、私が「以降」とわざわざ付けてしまったので、無駄にややこしかったかも知れません。
特に、「以降」と表示が絶対に必要というわけでもなかったのですが、この方法ですとスマートに表示できています。参考にさせていただきます。

あ、それとボツとおっしゃっていますが、特にこの仕様でも問題ないと思います。最後のテスト日以降はぜんぶ以降として集計してもとくに差し支えはないので・・・

Offline

#14 2014-03-20 02:51:37

youkazu7777
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

Hiroさんありがとうございます。
timさんご指摘のように、月末締めの集計という仕様ですね。
意図しているのは、テストの実施日を数回のチラシで告知するのですが、そこで設定されたテスト日とテスト日の間に、どれだけの人が受けに来たかがわかるようにするためのものです。

Offline

#15 2014-03-20 09:38:36

Shin
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

やはり、前年度があったのですね。皆さん作り直しかと。
そちらのテーブルから集計毎に期日を取り出して、繰り返しフィールドに設定するようにすれば良いでしょう。

FMは、論理計算の結果を、真なら1,偽なら0を返します。それを利用しています。
また、条件式も、0またはnull以外を設定しておけば真、として処理されます。

Offline

#16 2014-03-20 11:36:36

youkazu7777
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

あ、そうか・・・
このままだと前年度が全部一番最初のところに集計されてしまうのか。

最初の所、

  n = 1 ; テスト日[1] = 日区切[n] ;

でも、いけますよね?

Offline

#17 2014-03-20 14:43:59

Shin
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

第1の区切りが、今回は1日だったので、=でもいいけど、それが1日以外になるかもしれないので、駄目です。

Offline

#18 2014-03-20 18:27:47

Hiro
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

未だ完全には読み切れてませんが、
もし、例示の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

#19 2014-03-20 19:43:33

Shin
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

日の区切りを

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

#20 2014-03-22 04:54:55

youkazu7777
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

みなさんありがとうございます。

とりあえず、今回は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

#21 2014-03-22 04:58:16

youkazu7777
Member

Re: 繰り返しフィールドへの自動入力で、最後のフィールドで処理を分岐できるか

作業していく中で、値一覧の絞り込みに関して新たな問題が出てきました・・・

こちらは解決フラグを立てますので、別トピックのほうで引き続き質問させて下さい。
よろしくお願いします。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.010 seconds, 9 queries executed - Memory usage: 620.18 KiB (Peak: 653.09 KiB) ]