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

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

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

You are not logged in.

Announcement

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


#1 2017-04-13 17:43:12

サンソン
Member

抽出について

いつもお世話になっております。

すみません、また基本的な事なのですが・・・

100万行程の売上データ(数年分)について、
月ごとの売上を見ようと、「販売日時」(例:20170101)の、左から6文字を抽出した「販売年月」(例:201701)を作成する為に、
新しいフィールド「販売年月」を作り、その内容を「Left ( 販売日時 ; 6 )」で全置換しようとしました。

ところが、この処理が延々と15分程かかるのです。

Accessでは似たような処理で1分もかかったことがありません。

たかだか置換でこれほど時間がかかる物なのでしょうか。
それとも、そもそも自分のデータから、似たデータを複製しようとする処理そのものを改めるべきなのでしょうか。。。

よろしくお願いいたします。

Offline

#2 2017-04-13 20:33:14

Hiro
Member

Re: 抽出について

> 100万行
行って何? 100万レコードのこと??

FMが15倍も遅いって?本当に確証されているのなら、Accessを使われては!!

計算フィールドでなく、計算値の全置換を使う理由は?

Offline

#3 2017-04-14 09:18:36

サンソン
Member

Re: 抽出について

Hiro様

ご返信ありがとうございます。

100万レコードの事です。

私もそうしたいのは山々なのですが、どこの世界にも信者の様な方はいて、今回の案件はFM一色なのです。。。

計算フィールドでない理由は、そのフィールドがリレーション先である為です。

ただ、私も「リレーション先が計算フィールドだと動作しない」という思い込みを信じているだけなので、もう少し試してみます。

Offline

#4 2017-04-14 09:54:06

qb_dp
Member

Re: 抽出について

100万レコードのLeft関数での全置換で、そんなに時間かからないですよ。CPU:i5のPCで、単体利用で40秒くらい、共有でも2分以内でした。
共有の場合は、ネットワーク状況に左右されるかも。

あと、集計を取るために、201704 などの新たなフィールドを作らなくても、検索するとか、リレーションを張る事で集計した方が良いかと思います。
>(例:20170101)
コレは、テキストになっているのでしょうか?日付は、日付として扱った方が、素直に処理出来ますよ。

