みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
はじめまして。お世話になります。よろしくお願い致します。
操作環境 FM12 WIN10
設定が分からず行き詰ってしまいました。
分かる方がいらっしゃいましたら教えて頂けますとありがたいです。
下記のような設定を行い、テーブルAとテーブルBを年月でリレーションを張り、
テーブルAでチェックした時に、テーブルBの同じ年月のレコード全てに対してチェックが入るようにしたいです。
現在、リレーションの方法が間違っているのか、テーブルAでチェックを入れてもテーブルBのひとつのレコードにしかチェックが入りません。
テーブルA(年月とBへのフラグのON,OFFのみ管理
--------
year month check1
2023 2
2023 3 1
2023 4 1
2023 5
---------
■テーブルB(月次単位での詳細データ
---------
year month item 数 check1
2023 3 リンゴ 80
2023 3 バナナ 90
2023 3 リンゴ 50 1
2023 3 バナナ 50 1
2023 4 リンゴ 25 1
2023 4 バナナ 30 1
■テーブルC(テーブルBにフラグ付けしたitem単位で合計値などを集計
---------
リンゴ 75
バナナ 80
■リレーション(現在の設定内容
テーブルA year,month = テーブルB year,month
リレーションを増やしたりしてみましたが、思ったような動作をしてくれず、
この先のリレーション方法が分かりません。
上記内容にてうまく伝わるか分かりませんが、
もし分かる方がいらっしゃいましたら、助言を頂けましたら幸いでございます。
何卒よろしくお願い致します。
オフライン
リレーションしただけではテーブルBのフィールドには値は入りませんから、ルックアップなのか計算フィールドなのか計算式で全置換するかなどはどうやってますか?
himadanee様
ありがとうございます。
ルックアップも計算式も入れてませんでした!
確かに値を持ってくる要因がありませんでした。
ただ、ルックアップにしても計算式にしてもテーブルAで入れた値をテーブルBのフィールドに反映されないのです。
何かが間違っている(何かが足りない)とは思うのですが、すいません。
Shin様
ありがとうございます。
テーブルCでの集計方法はある程度把握はしておりまして、
下記内容で設定したところ問題なく集計できるようでした。
---------------
■リレーション
テーブルB item、check1 = テーブルC item、check1
■フィールド設定
テーブルC
数 フィールド設定 計算式 =Sum(リレーション先のテーブルBの数)
---------------
ただ、テーブルAにチェックを入れたときにテーブルBの該当フィールドすべてにチェックが入るという仕組みが出来ず困っております。
チポ様
ありがとうございます。
上2行の月は完全に記載ミスでした。ご指摘ありがとうございます。
【訂正】
■テーブルB(月次単位での詳細データ
---------
year month item 数 check1
2023 2 リンゴ 80
2023 2 バナナ 90
2023 3 リンゴ 50 1
2023 3 バナナ 50 1
2023 4 リンゴ 25 1
2023 4 バナナ 30 1
---------
こうですね。失礼いたしました。
チェックを外したときに集計結果が異なることは問題なく、
必要となるデータ範囲を毎回操作したいという意図になります。
例えば、1-2月と3-4月 では 売上、転換率、アクセスなどユーザの動向が異なるため
ある程度データ集計させる範囲を変えてデータを確認したいというところにあります。
テーブルAは範囲を決めるためのもの
テーブルBは全データを補完しておくところ
テーブルCはAで決めたBの対象を集計しなおして、必要なデータを算出しなおすところ
という感じで行っていきたいと思っております。
オフライン
上で書いた内容と全然違いますよ。
https://www.dropbox.com/s/j9r0hhtlnroqm … 2.zip?dl=0
ただ、普通はテーブルBで集計範囲を抽出して、そのまま集計するのが普通でしょうね。
編集者 Shin (2023-05-26 15:22:51)
オンライン
結局テーブルCは不要で、Aからフラグの立ってるレコードだけ検索して、Bの関連レコードへ移動するなどしてBで集計すれば、Bのフラグも不要ってことでしょうね。
フラグの情報がCにないから、Cに集計結果だけ残しても何の集計かわからなくなって意味がないでしょうし。
チポ様
ありがとうございます。
テーブルCでのテーブルBの該当の集計は行えていたので
テーブルAとテーブルBだけの関係性を書いてしまいました。
テーブルBのcheck1に値を正しく入れたかったことが解決できずにいたのでそこだけ問題が解決できずご質問とさせていただいておりました。
記載内容が中途半端になっており申し訳ないです。
テーブルCではテーブルBとのリレーションで、該当のレコードに対してのみ集計を行いたいと思っております。
テーブルBのcheck1を計算式にしてテーブルAの値を持つようにすれば入るには入りますが
今度はテーブルCでの集計が行えなくなってしまい、ここの解決方法を見いだせないままになっております。
計算フィールドと数字フィールド、あるいは計算フィールドと計算フィールドはリレーションが正しく行われないという認識になりますでしょうか?
テーブルBのcheck1を手動で値を入れた場合にはテーブルCで正しく集計がされますので
やはりチポ様のおっしゃられる通り、スクリプトでテーブルAでフラグ付けするものをテーブルBの対象フィールドに値を入れに行ったほうが良さそうな気がしてきました。
■テーブルA(年月とBへのフラグのON,OFFのみ管理
--------
year month check1
2023 2
2023 3 1
2023 4 1
2023 5
---------
■テーブルB(月次単位での詳細データ
---------
year month item 数 check1
2023 2 リンゴ 80
2023 2 バナナ 90
2023 3 リンゴ 50 1
2023 3 バナナ 50 1
2023 4 リンゴ 25 1
2023 4 バナナ 30 1
2023 5 リンゴ 10
2023 5 バナナ 10
■テーブルC(テーブルBにフラグ付けしたitem単位で合計値などを集計
---------
リンゴ 75
バナナ 80
■リレーション(現在の設定内容
テーブルA year,month = テーブルB year,month
テーブルB item,check1 = テーブルC item,check1
オフライン
Shin様
参考のファイルを頂きありがとうございます。
御手数おかけいたします。
Shin様のおっしゃられていた「上で書いた内容と全然違いますよ。」という内容がはじめ理解できていなかったのですが、
本日把握致しました。「2023-05-26 13:52:15」に記載させていただいた内容ですよね。
すいません、チポ様からご指摘いただきました誤記載がmonthの重複でしたので、そこだけ修正をさせて頂いたつもりだったのですが
却って分かり辛くなってしまい誤解を招いてしまい申し訳ございません。
Shin様から頂きましたファイルを確認させていただきました。
集計を行うとテーブル内のitemフィールドの同一名のものが集計されてしまい
check1が入っているものを集計するというものではなくなってしまうようです。
「テーブルB item,check1 = テーブルC item,check1」として、テーブルCで集計するのが適切なのかなと考えております。
参考ファイルまで作ってくださりましたこと非常に感謝しております。
また中途半端な記載で誤解を招いてしまい申し訳ないです。
オフライン
himadanee様
ありがとうございます。
テーブルCでテーブルBの情報を集計した後、データを整え、色々な作業を行いたいと考えておりましたので
テーブルCは必要なものであります。
テーブルAのチェックをテーブルBの該当するレコードにチェックした後
テーブルCでテーブルBのチェックが入ったものを集計するという中で
テーブルAにチェックを入れたときにテーブルBのチェックが入るようにする という問題点が解決できないでおります。
テーブルAを作らずに、テーブルBで対象を全置換すればいいのかもしれませんが
それだと今後膨大なレコード数になるテーブルBを操作し、どの年月にフラグを入れているのかを把握し続けることは困難で、
管理や操作性に問題があると感じたからです。
テーブルA(対象を管理、簡易的に対象を変更可能にする)、
テーブルB(元データ、基本ここを開いたりいじったりしない)、
テーブルC(フラグ付けされたテーブルBのデータをもとに必要なデータを作成する)はそれぞれ必要なものかと思っています。
ただやはり下記内容が解決せず困っています。
テーブルA → check1に値「1」を入れる check1 (数字フィールド 計算フィールドではない)
リレーション テーブルA year,month = テーブルB year,month
→テーブルAでチェックしたテーブルBの同一の「year,month」のレコードに対してcheck1に値「1」を入れる
→テーブルBのcheck1に値「1」が入ったitemをテーブルCで集計する
リレーション テーブルB item,check1 = テーブルC item,check1
※check1に値「1」が入っていないものは集計しない
※check1が計算フィールドの場合、リレーションが正しく機能せず、別テーブルの値を持ってこない?
オフライン
チポ様
詳しいご説明いただきありがとうございます。
リレーションとフィールド定義だけでは結局ダメだったのですね。
himadanee様にもShin様にも
最終的な設定の説明を省いたばかりに、色々お手数おかけしてしまいすいませんでした。
また丁寧にご説明いただきましたこと感謝しております。
チポ様の当初のご提案通り、スクリプトでテーブルBにフラグ付けすることにいたしました。
------
スクリプト内容
テーブルAのcheck1の値が1か空欄かの判定で1と空欄を付け替え、
変数設定でyear、month、check1の値を設定
テーブルBに切り替えて、変数で設定したyear、monthを検索後
テーブルBのcheck1の値を全置換させることにしました。
------
皆様親切にご協力いただきありがとうございました。
オフライン
Cが必要だとして、そのレコードはどうやって作るんでしょうか。
手入力してたら抜けたり間違えたりしますよね。
Bで集計して、それをCにインポートすればいいのでは。リレーション不要です。(集計結果のみの直接インポートはできなかった気がするので、一旦集計結果をエクスポートして、それをインポートする)
リレーションでやるとしたら、チポさんご指摘の通り、Bで全レコードの全置換などが必要になります。
C上で計算で出したければ、SQL関数でやるのがよさそうですが
そういう意味では、ODBC共有にすればSQLでインポートできるので、簡単かなあ。共有だと設定は面倒ですが。サーバ上でやらせるとか?
FM12でしたか...バグにあたらないか心配...
全置換などしなくても、目的を絞り込んだ集計できますよ。
Shin様から頂きましたファイルを確認させていただきました。
集計を行うとテーブル内のitemフィールドの同一名のものが集計されてしまい
check1が入っているものを集計するというものではなくなってしまうようです。
公開したファイルで確認されたのですか、それとも、同じようなファイルを作ってですか。
サンプルのファイルは、スクリプトの不要な動きになっています。FM12でも正しい同じ動きをするはずです。
編集者 Shin (2023-05-30 02:43:12)
オンライン
Shin様
ありがとうございます。
御連絡いただきました時に頂きましたデータをそのままDLし、使用させて頂いておりました。
テーブルAの値を付け替えたりして確認をしたところ、
昨日まではCで表示される集計の値が変わらなかったので、集計がcheck1のフラグを反映していないものと思っていたのですが
Shin様の御連絡内容を拝見して、本日再度確認致しました。
テーブルCのitemの値を再入力したところ、再集計されることが分かりました。
大変失礼いたしました。
Shin様から頂きました内容が当初の私の希望の内容と合致している内容ですので、とてもうれしく思っております。
設定内容を見直し、再検討させていただきたいと思います。
オフライン