みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になっております。
いまいちグラフの設定方法がわからないので、どなたかご教授お願いします。
Windows10 FM18 です。
フィールド名:名前 →(A君・B君・C君・D君・・・)
フィールド名:日付
フィールド名:教科CODE (01国語 02英語 03社会 04理科 05数学・・・)
フィールド名:学習時間
とあります。
リスト式で入力したデータ
A君 5/31 05 数学 2:00
A君 5/31 02 英語 1:00
A君 5/31 03 社会 0:30
B君 5/31 05 数学 1:00
B君 5/31 02 英語 1:00
B君 5/31 03 社会 1:00
B君 5/31 04 理科 0:30
C君 5/31 01 国語 2:00
C君 5/31 03 社会 2:00
D君 5/31 01 国語 3:00
A君 6/1 04 理科 2:00
A君 6/1 02 英語 1:00
A君 6/1 05 数学 0:30
A君 6/1 03 社会 0:30
B君 6/1 05 数学 1:00
B君 6/1 02 英語 1:00
B君 6/1 04 理科 0:30
C君 6/1 01 国語 2:00
C君 6/1 03 社会 2:00
C君 6/1 02 英語 1:00
D君 6/1 02 英語 1:00
・・・
のような個人・日別の学習時間データがあります。
指定した日付期間の個人・日別の積み重ねグラフを作成したいです。
Y軸に教科の積み重ねグラフ
X軸に個人・日別に表示(5/31 A君・B君・C君・D君 6/1 A君・B君・C君・D君 6/2・・・)
ExecuteSQL関数を使うという過去ログを見てやってみたんですが、
→ https://fm-aid.com/bbs2/viewtopic.php?id=9188
縦横の違いもあるのか上手くいきません。
これまでグラフは使ってなかったので、勉強不足なのは充分に承知してますが、
初心者でもわかるよう噛み砕いた説明をご教授くださいますようお願いします。
まず、全員全日付のデータがあるのかどうか、ない場合補完する必要があるのかどうか。
レスありがとうございます。
人によって学習時間がない日も発生します。
例えば6/2にA君・B君・C君のデータがあり、D君のデータがないとして
日付期間を5/31~6/2とした場合。
その場合はX軸を
A君・B君・C君・D君 A君・B君・C君・D君 A君・B君・C君・D君
-------5/31---------- ------- 6/1---------- ------- 6/2--------- ↑0表記
X軸は指定した日付期間にデータがある個人名にしたいです。
要望とは違うが
ExecuteSQL関数を使わない基本的方法で・・それもテーブル構成も変えて
例えば
名前 日付 国語 英会話 社会 理科 数学 ・・X項目(計算・・日付&名前)
A 5/31 1 0.5 2
B 5/31 1 1 0.5 1
とすればグラ設定のX軸はX項目で45°位で、Y軸の系列追加(国語 英会話 社会 理科 数学・・)はフィールド名を使えば計算式で悩まなくて済む
-------5/31---------- ------- 6/1---------- ------- 6/2--------- ↑0表記
のような器用な表記が出来ないのでかなり泥臭い表示になる。後、時間もグラフ軸で使うのに数値の方が楽なので表示方式を変更した
余計な事かもと思いましたが・・・
テーブル構成を変えないでExecuteSQL関数のCASE式を使いクロス集計的表示を利用する方法
フィールドをa2(計算・・日付& 名前)、a3(計算・・(Hour(学習時間)*60*60+Minute(学習時間)*60) / (1*60 * 60) )追加して
次のスクリプトでグラフ表示(但し今回は期間設定を設けていません)
変数を設定 [ $x; 値:ExecuteSQL(" SELECT DISTINCT \"a2\" FROM \"学習データ\" ORDER BY \"a2\"";"";"") ]
変数を設定 [ $crt; 値:Let([data=While ( [ $cnt=0;lst=""] ; $cnt ≤ ValueCount( $x )-1 ; [ lst=lst& "SUM( CASE \"a2\" WHEN '" &GetValue ( $x ; $cnt+1) & "' THEN \"a3\" ELSE 0 END),";$cnt=$cnt+1] ; Left (lst ;Length (lst)-1) ); $lst1=ExecuteSQL ("select " & data & " from \"学習データ\" group by \"教科CODE\"";"";"")]; $lst1 ) ]
変数を設定 [ $y1; 値:Substitute ( GetValue ($crt; 1 );",";¶) ]
変数を設定 [ $y2; 値:Substitute ( GetValue ($crt; 2 );",";¶) ]
変数を設定 [ $y3; 値:Substitute ( GetValue ($crt; 3 );",";¶) ]
変数を設定 [ $y4; 値:Substitute ( GetValue ($crt; 4 );",";¶) ]
変数を設定 [ $y5; 値:Substitute ( GetValue ($crt; 5 );",";¶) ]
変数を設定 [ $y6; 値:Substitute ( GetValue ($crt; 6 );",";¶) ]
ウインドウ内容の再表示
グラフ設定
データソースは 現在のレコード (タブ区切りデータ)
X 軸
タイトル: "日付_名前"
系列:
値: $x
Y 軸
タイトル: "学習時間"
系列 1:
値: $y1
タイトル: Let ([_Row = 1]; GetValue (ExecuteSQL ("select \"教科名\" from \"教科\" order by \"CODE\"";"";"") ; _Row ) )
系列 2:
値: $y2
タイトル: Let ([_Row = 2]; GetValue (ExecuteSQL ("select \"教科名\" from \"教科\" order by \"CODE\"";"";"") ; _Row ) )
系列 3:
値: $y3
タイトル: Let ([_Row = 3]; GetValue (ExecuteSQL ("select \"教科名\" from \"教科\" order by \"CODE\"";"";"") ; _Row ) )
系列 4:
値: $y4
タイトル: Let ([_Row = 4]; GetValue (ExecuteSQL ("select \"教科名\" from \"教科\" order by \"CODE\"";"";"") ; _Row ) )
系列 5:
値: $y5
タイトル: Let ([_Row = 5]; GetValue (ExecuteSQL ("select \"教科名\" from \"教科\" order by \"CODE\"";"";"") ; _Row ) )
系列 6:
値: $y6
タイトル: Let ([_Row = 6]; GetValue (ExecuteSQL ("select \"教科名\" from \"教科\" order by \"CODE\"";"";"") ; _Row ) )
久しぶりに作ったので手間が掛かったし個々のデータの表示の仕方が分からない・・情けない
古いがExecuteSQL関数を使ったグラフに関するサイト・・参考まで
https://www.soliantconsulting.com/blog/ … filemaker/
koko009様
すいません。レス見逃してました。
かなりお手間をとらせてしまったようで申し訳ないです。
いただいた回答を基に一度設定にトライしてみます。
が、結構複雑になっちゃうんですね。
エクセルにエクスポートして作業したほうが早いかしら・・
>エクセルにエクスポートして作業したほうが早いかしら・・
Excelにエクスポートするにしても、そのままの構成では結構面倒です。ただX軸はご希望通り2段構成が可能ですが・・・
例えば最初の例示の方法(計算フィールドの追加は不要)をそのままエクスポートすればそのままグラフの範囲設定に使えるし、もしテーブル構成を変えたくないのならば
CASE式に手を加えればクロス集計が出来上がるのでExcelへのコピペでグラフ範囲の設定が可能です。
多分一見大変そうに見えるけどグラフ設定のデザインレポートが詳細なだけで、1個のスクリプトとグラフ設定で変数を$y1,$2・・の変数を教科分だけ最初に作り記述するだけです。系列名は、他のテーブルから取得する計算式を書きましたが、直接教科名を記述しても可能です。
0,0,2,3,0,0,2,0,0
1,1,0,0,2,1,1,1,0
.5,1,2,0,.5,0,2,0,2
0,.5,0,0,2,.5,0,0,0
2,1,0,0,.5,1,0,0,0
上記のCASE式で作成した内容の変数を、1行ずつ改行区切りのデータに変換してy軸のデータとして渡しているだけです。なお直接時刻フィールドはExecuteSQL("SELECT SUM(\"学習時間\")の計算が成立しないので秒変換してExecuteSQL("SELECT SUM(NUMVAL(\"学習時間\"))の計算で求めざるを得ないのでy軸の値が秒表示になるためそれがいやで一旦10進法の数値に変換しています。でもこのフィールドはCASE式に計算を組み込めば不要となります。
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 544.1 KiB (Peak: 565.01 KiB) ]