以下のような検索指定も出来ますし、表示形式を変えるのもカンタンです。
http://www.filemaker.com/help/15/fmp/ja … es.html%23
2017/04/*
2014/7/{1...15}
2015/{1..3}/{10..16}

Offline

#5 2017-04-14 10:09:50

チポ
Member

Re: 抽出について

> 計算フィールドでない理由は、そのフィールドがリレーション先である為です
日付が関連テーブルのフィールドということですか?

現テーブルから見たレコード数の関係が、
多対1
ならば、
関連テーブルで処理した方が早いでしょう。
これを計算フィールドしても何ら問題ないですよ。


小計パートを使った集計だと、
年月フィールドが必要ですが、、
年月ごとを1レコードとする別テーブルで集計した方がいいかも。。

現テーブルを関連テーブルとするには索引保存した日付フィールドが必要になりますが。

Offline

#6 2017-04-14 10:51:53

Shin
Member

Re: 抽出について

同じテーブル内のフィールドのみを参照するので、計算フィールドにしても索引は作れます。計算フィールドにするのがベストでしょう。
または、リレーションの設定を範囲に変えるか、でしょう。

Offline

#7 2017-04-14 11:52:08

Hiro
Member

Re: 抽出について

> 私もそうしたいのは山々なのですが、
・性能差異が15倍もあるなら、何らかの比較テスト上の問題・原因があると考えてみて下さい。
・常識的に考えても、商業ソフトでそんな大差は許されません!

> どこの世界にも信者の様な方はいて、。。。
・FMファンは、信者ではなく、科学技術者です、もちろん ~~;

> 計算フィールドでない理由は、そのフィールドがリレーション先である為です。
・照合先キーはフィールド「索引」が必須なのであって、「計算」フィールドかどうかは関係ありません。

>「Left ( 販売日時 ; 6 )」
・このテキスト演算式の計算結果が意図した結果(yyyymm)になる保証はありますか?
・FMの日付書式に(yyyymmdd)形式はありません。
・販売日時はテキスト値(yyyymmdd)であることが担保されていますか?

Last edited by Hiro (2017-04-14 12:58:17)

Offline

#8 2017-04-14 17:52:29

サンソン
Member

Re: 抽出について

<qb_dp様>
ご返信ありがとうございます。
わざわざ時間まで調べて下さりありがとうございます。
ご指摘通り、横着せずスクリプトの検索で乗り切ります。
日付も個人的に苦手で数字での処理を行っておりましたが、日付でやってみます。
ありがとうございました。

<チポ様>
ご返信ありがとうございます。
現テーブルから見たレコード数の関係は1対多になります。
その関係性によって、どちらのテーブルで計算フィールドを持つか考えればいいのは目からウロコでした。
もうスクリプトの検索で逃げようと思うので、置換は行いませんが、ご指摘ありがとうございます。

<Shin様>
リレーションの設定を範囲に変える・・・との事ですが、例えば、
●テーブルAの「販売日時」フィールドに、「20170101」
●テーブルBの「期間」フィールドに、「201701」
とあって、やろうと思えば
『「販売日時」の前6文字』と『「期間」全て』でリレーションを組めるという事でしょうか。
是非詳しく聞きたいです。よろしくお願いいたします。

Offline

#9 2017-04-14 19:07:21

Shin
Member

Re: 抽出について

ファイルの構造について、詳しい情報が必要です。
販売日時は、テキストで入っている様な感じですが?その情報は、他のテーブルを参照しているのですか?ならば、そのリレーション関係は?
文字での比較やリレーションは、比較的遅くなります。それを日付や数値に変更した方が格段に早くなるでしょう。

Offline

#10 2017-04-14 19:41:33

サンソン
Member

Re: 抽出について

<Shin様>
ご指導すみません。
「販売日時」フィールドは、テキスト形式で「20170101」の様な形で入っております。
この情報はどこかを他のテーブル参照しているわけではありません。

販売データ系は全て、元の基幹システムのテーブルデータを参照しておりますので、形式を変えるのは少しためらわれます。。。

Offline

#11 2017-04-14 19:55:18

サンソン
Member

Re: 抽出について

<qb_dp様>
もしまだ見て頂ければ幸いと思い書き込ませていただきます。

また初歩的な事で申し訳ないのですが、
「リレーション」ではなく「検索」で、売上テーブルから、売上を集計をしたい対象レコードを絞り込んだのですが、その売上を集計する事が難しいのです。
「リレーション」で対象レコードを絞り込んでいれば、「売上」フィールドをSum関数で指定する事でいくらでも計算できそうなのですが、
「検索」で対象レコードを絞り込むと、絞り込みはあくまで見た目だけなので、いざレコードを跨いで売上を集計しようとすると方法が思いつかないのです。。。

今回、売上テーブルは、会社の基幹システムのテーブルですのでなかなか手を付けづらく、集計フィールドを付ける事も躊躇われます。

検索で絞り込んだデータを関数で集計する事は可能でしょうか。
もしくは基幹データを「ODBCデータソースの追加」で閲覧しているのですが、集計フィールドの追加などは行っても別の場所で支障など出ないでしょうか。

よろしくお願いいたします。

Offline

#12 2017-04-21 14:03:47

あると
Member

Re: 抽出について

ローカルで、その部分だけサンプルファイルを作ってみてはどうですか?
フィールドの作り方であるのか、リレーションの組み方であるのか、集計の手順であるのか、ネットワーク速度であるのか、基幹データの参照によるものか、どれが原因かはっきりしていない状態に思えます。

手順は、基幹データをODBCでデータを取得して、リレーション先のフィールドを、全置換を行っている。ということで、よろしいでしょうか?

とりあえず、時間がかかるかどうかだけであれば
フィールドを1個だけもつテーブルを作ります。

スクリプト1で「100万レコード作成」
変数[$Count;1]
変数[$CountMax;1000000]
Loop
新規レコード作成
フィールド設定[フィールド;”2017/04/21” ]
変数[$Count;$Count+1]
ExitLoopIf[$Count>$CountMax]
EndLoop
カスタムダイアログ「終了しました」

これで、レコードを用意します。フィールド内容は、上記は固定してますが、すべてバラバラでも問題ありません。
全置換
Substitute(フィールド;"/";””)

これで、何秒かかるか確認すれば、置換が問題であるかはわかると思います。これで遅くなければ、それ以外ですから、順々に確認していけば問題点がどこかわかると思います。
また、サンプルファイル(レコード無し)は掲載すれば、皆さんに確認してもらえるかも。

Offline

#13 2017-04-21 14:53:17

Shin
Member

Re: 抽出について

日付がその形のテキストでも、比較リレーションは可能ですが。テキストの比較になるので、比較的遅くなります。グローバルフィールドに上限値と下限値を持たせて、リレーション条件を比較にすれば良いです。

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 594.9 KiB (Peak: 611.8 KiB) ]