みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になります。
こんなテーブルがあるとします。
◆Aテーブル
主キー
取引先名
◆Bテーブル
主キー
Aテーブルの主キー
年 (西暦年が入る)
月 (1~12が入る)
金額
この時、Aテーブルのオカレンスを使ってリスト形式でレイアウトを作成し
取引先ごとの1~12月の金額を表示したいとします。
すると、リレーションをする用にAテーブルに 年フィールド(1個)や 月フィールド(12個)が必要になると思います。
このように、固定の値が入っていてほしいようなフィールドを作りたい時に皆さんはどうされていますか?
グローバルフィールド、数値フィールド(中に計算式を入れる)、計算フィールド(保存)、計算フィールド(非保存)など、どんなフィールドを使うかと
もしくは上記の表示を実現するために、良い方法をご存じな方はおられるでしょうか?
こういうリレーション用の固定値のためにフィールドをどんどん増やしていくのもどうなんだろう?と思っています。
かといってSQLの計算で取ってくると表示が重くなってしまいます。
> リレーションをする用にAテーブルに 年フィールド(1個)や 月フィールド(12個)が必要
年フィールドの照合でいいですから、Aテーブルに月フィールドは不要でしょう。
Aテーブルで
取引先をユニークにして、年を入れ替えるのか、
取引先 & 年ごとに1レコードとするかで考え方が変わってくるでしょう。
Offline
チポさん
回答ありがとうございます。
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月・・・・
・
・
というように表示したいのですが、どのようにしたらその月の情報を取ってこられるでしょうか?
私にはボタンに計算式を入れ込むくらいしか思いつかず・・・
> Aテーブルは、都合上取引先をユニークにしなければなりません
必要なら別テーブルにすればいいでしょう。
例えば、
一つの取引先の、数年分の年月ごとの一覧
なんかは
取引先 & 年
ごとのレコードがないとできませんよね。
ご希望の表示は
1行のポータルを開始行を変えて横に並べればいいですね。
Offline
純粋なクロス集計ですね。
色々な手法がありますが、テーブルの追加が不要な集計機能での作成が簡単では。
Offline
後らばせながら、
>#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
チポさん
なるほど、今まで別テーブルという発想がありませんでした。
ポータルで並べるのも、確かにそれで実現できそうです。
ありがとうございました。
Shinさん
回答ありがとうございます。
集計機能というのは、集計フィールドのことで認識は合っているでしょうか?
集計値を取ってくれば確かに別テーブルなしでもいけそうです。
Hiroさん
回答ありがとうございます。
今まで繰り返しフィールドの便利さがあまり分かりませんでしたが、このように使うのだと初めて知りました。
一度チャレンジしてみたいと思います。
今回の件で少しだけ気になるのが、それぞれのやり方でどれくらい重くなるのかなという点です。
リスト表示の中に複数のポータルや非保存の計算式などを入れると、かなり重くなるのではという懸念があります。
リストの1行に12個のポータルや計算式くらいなら気にしなくても良いものでしょうか?
>#6の私案では、ほとんど過負荷なく実用的です。
先ずは、お試しあれ!!
Offline
集計機能を使ったサンプルです。この構造ですと、複数年の集計が同時に可能です。また、月ごとの集計値ではなく、粗データから直接集計できます。抽出とソートのみですので、全レコードが数十万程度まででしたら、動作は非常に軽いです。
https://www.dropbox.com/s/2wrse440702j5 … 7.zip?dl=0
Last edited by Shin (2019-04-15 14:09:30)
Offline
Hiroさん
早速試してみましたがサクサク動きます!
杞憂でしたね、ありがとうございました。
案外非保存のフィールドを並べても重くならないものですね。
Shinさん
こちらの機能ですね、失礼しました。
サンプルありがとうございます!
このやり方は非常に軽いですね。
それに中身を見させていただきましたが、繰り返しフィールドを使って
金額を該当する月の繰り返し部分に格納 → 繰り返し毎に集計 という手法は感動ものでした。
お二人とも繰り返しフィールドの使い方が洗練されていて凄いです。
色々と汎用的に使えそうなので、これからは繰り返しフィールドも使ってみたいと思います。
Hiroさん
すいません、できたできたと喜んでおりましたが、集計配列の中の1つ目にしかデータが入ってきていませんでした。
2つめ以降にデータが入ってこない原因として、何か考えられるものはあるでしょうか?
Hiroさんに提示していただいたのと違うルールで作っている部分が一部ありまして、
現状Bテーブルには取引先毎に、ひと月=1レコードしか存在していません。
取引先 & 年 & 月 でユニークになっている と言った方がわかりやすいでしょうか。
そのため、Bテーブルに「自月集計」フィールドを作らず、直接「金額」フィールドを取ってきています。
「集計配列」フィールド
(式:Lookup(Bテーブル::金額);計算結果:非保存)
代辺です。
Lookup() 関数を繰り返しフィールドに使う場合、ルックアップ元のフィールドの同じ繰り返し位置の値が参照されます。ですから、元のフィールドが繰り返しフィールドで無い場合には、繰り返し位置1のみしか参照されます。
Hiroさんのサンプル見ていませんが、「自月集計」というフィールドは、繰り返しフィールドになっており、月の位置にデータが入っているか、全てに同じデータが入っているのだと思います。この考えのフィールドを省くとダメですよ。
Offline
別でHiroさんと全く同じ状態でサンプルを作って試してみたところ、うまくいきました。
そのサンプルを使って色々試してみたところ、理由はわかりませんが下記のようになりました。
・「自月集計」フィールド
→非保存のチェックを外すと2月以降に反映されなくなりました
→Sumではなく、計算式を 金額 のようにすると反映されなくなりました
→Sumではなく、計算式を 金額[1] のようにすると反映されるようになりました
→しかし、「集計配列」フィールドの計算式を Lookup(Bテーブル::金額[1]) としても反映されませんでした
ということは
「自月集計」フィールドの計算式 は 非保存 かつ Sumで集計されているか、配列の1番目を指定する必要がある ということでしょうか?
よく分からなくなってきました。
Shinさん
同じ繰り返し位置の値を参照ということですね。
私は「自月集計」フィールドを繰り返しフィールドにせず、そのまま使っていました。
ただ、なぜかそれでも「自月集計」フィールドの計算式がSumになっている場合は、きちんと表示されました。
Sumを使っていると、同じ繰り返し位置を見に行っても同じ値が入っている ということかもしれないですね。
>#14『同じ繰り返し位置の値を参照ということですね。』
が基本セオリーですが、
参照フィールドが、「関連フィールド参照値」や「集計計算値」などでは、
特例的に繰り返し展開する必要はありません。
今回のSUM集計関数値は、その特例ケースです。
Offline
Hiroさん
> 参照フィールドが、「関連フィールド参照値」や「集計計算値」などでは、
> 特例的に繰り返し展開する必要はありません。
なるほど、特例もあるのですね。
繰り返しフィールドはなかなかに複雑ですね。
覚えておこうと思います。
ありがとうございました。
Pages: 1
[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 560.35 KiB (Peak: 581.26 KiB) ]