みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
解決しました。
ありがとうございました。
お世話になります。
次の例題を実現するにはどうしたら良いでしょうか。
◎目的
・1対多の関係の二つのテーブルで、多側にある繰り返しフィールドの値を1側の計算フィールドで縦に集計する方法を知りたいです。
◎各テーブルのフィールド
◇A(A) ※TO名(テーブル名)
_kp_ID (テキスト)
配列集計[5] (計算)
◇A_B(B)
_kp_ (数字)
_kf_ID (テキスト)
配列[5] (数字)
◎リレーション
・二つのテーブルAとBは、1対多の関係で主キー(A::_kp_ID)と外部キー(A_B::_kf_ID)でリレーションしているとします。
◎求める結果
◇B
01|AAA|1|1|0|0|0
02|AAA|0|0|0|1|1
03|BBB|1|1|1|0|0
04|BBB|1|1|1|1|0
を元に
◇A
AAA|1|1|0|1|1
BBB|2|2|2|1|0
という感じになるようにしたいです。
◎やってみたこと
A::配列集計の計算式を sum( A_B::配列 ) とやってみたんですが、横の合計になってしまい期待通りになりませんでした。
◎事情
結果だけを出すなら、Bに集計フィールド(同じ繰り返し数)を作って、それをレイアウトの集計パートに配置してボディを取り除き、ID順にソートすればという方法になるかと思うのですが、実際の運用だと、それでは問題がありまして、できたらA側の計算フィールドで実現したいです。
以上、よろしくお願いします。
返信が大変遅くなってしまい申し訳ありませんでした。
条件書式をコピーしたいオブジェクトを最前面にして、他のオブジェクトを含めて選択して、条件書式を再設定するという方法を試したところ期待通りの結果になりました。
これで一つ便利な方法を知ることができました。
たくさんの方々からコメントを頂きましてありがとうございました。
レイアウトモードで、あるオブジェクトに設定している条件書式を他のオブジェクトにコピーする方法って有りますか?
FileMaker15AdvancedをWindows10で使っています。
発想を逆にすれば、計算楽になりますよ。
こちらの方がスマートですし、確かに計算も簡略化されますね。
サンプルも含めてありがとうございました。
参考にさせて頂きます。
もしかして、こういう場合は、スクリプトを使うしかないですか?
一応、スクリプトを作って、基準日と期間区分のスクリプトトリガ(OnObjectModify)に設定したことで実現はできましたが。
最初の説明が分かりづらかったので訂正します。
「グローバルの日付(繰り返し)フィールドに、「入力値の自動化の計算値」を使って、値を入れようとするのですが、繰り返しの最初にしか入りません。
フィールド全ての繰り返し位置に値を入れるにはどうしたら良いでしょうか。」
度々お世話になっております。環境はFMP15A、Win10」です。
さて、グローバルの日付フィールドに、「入力値の自動化の計算値」を使って、値を入れようとするのですが、繰り返しの最初にしか入りません。
全てのフィールドに値を入れるにはどうしたら良いでしょうか。
詳細は以下の通り。
◇フィールド
フィールド名 タイプ 説明
-----------------------------------------------
日付 (日付) ※レコード固有のある日付
値 (数字) ※レコード固有のある値
値配列[12] (数字) ※日付が開始日[n]と終了日[n]の範囲内ならnの位置に値を入れ、範囲外ならゼロを入れたい。
(以下のフィールドはグローバル)
基準日 (日付) ※フィールド開始日や終了日に値を設定するための基準になる日
期間区分 (テキスト) ※"日"、"週"、"月"、"年"が入る。フィールド開始日や終了日にどう値を設定するかを決める。
開始日[12] (日付) ※基準日と期間区分を元に12個の日付を入れたい。
終了日[12] (日付) ※開始日に対応する終了日を入れたい。
◇やりたいこと
基準日と期間区分によって、開始日および終了日に値を設定したい。
例えば、基準日が2018/7/1で、期間区分が"週"なら
開始日は2018/7/1、2018/7/8、2018/7/15……2018/09/16
終了日は2018/7/7、2018/7/14、2018/7/21……2018/09/22
という具合にしたい。
そして、最終的にはこれを元にクロス集計を行ないたい。
◇開始日の「入力値の自動化の計算値」に設定した計算式①
Case (
Extend ( 期間区分 ) = "日" ; Extend ( 基準日 ) + Get ( 計算式繰り返し位置番号 ) - 1 ;
Extend ( 期間区分 ) = "週" ; Extend ( 基準日 ) + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 7 ;
Extend ( 期間区分 ) = "月" ;
Let ( [ #m = Month( Extend ( 基準日 ) ) ; #y = Year ( Extend ( 基準日 ) ) ] ;
Date ( #m + Get ( 計算式繰り返し位置番号 ) - 1 ; 1 ; #y )
) ;
Extend ( 期間区分 ) = "年" ;
Let ( [ #m = Month( Extend ( 基準日 ) ) ; #y = Year ( Extend ( 基準日 ) ) ] ;
Date ( #m + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 12 ; 1 ; #y )
) ;
)
◇開始日の「入力値の自動化の計算値」に設定した計算式②
※①で駄目だったので書き換えたもの。結果的にはどちらも駄目だった。
Case (
期間区分[1] = "日" ; 基準日[1] + Get ( 計算式繰り返し位置番号 ) - 1 ;
期間区分[1] = "週" ; 基準日[1] + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 7 ;
期間区分[1] = "月" ;
Let ( [ #m = Month( 基準日[1] ) ; #y = Year ( 基準日[1] ) ] ;
Date ( #m + Get ( 計算式繰り返し位置番号 ) - 1 ; 1 ; #y )
) ;
期間区分[1] = "年" ;
Let ( [ #m = Month( 基準日[1] ) ; #y = Year ( 基準日[1] ) ] ;
Date ( #m + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 12 ; 1 ; #y )
) ;
)
◇補足
ちなみにフィールドタイプを「日付」ではなく「計算」にしたら、期待通りになりました。
よって、「計算」フィールドにしてもいいかもとは思いますが、計算の速さからいったら値は固定されていた方がいいのかと思いました。
もし、「計算」フィールドでも速度が変わらないのであれば、「計算」フィールドを使ってもいいかも知れないと思っています。
・リレーション「売上テーブル」のオプション設定で、「::売上日」での降順ソート設定を掛けておいて、
・「顧客テーブル」から、関連フィールド「売上テーブル::商品名」「売上テーブル::金額」を参照すれば、
・最新の売上日のデータが取得できます。
分かりました。
ありがとうございます。
たびたびお世話になっております。
以下の様なテーブルがあるとして、顧客毎に最後に購入した商品やその金額を取得するためにはどうしたらいいでしょう?
■顧客テーブル
顧客ID
氏名
■購入テーブル
顧客ID
売上日
商品名
金額
このテーブル同士を顧客IDでリレーションして、顧客テーブルに「max(売上テーブル:売上日)」というフィールドを作れば、その顧客が最後に購入した日はわかると思うのですが、それに対応する商品名や金額を取得する方法が分かりません。
よろしくお願いします。
ありがとうございます。
ExecuteSQLの指定の仕方も知っておきたかったので助かりました。
ありがとうございます。
とても参考になりました。
ところで、管理ー値一覧で「区分トップIDs2」の「フィールド指定」を開いて、「OK」を押すと、
『フィールド「区分トップID」は索引設定ができないため、この値一覧は動作しません。処理を続けますか?』
というメッセージが出ます。
それでも特に問題なく動作しているように見えるのですが、何か注意する点はありますか?
あ、そうですね。
確かに項目一覧を「い う」に絞っても、
表示結果は
い う
A 2 1
B 1 1
という感じで期待通りになりますね。
ただ、これは区分A及びBが、それぞれ項目が「い」あるいは「う」のレコードを含んでいるから問題ないのですが、
例えば、このサンプルに「C え」というレコードを追加して、
項目一覧を「え」にしたら、
え
A
B
C 1
になるかと思います。
これを、
え
C 1
となるようにするにはどうしたら良いでしょう?
区分トップIDs を変更しないままだと、この値は「1¶7」に固定されませんか?
例えば 項目一覧 を「い う」にした場合は、区分トップIDsを「2¶8」に、
「う」にした場合は、「6¶9」になるようにしたいと思ったのですが。
Hiroさん、ありがとうございました。
おかげさまで、クロス集計に対する理解が深まり、少なくとも紹介して頂いたサンプルについては理解ができたと思います。
さて、その上で、項目を任意で指定できるように、サンプルに次の修正を加えてみました。
・「項目一覧元」というテキストフィールド(グローバル)作る。
・このフィールドに任意の項目を改行区切りで手動で入力する。
・「項目一覧」フィールドは「項目一覧元」を元に各繰り返しフィールドに値を代入するように変更。
・新たに「マスタテーブル 5」というTOを作成。
・「マスタテーブル」の「項目一覧元」と「マスタテーブル 5」の「項目」をリレーションで結ぶ。
・値一覧の「区分トップIDs」の最初のフィールドの値のところを「マスタテーブル 5」の「レコードID」に、2番目のフィールドのところを「マスタテーブル 5」の「区分」にする。
・更に、次のレコードから関連レコードの値のみを含めるに「マスタテーブル」指定。
・ソートを「2番目のフィールド」に指定。
こうすることによって、取得する「レコードID」を絞り込み、その上で各「区分」の先頭の「レコードID」を値一覧にしたかったのですが、この方法だと同じ「区分」の「レコードID」が複数、値一覧に入ってしまいました。
これは仕様でしょうか?
また、これを回避して、意図通りに、各「区分」の先頭の「レコードID」のみのを取得するにはどうしたらよろしいでしょうか?
お世話になります。
さて、以下の様なクロス集計をしたいと考えております。
◎テーブル
【社員】
社員ID
氏名
【売上】
社員ID
日付
金額
◎得たい結果
社員ID 氏名 2010年の売上合計 2011年の売上合計 2012年の売上合計 …… 横合計
000001 太郎 1000 2000 1500 4500
000002 次郎 2000 1500 3000 6500
------------------------------------------------------------------------------------------
縦合計 3000 3500 4500 11000
◎その他
・何年から何年までを集計対象にするかはグローバルフィールド等で指定したい。
・上記の表の各行(縦合計以外)をエクセルにエクスポートしたい。
・環境 Windows10、Filemaker Pro 15 Advanced
==============================
典型的なクロス集計のパターンだと思ったので、過去ログを探して、サンプルも色々見てみたのですが、そのまま当てはまりそうなものを探せなかったので、投稿させて頂きました。
「過去のこの記事がそのまま当てはまるよ」とかでも構いませんので教えて頂けると助かります。
よろしくお願いします。
検索がキャンセルされたこと自体を簡単に取得する方法がないことを理解しました。
今回はHiroさんの方法を元に検索実行したあとのエラーで後の処理を分岐する方法で対処したいと思います。
皆さん、ありがとうございました。
検索実行の後でエラーを取得し、分岐すればいいですよ。
検索実行の前に、検索がキャンセルされたこと自体を取得することはできないのしょうか?
皆さん、アドバイスありがとうございます。
Hiroさんの方法を参考にさせて頂きました。
ただ、提示して頂いた方法のままだと、検索をキャンセルしたときにも検索実行がなされ、対象レコードが複数だったらレイアウトBが表示されてしまうので、検索条件が空の場合、最終エラーが400になることを利用して、
Ifの行を「If[Get(対象レコード数) > 1 and Get(最終エラー) = 0]」としてみました。
これはこれで、殆どの場合、期待した動作をするのですが、
検索がキャンセルされた場合、そもそもこのスクリプトの「検索実行」以下を実行しない方法とか有るでしょうか?
お世話になっております。
さて、フォーム形式のレイアウト(A)をブラウズモードで表示している状態から、
検索モード(Ctrl+F)でレコードを検索し、
対象レコードが一つ、もしくは対象レコードがなくて「キャンセル」で戻ったら、元のレイアウト(A)で表示して、
対象レコードが複数だったらリスト形式のレイアウト(B)で表示する
ということをしたいのですが、
どのスクリプトトリガから、どのようなスクリプトを実行したら良いでしょうか。
ご教授お願いします。
環境:Windows10,Filemaker Pro 15 Advanced
Pages: 1
[ Generated in 0.009 seconds, 7 queries executed - Memory usage: 685.63 KiB (Peak: 722.79 KiB) ]