みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっております。
filemakerのレコードからjavascriptで使う配列データ('VPFK','LSSB','ODFD','CVEW','GUIT',・・・)を取得するためあるサイトを参考に下記の計算式を使い変数として得ましたが
"'" & Let ([
#field =data::item
];
GetNthRecord ( #field ; 1 ) &
SetRecursion (
While ( [#max = Get ( 対象レコード数 );
#i = 1;
#result = ""] ; #i < #max; [ #i = #i + 1;
#result = #result & "','" & GetNthRecord ( #field ; #i )] ; #result )
;Get ( 対象レコード数 ))) & "'"
フィールド設定でもってレコード数20000で所要時間が5303556~7378612マイクロ秒掛かりました。
以前からのExecuteSQLを使った計算式では、69510~79589マイクロ秒でした。
そこでwhile関数を使う方法で、処理速度を上げる計算式をお教え願います。
何故while関数に拘るかと言えば、ExecuteSQLの場合全レコードが対象となりますがwhile関数を使えば対象レコードだけで済むため検索結果等から配列データを取得出来るからです。ExecuteSQLでwhere句などで設定するより便利な気がして・・・
いま試しているは、ExecuteSQLを一切使わないでデータレコードからクロス集計(繰り返しを使わない方法)データを生成してそれからポータルとchart.jsを使いwebビューアにグラフを並べて表示させ事ですのでレコード数も限られているので全然問題はありませんが、ふとjavascriptの計算に使えるかどうかと思ったもので質問させていただきました。
なお、使用環境はwindows11 filemaker pro2023(バージョン 20.1.2.204)になります。
#field =data::item
とあるのですが、評価するコンテンツは、data ですか。
検証していませんが、グローバルフィールドを使って、全置換するともっと早くなるかもしれません。
または、実行しているコンテンツが data でしたら、一覧する集計フィールドを使うと、格段に早くなる可能性があります。
実行しているコンテンツが data でなければ、List ( data::item ) を取得しても早くなるはずです。
Last edited by Shin (2023-07-24 15:13:56)
Offline
dataテーブルにid,itemフィールドがあり下記のような対象レコードが20000(レコード総数は1000000です)あり、これを配列データ[('VPFK','LSSB','ODFD','CVEW','GUIT',・・・]の形にするための作業です。
計算式は「https://kei0114.hatenablog.com/entry/2021/04/24/224639」からそのままコピペして少し書き換えただけです。
id item
1 VPFK
2 LSSB
3 ODFD
4 CVEW
5 GUIT
6 CLNC
7 EZIJ
また、List ( data::item )は、リレーション張らずにwhile式の中で使う事を指しているのでしょうか。
GetNthRecord関数はおそらくコールごとに通信が発生するので、レイテンシの影響が大きいのではありませんか?
Shinさんの言うようにListを使うか、ExecuteSQLで一括取得してからループ処理した方がよいのではないかと思います。
Offline
一覧する集計フィールドを使うと、格段に早くなる可能性があります。
Shinさんが書いている↑は、↓の事で、集計フィールド:一覧 を作成すればリストがすぐに作れるという事です。
集計フィールドの定義 | Claris Pro および FileMaker Pro ヘルプ
https://help.claris.com/ja/pro-help/con … 6%E8%A8%88
Offline
簡単なテキスト処理で行う方法
https://www.dropbox.com/scl/fi/volurj2b … r4r57&dl=0
テキスト計算式のバッファーの容量を超えるかもしれませんんが
Last edited by Shin (2023-07-25 13:59:58)
Offline
確かに20,000行の内容のテキストを各レコードの集計フィールド(result)に置いておいても
"'" & Substitute ( data::result ; ¶ ; "','" ) & "'"
で配列データの形に要する時間は51068~53207マイクロ秒と速いですね。
1,000,000レコードで全表示したとき繰り返しを個別に設定したから2回ぐらい処理中のダイアログが繰り返され、全体設定では何度も・・・いままで集計フィールドの使い方をよく理解していない事もありなるべく使わないようにしていた。
while式にGetNthRecordを使うとmicさんが指摘された
>GetNthRecord関数はおそらくコールごとに通信が発生するので、レイテンシの影響が大きいのではありませんか?
で処理速度を遅くしているとは・・・loop処理よりwhileの書き方で格段に速くなると思い込んでいました。
shinさんの新し投稿を書き込み中に見逃していました
申し訳ありません。
なるほど、
Let (
ls = GetSummary ( ブック1::s_item ; ブック1::s_item ) ;
"{"
&
Substitute (
"'" & ls & "'" ;
[ ¶ ; "','" ]
)
&
"}"
)
勉強になります。
度々ありがとうございます。
Pages: 1
[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 521.17 KiB (Peak: 526.08 KiB) ]