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

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

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

You are not logged in.

Announcement

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


#1 2019-04-15 10:44:46

まっくす
Guest

リレーション用の固定値 どうしてますか?

お世話になります。

こんなテーブルがあるとします。
◆Aテーブル
主キー
取引先名

◆Bテーブル
主キー
Aテーブルの主キー
年 (西暦年が入る)
月 (1~12が入る)
金額

この時、Aテーブルのオカレンスを使ってリスト形式でレイアウトを作成し
取引先ごとの1~12月の金額を表示したいとします。
すると、リレーションをする用にAテーブルに 年フィールド(1個)や 月フィールド(12個)が必要になると思います。
このように、固定の値が入っていてほしいようなフィールドを作りたい時に皆さんはどうされていますか?

グローバルフィールド、数値フィールド(中に計算式を入れる)、計算フィールド(保存)、計算フィールド(非保存)など、どんなフィールドを使うかと
もしくは上記の表示を実現するために、良い方法をご存じな方はおられるでしょうか?
こういうリレーション用の固定値のためにフィールドをどんどん増やしていくのもどうなんだろう?と思っています。
かといってSQLの計算で取ってくると表示が重くなってしまいます。

#2 2019-04-15 10:59:18

チポ
Member

Re: リレーション用の固定値 どうしてますか?

> リレーションをする用にAテーブルに 年フィールド(1個)や 月フィールド(12個)が必要
年フィールドの照合でいいですから、Aテーブルに月フィールドは不要でしょう。

Aテーブルで
取引先をユニークにして、年を入れ替えるのか、
取引先 & 年ごとに1レコードとするかで考え方が変わってくるでしょう。

Offline

#3 2019-04-15 11:23:49

まっくす
Guest

Re: リレーション用の固定値 どうしてますか?

チポさん

回答ありがとうございます。
Aテーブルは、都合上取引先をユニークにしなければなりません。
年フィールドの照合のみでリレーションした場合、 Aテーブル1レコードに対して Bテーブルが12レコードになるかと思います。
それをリスト形式で

取引先A 1月 10,000円  2月 20,000円 3月 30,000円 4月・・・・
取引先B 1月 40,000円  2月 50,000円 3月 60,000円 4月・・・・

というように表示したいのですが、どのようにしたらその月の情報を取ってこられるでしょうか?
私にはボタンに計算式を入れ込むくらいしか思いつかず・・・

#4 2019-04-15 11:52:30

チポ
Member

Re: リレーション用の固定値 どうしてますか?

> Aテーブルは、都合上取引先をユニークにしなければなりません
必要なら別テーブルにすればいいでしょう。

例えば、
一つの取引先の、数年分の年月ごとの一覧
なんかは
  取引先 & 年
ごとのレコードがないとできませんよね。


ご希望の表示は
1行のポータルを開始行を変えて横に並べればいいですね。

Offline

#5 2019-04-15 11:59:35

Shin
Member

Re: リレーション用の固定値 どうしてますか?

純粋なクロス集計ですね。
色々な手法がありますが、テーブルの追加が不要な集計機能での作成が簡単では。

Offline

#6 2019-04-15 12:31:27

Hiro
Member

Re: リレーション用の固定値 どうしてますか?

後らばせながら、
>#1『固定の値が入っていてほしいようなフィールドを作りたい時に皆さんはどうされていますか? 』

固定キー群は、繰り返しフィールドで一元展開(=配列もどき)するのが楽です。
更にまた、その繰り返しキーのリレーションで各キー個別結果を得るには、
繰り返しフィールドのLookup特性機能を利用します。

