みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
FM11利用です。
スクリプトの「対象レコードの編集」 → 「検索条件を指定」で
テーブル①::電話番号 と テーブル②::電話番号が一致した場合、レコードを対象外に処理したいのです。
今現在は、
テーブル②に別の計算フィールド(NGフラグ)を作って
Case ( 電話番号 = テーブル①::電話番号 ; "NG" ) と計算式を入れて
処理:レコードを対象外に
次の場合にレコードを対象外に:テーブル②::NGフラグ
条件:NG
としてスクリプトを実行しているのですが、対象レコードが計算フィールドだとクエリー処理にとても時間がかかります。
もし可能であれば
処理:レコードを対象外に
次の場合にレコードを対象外に:テーブル②::電話番号
条件: = テーブル①::電話番号
みたいに条件の中にフィールド指定できればと思うのですが、それは可能でしょうか?
もし可能であればなんて式を入れれば成り立ちますか?
可能でなければ、何か他の方法あれば助かります。
よろしくお願い致します。
Offline
検索モードでは計算式を入れられないので出来ないです。
リレーションとかが分からないけど、そんなに時間かかりますか?
Offline
テーブル1とテーブル2の関連性がよくわかりませんが。
電話番号の条件を含めた別のリレーションを張って、テーブル2から関連レコードへ移動、対象外レコードを表示、とすれば良い様です。
Offline
旅人さま
リレーションは
テーブル①::電話番号 = テーブル②::電話番号
です。
クエリに1分以上かかります。
他にも条件があるのですが、
処理:レコードを対象外に
次の場合にレコードを対象外に:テーブル②::NGフラグ
条件:NG
の条件を削除したら3秒くらいで処理が終わります。
明らか上記の条件が邪魔してると思われます。
Shinさま
リレーションは
テーブル①::電話番号 = テーブル②::電話番号 のみですが、
他のリレーションを張って、
テーブル2から関連レコードへ移動、対象外レコードを表示、とすれば良いのでしょうか?
関連レコードへ移動と対象外レコードを表示の使い方がいまいちよくわかりません。
とりあえず
関連レコードへ移動[テーブル:「テーブル②」;使用するレイアウト:<現在のレイアウト>]
対象外のみを表示
(対象外レコードを表示という項目がなかったです)
としましたが
「このレイアウトでは結果を表示できないため、この処理は完了できません。」
と警告がでます。
どうしたらよいでしょうか?
Offline
そのリレーションを使えばいいです。
テーブル2のレイアウトを表示し、関連レコードへ移動、しますが、テーブル1のレイアウトを指定します。
その後、対象外を表示、すれば良いはず。
Offline
リレーションは合っているんですね!
レイアウトの切り替え[「テーブル②(テーブル②)」]
関連レコードへ移動[テーブル:「テーブル②」;使用するレイアウト:Get(レイアウト名)="テーブル①"]
対象外のみを表示
としてみましたが、思っているような結果が出ません。
何が違うのでしょうか?
Offline
>リレーションは
>テーブル①::電話番号 = テーブル②::電話番号
リレーションはそれだけなのですか?ということは
①の対象レコードから①には有って②には無い電話番号のレコードを対象外にしたいという意味なのかな・・
Offline
リレーションはそれだけです。
対象レコードがよくわかってないのですが、
今現在、①には8万件位レコードがあって②には45万件位レコードが入っています。
①と②はもちろん被っているレコードとそうでない物があります。
その被っているレコードを①から除外出来ればいいのですが・・
Offline
関連レコードへ移動のオプションで、現在のでなく対象レコードにしてますか。
対象外のみを表示したあとで、その他の条件で絞り込み検索しないといけません。
あれ?2の方が多いんですか。それだと関連レコードへ移動に時間がかかりそう?
> 次の場合にレコードを対象外に:テーブル②::電話番号
> 被っているレコードを①から除外
どっちなのでしょう?
また、
> 他にも条件があるのですが
これって?
Offline
対象レコードというのは検索とかで絞り込んだ「該当件数/全レコード数」の該当件数の事です。
被ったものを除外する前に何等かの検索とかは実行していないのですか?
言い換えると、全レコードから被ったものを対象外にしたいだけですか。
Offline
tim様
>関連レコードへ移動のオプションで、現在のでなく対象レコードにしてますか。
関連レコードの取得元は「テーブル②」
レコードの表示に使用するレイアウトは<現在のレイアウト>にはしてません。
♯5のShin様が書いてた通り(テーブル1のレイアウトを指定します)にしたかったので、計算によるレイアウト名を選択して
Get ( レイアウト名 ) = "①(テーブル1のレイアウト)" という計算式をいれてみました。
結果オプションはチェックなしです。
あとレコードは②の方が多いんです。
その場合は時間がかかるんですか?
チポ様
> 次の場合にレコードを対象外に:テーブル②::電話番号> 被っているレコードを①から除外> どっちなのでしょう?
少し日本語がおかしくなっているかもしれませんが、
「今現在、①には8万件位レコードがあって②には45万件位レコードが入っています。
①と②はもちろん被っているレコードとそうでない物があります。
その被っているレコードを①から除外出来ればいいのです」
がわかりやすいと思うのですが。。
>また、> 他にも条件があるのですがこれって?
テーブル①には電話番号で管理している個人情報が8万件程あります。
その中で使えるレコードが数万件あるのですが、それを整理するのにいつか条件がありまして、
その中の一つが今回の質問の条件なんです。
旅人様
>被ったものを除外する前に何等かの検索とかは実行していないのですか?
実行しています。
予め局番や県域で絞り込みすることもあります。
もちろん全レコードから被ったものを対象外にすることもあります。
どちらでもいけるようにお願いします。
Offline
> 計算によるレイアウト名を選択して
> Get ( レイアウト名 ) = "①(テーブル1のレイアウト)" という計算式をいれてみました。
がおかしい。計算式で指定する必要はありません。レイアウトを指定すれば良いです。
Offline
関連レコードの取得元はテーブル②を選択であってますよね?
そうするとレコードの表示に使用するレイアウト → レイアウトを選択するとテーブル②しか出てこないんです。
テーブル①を選択したいんですけど、出てこないので仕方なしに計算式を入れてる状態なんです。
どこか間違ってますよね?
Offline
関連レコードの取得元は、テーブル1です。(非常にわかりにくい日本語です。取得先、というべきでは、と思っていますが)
Offline
レイアウトの切り替え[「テーブル②(テーブル②)」]
関連レコードへ移動[テーブル:「テーブル①」;使用するレイアウト:「テーブル①」(テーブル①)]
対象外のみを表示
ですかね?
このスクリプトだと求めている計算結果がでないです。
Offline
テーブル2は、全レコードが対象になっていますか。 関連レコードへ移動で、対象レコードから移動していますか。
Offline
>予め局番や県域で絞り込みすることもあります。
既に書きましたけど、移動先の関連レコードは常に全レコードからになるので、対象外にした後で絞り込む必要があります。
それは置いといて、求めてない結果だとしても今のスクリプトが十分な速度になってますか?
45万の全件処理になるんで、非保存のフラグ検索とどっちが速いか微妙。
(フラグなら索引を使わない処理は8万で済む)
フラグを保存するしかないかも。テーブル2から削除はあるんですか。
何回も検索したあと対象レコードから被っているのを除外したいという事もありそう。
レコード削除や追加が分からないけど、非保存の計算式結果を別フィールドに全置換しておくくらい?
Offline
Shinさま
>テーブル2は、全レコードが対象になっていますか。
おそらくなっているかと思うのですが、念のため
--------------------------
レイアウトの切り替え[「テーブル②(テーブル②)」]
全レコードを表示
関連レコードへ移動[テーブル:「テーブル①」;使用するレイアウト:「テーブル①」(テーブル①)]
対象外のみを表示
--------------------------
としてみましたが、出来ません。
>関連レコードへ移動で、対象レコードから移動していますか。
これはどういうことでしょうか?
→ >関連レコードの取得元は、テーブル1です。
と書いて下さったので、テーブル1にしてたのですが、
取得元=取得先であれば、
テーブル1の電話番号リストからテーブル2の電話番号フィールドに入っている番号を除外であれば
取得元はテーブル2ではないのでしょうか?
(すいません。あんまりわかってないもので)
timさま
>求めてない結果だとしても今のスクリプトが十分な速度になってますか?
→ 速度はとても速いです!(計算結果がでないので、間違いだらけだと思うので)
>フラグを保存するしかないかも。
→ 保存ってどうやってやるのですか?
>テーブル2から削除はあるんですか。
→ 削除することはありません。
Offline
関連レコードの取得元は、テーブル1です。
その下に「関連レコードのみ表示」チェックボックスと「現在のレコード」「対象レコード」というラジオボタンがあるんで、「対象レコード」を選択。
「現在の」でやってるから
→ 速度はとても速いです!
になってるんでしょう。スクリプトが終わった時に対象外のレコードが1つしかないのでは。(テーブル1に電話番号の重複がないとしたら)
フラグの保存
関連レコードへ移動したら、そのままフィールド内容の全置換で「NG」を入れる。
今後追加される2のレコードは、onRecordCommitのトリガスクリプトでテーブル1の関連レコードに「NG」を設定する。
絞り込みの速度を早めるために、テーブル1で抽出した後、関連レコードへ移動でテーブル2へ移動し、更に、関連レコードへ移動でテーブル1へ戻ってくる、それから、最初の抽出条件で絞り込む、という手を使うと、非常に早くなりますね。
8万件と45万件で検証して見ました。(テーブル2の中で重複がない、という前提で)
テーブル2の全件から移動すると1分程度
上の方法で、数秒
でした。1回目の絞り込みが1操作で行われているのでしたら、その後、対象外のみを表示、検索条件を変更、対象レコードの絞り込み、という3ステップで実行できますね。
Last edited by Shin (2013-12-10 13:33:55)
Offline
なるほど!データ作るの大変そうなので読んだだけですが
同じ検索を2回やるのが、急がば回れというか達人の技ですね。
Shinさま timさま
ありがとうございます。
すいません。もう少し詳しくお願いします。
>テーブル1で抽出
>関連レコードへ移動でテーブル2へ移動
>関連レコードへ移動でテーブル1へ戻ってくる
>最初の抽出条件で絞り込む
それぞれスクリプトのどの項目を選べばいいのかもわからないので大変お手数ですが教えて頂けますでしょうか?
Offline
[ Generated in 0.009 seconds, 9 queries executed - Memory usage: 638.89 KiB (Peak: 671.43 KiB) ]