みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
環境:FM12 WIN7
PCスペックは悪く無いかと思うのですが
最近全置換が遅くなった気がします。
・フィールドA
計算&計算&計算 → 計算フィールド ← ここを全置換
といった感じです。
今までも計算式の全置換などを行っておりますが
明らかに遅い感じがします。
★思い当たる最近追加したフィールドやスクリプト
・IFやCASEを結構な数 入れ子にする
・valuelistitem、Getvalueを結構な数 入れ子にする 等です。
6000レコードを置換 → 5998 → 5992 と減っていきます…
この関数を使うと重くなる or 軽くするコツなどがありましたら
ご教示いただけますでしょうか。
よろしくお願いいたします。
ValueListItems() などのデザイン関数は、遅くなりますね。全置換を行う前に、グローバル変数へ設定しておくと、かなり早くなるかも。
また、参照するフィールドが他のテーブルやファイルに存在していると、遅くなる傾向があります。
Offline
ありがとうございます。
>> グローバル変数へ設定しておくと、かなり早くなるかも。
とありますが、変数はよく計算式で使うのですが
グローバル変数とはどのように使うのでしょうか…?
調べてみたのですが、使い方は変数とあまり変わらないようですが
どのように全置換の際に使用すればよいのか検討がつきません。
よろしくお願いいたします。
普通の変数は、ローカル変数ですので、そのスクリプト内のみで有効です。
グローバル変数は、そのファイルが閉じられるまで値が保持されており、いろいろなところから参照が可能です。
Offline
変数には何を格納すれば早くなるのでしょうか?
計算式格納を試しましたが、1つの値で全置換されてしまいました。
理解が悪く申し訳ありません。
例えば、ValuListItems() の返り値を保存しておいて、全置換の式の中で参照します。
具体的にどのような式で全置換されているの書かれたほうが早いですよ。
Offline
一部転記させていただきます。
If ( ValueListItems ( Get(ファイル名) ; "A" ) ≠ "" and GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) ≠ "" and C ≠ "" ;
Case (
PatternCount ( E ; "あ" ) ≥ 1 ; C & "-U" & GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) & Substitute ( ValueListItems ( Get(ファイル名) ; "A" ) ; ¶ ; " / " & C & "-U" & GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) ) & "<br>" ;
PatternCount ( E ; "い" ) ≥ 1 ; C & "-M" & GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) & Substitute ( ValueListItems ( Get(ファイル名) ; "A" ) ; ¶ ; " / " & C & "-M" & GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) ) & "<br>" ;
PatternCount ( E ; "う" ) ≥ 1 ; C & "-L" & GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) & Substitute ( ValueListItems ( Get(ファイル名) ; "A" ) ; ¶ ; " / " & C & "-L" & GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) ) & "<br>"
) ; "" )
これの10倍ぐらいの入れ子 IF となっております。
改善の余地ありますでしょうか…?
よろしくお願いいたします。
動的値一覧だと、レコードごとに違うので、前もって変数にというのは無理ですけど
Letを使って同じ計算を何度も書かないようにすれば多少は違うかな。
Offline
こうですかねえ?
Let ( [
listA = ValueListItems ( Get(ファイル名) ; "A" ) ;
valueB = GetValue ( ValueListItems ( Get(ファイル名) ; "B" ) ; 1 ) ;
flag = Case (
PatternCount ( E ; "あ" ) ; "-U" ;
PatternCount ( E ; "い" ) ; "-M" ;
PatternCount ( E ; "う" ) ; "-L" ;
"" )
];
Case ( flag <> "" ; C & flag & valueB & Substitute ( listA ; ¶ ; " / " & C & flag & valueB ) & "<br>" ; "" )
)
Offline
Let (
[
vlA = ValueListItems ( Get(ファイル名) ; "A" ) ;
vlB = ValueListItems ( Get(ファイル名) ; "B" ) ;
vaB = GetValue ( vlB ; 1 ) ;
vaA = C & "||" & vaB & Substitute ( vlA ; ¶ ; " / " & C & "||" & vaB ) & "<br>"
] ;
Case (
IsEmpty ( vlA ) ; "" ;
IsEmpty ( vaB ) ; "" ;
IsEmpty ( C ) ; "" ;
PatternCount ( E ; "あ" ) ; Substitute ( vaA ; "||" ; "-U" ) ;
PatternCount ( E ; "い" ) ; Substitute ( vaA ; "||" ; "-M" ) ;
PatternCount ( E ; "う" ) ; Substitute ( vaA ; "||" ; "-L" )
)
とすると、ずいぶん早くなると思います。
If は絶対に、Case はできるだけ入れ子にしないように論理を組むことを、おすすめします。
Last edited by Shin (2013-10-29 09:11:01)
Offline
waderさんのは条件が一部抜けてますね。
Shinさんのは、Cのフィールド値や値一覧に"||"が含まれないのが条件。
遅いだけで結果は得られてるという話ですけど、この式だけ見てると値一覧Bの1番目だけ大量に?表示してて、妙な感じです。
AとBは動的値一覧の様ですが、
とすれば、、
Aは関連レコードが無いレコードを最初から対象外にすることもできるのでは。
Bの1番目だけがブランクとはあり得ないのでは。
また、
> C ≠ ""
これも対象外にできそうですよね。
とすれば最初のIFの条件が不要になるし、
対象レコードが減る可能性がでてきます。
Offline
皆様 ありがとうございます。
Letがいまだよくわかっていないのでwader様、Shin様の式を元に試行錯誤してみたいと思います。
>> チポ様
10000件分の6000件を出力 などの処理となり、レコードを対象外にするとややこしくなったり、
上記式以外のフィールドの更新もあるため、一概に対象外にはできないため
当てはまらないものも全置換かけている状態でした。
ご教示いただいたように、レコード数を減らしたり、工程を減らしたりと
考えてみたいと思います。
なぜ全置換しないといけないのか、を考えてみたほうがいいかも。
おそらく、設計に問題があると思います。
Offline
>なぜ全置換
それもそうですね。
HTMLを生成してるような感じですけど、エクスポートするなら単に非保存計算フィールドでもいいかもしれない。
むろん、全置換が遅かったら、その式の非保存計算でも同様の時間がかかるでしょうけど、置換が1回じゃないようだから、
エクスポートなら1回で済む分は早いかも。
Pages: 1
[ Generated in 0.007 seconds, 7 queries executed - Memory usage: 545.69 KiB (Peak: 566.23 KiB) ]