本事案では、

  • グローバル繰り返し[12回]計算フィールド「月配列」を追加
    (式:Get(計算式繰り返し位置番号))

  • Bテーブルで集計計算フィールド「自月集計」を追加
    (式:Sum(Bテーブル2月別::金額) //自己月の集計値を算出)
    ※なお、この自己リレーション「Bテーブル2月別::」のキー設定は、
       「Bテーブル::Aテーブルの主キー」=「Bテーブル::Aテーブルの主キー」
          AND
       「Bテーブル::年」=「Bテーブル::年」
          AND
       「Bテーブル::月」=「Bテーブル::月」

  • 月別集計結果を得る繰り返し[12回]計算フィールド「集計配列」を追加
    (式:Lookup(Bテーブル::自月集計);計算結果:非保存)
    ※なお、このリレーション「Bテーブル::」のキー設定は、
       「Aテーブル::主キー」=「Bテーブル::Aテーブルの主キー」
          AND
       「Aテーブル::年」=「Bテーブル::年」
          AND
       「Aテーブル::月配列」=「Bテーブル::月」

Last edited by Hiro (2019-04-15 13:42:23)

Offline

#7 2019-04-15 13:32:54

まっくす
Guest

Re: リレーション用の固定値 どうしてますか?

チポさん
なるほど、今まで別テーブルという発想がありませんでした。
ポータルで並べるのも、確かにそれで実現できそうです。
ありがとうございました。


Shinさん
回答ありがとうございます。
集計機能というのは、集計フィールドのことで認識は合っているでしょうか?
集計値を取ってくれば確かに別テーブルなしでもいけそうです。


Hiroさん
回答ありがとうございます。
今まで繰り返しフィールドの便利さがあまり分かりませんでしたが、このように使うのだと初めて知りました。
一度チャレンジしてみたいと思います。


今回の件で少しだけ気になるのが、それぞれのやり方でどれくらい重くなるのかなという点です。
リスト表示の中に複数のポータルや非保存の計算式などを入れると、かなり重くなるのではという懸念があります。
リストの1行に12個のポータルや計算式くらいなら気にしなくても良いものでしょうか?

#8 2019-04-15 14:04:09

Hiro
Member

Re: リレーション用の固定値 どうしてますか?

>#6の私案では、ほとんど過負荷なく実用的です。
先ずは、お試しあれ!!

Offline

#9 2019-04-15 14:07:25

Shin
Member

Re: リレーション用の固定値 どうしてますか?

集計機能を使ったサンプルです。この構造ですと、複数年の集計が同時に可能です。また、月ごとの集計値ではなく、粗データから直接集計できます。抽出とソートのみですので、全レコードが数十万程度まででしたら、動作は非常に軽いです。
https://www.dropbox.com/s/2wrse440702j5 … 7.zip?dl=0

Last edited by Shin (2019-04-15 14:09:30)

Offline

#10 2019-04-15 15:23:49

まっくす
Guest

Re: リレーション用の固定値 どうしてますか?

Hiroさん
早速試してみましたがサクサク動きます!
杞憂でしたね、ありがとうございました。
案外非保存のフィールドを並べても重くならないものですね。


Shinさん
こちらの機能ですね、失礼しました。
サンプルありがとうございます!
このやり方は非常に軽いですね。
それに中身を見させていただきましたが、繰り返しフィールドを使って
金額を該当する月の繰り返し部分に格納 → 繰り返し毎に集計 という手法は感動ものでした。

お二人とも繰り返しフィールドの使い方が洗練されていて凄いです。
色々と汎用的に使えそうなので、これからは繰り返しフィールドも使ってみたいと思います。

#11 2019-04-15 16:03:14

まっくす
Guest

Re: リレーション用の固定値 どうしてますか?

Hiroさん
すいません、できたできたと喜んでおりましたが、集計配列の中の1つ目にしかデータが入ってきていませんでした。
2つめ以降にデータが入ってこない原因として、何か考えられるものはあるでしょうか?

Hiroさんに提示していただいたのと違うルールで作っている部分が一部ありまして、
現状Bテーブルには取引先毎に、ひと月=1レコードしか存在していません。
取引先 & 年 & 月 でユニークになっている と言った方がわかりやすいでしょうか。
そのため、Bテーブルに「自月集計」フィールドを作らず、直接「金額」フィールドを取ってきています。

「集計配列」フィールド
(式:Lookup(Bテーブル::金額);計算結果:非保存)

#12 2019-04-15 17:10:08

Shin
Member

Re: リレーション用の固定値 どうしてますか?

代辺です。

Lookup() 関数を繰り返しフィールドに使う場合、ルックアップ元のフィールドの同じ繰り返し位置の値が参照されます。ですから、元のフィールドが繰り返しフィールドで無い場合には、繰り返し位置1のみしか参照されます。
Hiroさんのサンプル見ていませんが、「自月集計」というフィールドは、繰り返しフィールドになっており、月の位置にデータが入っているか、全てに同じデータが入っているのだと思います。この考えのフィールドを省くとダメですよ。

Offline

#13 2019-04-15 17:27:36

まっくす
Guest

Re: リレーション用の固定値 どうしてますか?

別でHiroさんと全く同じ状態でサンプルを作って試してみたところ、うまくいきました。
そのサンプルを使って色々試してみたところ、理由はわかりませんが下記のようになりました。

・「自月集計」フィールド
→非保存のチェックを外すと2月以降に反映されなくなりました
→Sumではなく、計算式を 金額 のようにすると反映されなくなりました
→Sumではなく、計算式を 金額[1] のようにすると反映されるようになりました
→しかし、「集計配列」フィールドの計算式を Lookup(Bテーブル::金額[1]) としても反映されませんでした

ということは
「自月集計」フィールドの計算式 は 非保存 かつ Sumで集計されているか、配列の1番目を指定する必要がある ということでしょうか?
よく分からなくなってきました。

#14 2019-04-15 17:31:45

まっくす
Guest

Re: リレーション用の固定値 どうしてますか?

Shinさん

同じ繰り返し位置の値を参照ということですね。
私は「自月集計」フィールドを繰り返しフィールドにせず、そのまま使っていました。
ただ、なぜかそれでも「自月集計」フィールドの計算式がSumになっている場合は、きちんと表示されました。
Sumを使っていると、同じ繰り返し位置を見に行っても同じ値が入っている ということかもしれないですね。

#15 2019-04-15 18:17:38

Hiro
Member

Re: リレーション用の固定値 どうしてますか?

>#14『同じ繰り返し位置の値を参照ということですね。』
が基本セオリーですが、
参照フィールドが、「関連フィールド参照値」や「集計計算値」などでは、
特例的に繰り返し展開する必要はありません。
今回のSUM集計関数値は、その特例ケースです。

Offline

#16 2019-04-15 18:35:38

まっくす
Guest

Re: リレーション用の固定値 どうしてますか?

Hiroさん

> 参照フィールドが、「関連フィールド参照値」や「集計計算値」などでは、
> 特例的に繰り返し展開する必要はありません。

なるほど、特例もあるのですね。
繰り返しフィールドはなかなかに複雑ですね。
覚えておこうと思います。
ありがとうございました。

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 560.35 KiB (Peak: 581.26 KiB) ]