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

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

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

You are not logged in.

Announcement

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


#1 2018-09-09 16:22:50

MaYa
Member

他のテーブルあるレコードに、同じ値があるなら、値をコピーするとういうスクリプトが旨く動かないです。

他のテーブルあるレコードに、同じ値があるなら、値をコピーするとういうスクリプトが旨く動かないです。
何度やってみてもうまくできないのでご相談します。
環境はWin10 FMP14adv です。

2つのテーブルのフィールドの比較と値の収取につきまして、ご相談です。

【実験1】
*************************************
「実験テーブル」と「実験データ」を用意して、両方のテーブルに「ID」と「値」フィールドをそれぞれ作ります。

「実験テーブル」には3つレコードを作りました。
1つ目 「ID」1  「値」空欄
2つ目 「ID」A  「値」空欄
3つ目 「ID」空欄  「値」空欄

「実験データ」には1つレコードを作りました。
「ID」1  「値」OK

スクリプトで「実験テーブル」の「ID」フィールドと 「実験データ」の「ID」フィールドが同じなら、 「実験データ」の「値」フィールドを「実験テーブル」の「値」フィールドにコピーをしなさい。
違った「無いよ」としなさい。

IF[実験データ::ID = 実験テーブ::ID]
   フィールド設定[実験テーブル::値; 実験データ::値]
Else
   フィールド設定[実験テーブル::値;”無いです”]
End if

結果は実験テーブルの1つ目は 「無いです」 2つ目は「無いです 3つ目は「空欄」
となりました。

実験2
****************************************
次に、スクリプトの内容を変えてみました。
IF[実験データ::ID = 実験テーブ::ID]
   フィールド設定[”有ったよ”]  ← IDが合致したら、「有ったよ」と表示するにした。
Else
   フィールド設定[実験テーブル::値;”無いです”]
End if

結果は実験テーブルの1つ目は 「無いです」 2つ目は「無いです 3つ目は「有ったよ」
となりました。
***************************************
問題が2つあるように思えます。
IFで「実験テーブル」と「実験データ」の」比較が旨くいかない。
「実験データ」からデータを持ってこれない。

スクリプトの問題なのでしたらお教えください。
よろしくお願いいたします。

Offline

#2 2018-09-09 16:40:25

Moz
Member

Re: 他のテーブルあるレコードに、同じ値があるなら、値をコピーするとういうスクリプトが旨く動かないです。

スクリプトでフィールドの値を取得する際には
レイアウトがそのテーブル(テーブルオカレンス)に基づいている必要があります。
または現在のレイアウトとリレーションが成立している必要があります。

「実験テーブル」のレイアウトで実行している場合、
リレーションが成立していなければ「実験データ」テーブルのフィールドの値は取得できません。

1)では3つ目のレコードの「ID」が空欄です。
「実験データ」のフィールドの値は取得できないため常に空欄です。
Ifが成立するのは3つ目のレコードの場合のみ「空欄」=「空欄」のため結果通りとなります。

2)でも同様に3つ目のレコードでのみ「空欄」=「空欄」が成立するため「有ったよ」となります。

全体の構造や目的がわからないため最適解を示すには材料不足ですが
双方のテーブルで「ID」でリレーションを設定すればスクリプトを使わずとも
「ID」フィールドの値が一致した「実験データ」のテーブルの値を参照・取得できます。

Last edited by Moz (2018-09-09 16:41:22)

Offline

#3 2018-09-09 20:41:35

MaYa
Member

Re: 他のテーブルあるレコードに、同じ値があるなら、値をコピーするとういうスクリプトが旨く動かないです。

ありがとうございます。
全くその通りでした。
リレーションとテーブルオカレンスの違いが今一つ分かりません。
でもこれは別のお題なので、改めて投稿します。

それから リレーションを使わずにスクリプトで処理を行う理由ですが、できればお考えをいただけるとありがたいです。
作っているのは、データテーブル内のフィールド値に、親テーブルにあるグローバルフィールド値で指定した値で、データテーブル内のフィールドで計算を行います、そしてその計算結果値が検索条件になります。また検索は別の条件(例えば日付の範囲とか)で同時にあと2つ程度が加わります。
データテーブルには50万レコードが有り、この結果、検索条件を変更すると、結果の表示まで5分~10分程度かかるようになってしまいました。
そこで、あらかじめデータテーブル上に使いそうな計算結果値を配置しようと考えました。そうすれば、データテーブルの計算フィールドが不要になるので、結果の表示が早くなると考えたのです。その計算をスクリプトで行うための実験です。
高速化のお考えがございましたらご指導いただけるとありがたいです。

Offline

#4 2018-09-09 21:25:25

Moz
Member

Re: 他のテーブルあるレコードに、同じ値があるなら、値をコピーするとういうスクリプトが旨く動かないです。

グローバル格納のフィールドを基にした計算フィールドは索引非保存となるため
検索を行うと検索対象全てで再計算されます。(対象のレコード数に比例して時間がかかる)

現状でなにも変えずに検索速度を上げるには検索の順番を変えます。
(止むを得ず索引非保存のフィールドを検索する必要がある場合有効です)
具体的には日付などの索引保存フィールドに対する検索(検索実行)を先に行い
最後に索引非保存のフィールドに対して絞り込み(対象レコードの絞り込み)を行います。

最初から索引非保存のフィールドを検索すると50万回計算が必要ですが
日付などで1000レコード程度に絞れていれば1000回程度の計算で済みます。

次にグローバル格納のフィールドを含む計算フィールドが本当に必要か否かです。
現在のような抽象的な説明ではなく具体的な説明が欲しいです。

例えばグローバル格納のフィールドの値を含むレコードを調べたいのであれば計算フィールドは不要です。
単純にグローバル格納の値で検索すれば済みます。(グローバル格納のフィールドはどのテーブルからも参照可能です)
他にもグローバル格納に本日日付を入れて、各レコードの有効期限と比較して期限切れの計算を行っている場合など
単純に有効期限が本日より前のレコードを検索すれば済みますから計算する必要はありません。

Offline

#5 2018-09-10 21:40:38

MaYa
Member

Re: 他のテーブルあるレコードに、同じ値があるなら、値をコピーするとういうスクリプトが旨く動かないです。

日常業務に入ってしまってお返事が遅くなりました。
ご回答を頂いてありがとうございます。
検索の順のご指摘ですがどうやってやるのか調べてみます。
具体的な状況ですが、実験がへんてこなので自分のためにもまとめてみます。
お気遣いをいただきまして本当にありがとうございます。
投稿をさせていただきます。

Offline

#6 2018-09-11 09:56:18

Shin
Member

Re: 他のテーブルあるレコードに、同じ値があるなら、値をコピーするとういうスクリプトが旨く動かないです。

結果が、
1つ目 「ID」1  「値」OK
2つ目 「ID」A  「値」無いです
3つ目 「ID」空欄  「値」無いです
を期待しているのでしたら、実験テーブルに、実験データを比較インポートし、対象外を表示し、それ以外のレコードは全置換で処理するのが簡単では。

または、いきなり、
Case ( IsEmpty ( 実験データ::値 ) ; "無いです" ; 実験データ::値 )
で全置換してもいいかも。ただ、50万レコードだとまあまあの耳管がかかるでしょうね。

Last edited by Shin (2018-09-11 11:15:33)

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.005 seconds, 9 queries executed - Memory usage: 537.37 KiB (Peak: 541.91 KiB) ]