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

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

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

You are not logged in.

Announcement

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


#1 2016-06-15 16:15:02

2つのテーブルを操作するスクリプトを教えてください

超初心者で申し訳ございません。
環境は FileMaker 10 Mac です。

下記の処理を行うスクリプトを教えていただけないでしょうか。

2つのテーブル M1 と M2 があります。
2つは同じフィールド名 code によってリレーションシップされています。

M1 の1レコード目を読み、その code で M2 を検索し、その M2 のレコードのフィールド condition が "OK" であれば以下の処理1を行います。
condition が "OK" でなければ以下の処理2を行います。

処理1
M2 のフィールド Text を M1 の同名フィールドにコピーします。
M2 のフィールド option を M1 の同名フィールドにコピーします。

処理2
M1 の同レコードを削除します。

以降、M1 を2レコード目、3レコード目と繰り返し、最終レコードの処理を行うまで loop して終了します。

どうぞ、よろしくお願い申し上げます。

Offline

#2 2016-06-16 16:07:41

チポ
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

レイアウトを行ったりきたりするより、
M1のレイアウトにM2のポータルを置いて、
そのポータル行の削除の判定をした方が速いでしょうね。

Offline

#3 2016-06-16 16:49:29

Shin
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

2個のテーブルは、1:1になっているのでは。
ならば、code でリレーションを張っておきます。M2 を OK で抽出しておき、M1 から照合インポートを行い、関連レコードへ移動で M1 へ戻り、レコード削除、だけでいいかも。

ただ、テーブル間でレコードを移動して元を削除、という運用は、ファイルの構成が荒れていくので、私は好ましく無いと思っています。

Offline

#4 2016-06-16 17:22:28

チポ
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

ああ、
M1のレコード削除をM2と間違えていました。

ポータル行削除
ではなく、
M1のレコード削除ですね。


Shinさんの方法、
いいですがフィールドコピーの方向をお間違えです。

  M2を「OK」で検索
  M2からM1へ関連レコード移動(対象レコード)
  M1で対象外のレコードを削除
  M1で照合インポート

M1が全レコードを表示から始めるのが条件です。

Offline

#5 2016-06-16 17:45:23

Shin
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

対処のテーブルを勘違いしていました。
M2で検索後、M1を全レコードを対象にして、M2を照合インポート、対象外のみを表示し削除、で良いでしょうね。

Last edited by Shin (2016-06-16 17:47:02)

Offline

#6 2016-06-17 16:55:36

Re: 2つのテーブルを操作するスクリプトを教えてください

お世話になります。
スクリプトを書いてみました。

他の開発言語では M2 を M1 の code で検索しないといけないはずですが、
FileMaker では、あらかじめ M1 - M2 が code でリレーションさせれば
その必要はないとの(誤った?)前提になっています。

・LOOP の次のステップで M2 を検索する必要がある場合、そのスクリプトは何でしょうか。
・コピー・貼り付けはこの冗長な方法であっているのでしょうか。

ちなみに、M1 と M2 の関係は M2 はマスタ的な役割で、フィールドは M1 よりも多く、レコード数も多く、リアルタイムに更新されます。
M1 は、そのうちの一部のデータを抜粋し、M2 より一部のフィールドをコピーしたレコード構成です。


M1 code 001 010 020 100 300
M2 code 001 002 003 004 005...


エラー処理[オン]
レイアウトの切り替え[「M1」(M1)]
全レコードを表示
レコード/検索条件/ページヘ移動[最初の]
LOOP
    if[M2::condition = "OK"]
        コピー[選択; M2::text]
        貼り付け[選択; M1::text]
        コピー[選択; M2::option]
        貼り付け[選択; M1::option]
    Else
        対象レコードを削除[ダイアログなし]
    End if
    レコード/検索条件/ページヘ移動[次の; 最後まできたら終了]
End Loop

どうぞ、よろしくお願い申し上げます。

Offline

#7 2016-06-17 17:10:55

Re: 2つのテーブルを操作するスクリプトを教えてください

度々、申し訳ございません。

書いたスクリプトを文字としてコピーする方法はないのでしょううか。
全選択しても行で選択肢ても、コピーできませんでした。

よろしくお願い申し上げます。

Offline

#8 2016-06-17 18:39:42

Shin
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

スクリプトの流れとしては良いのですが、コピペを使うより、フィールド設定を使った方が確実です。
また、レコードを削除した後に次のレコードへ移動すると、1レコード抜けてしまう事になります。それを避けるために1レコード戻るようにすると、最後のレコードが削除対象だった場合や、対象レコードが1レコードのみになった場合に loop から抜けられなくなる事があります。ちょっと工夫が必要かもしれません。

ちょっとトリッキーなスクリプトですが、FM の中でのインポートの時のレコードの動きを利用した物です。
https://www.dropbox.com/s/2vkk86e3qlx11 … 7.zip?dl=0

スクリプトのテキストへのコピーは出来ません。(クリップボードの内容は、xmlへ変換されたスクリプトその物です)
私のよくやる方法は、PDFへ書き出してテキストコピーするか、スクリプトをコピーして、クリップボードの編集ソフトを使って、内部のテキストを取り出しています。

Last edited by Shin (2016-06-18 04:41:53)

Offline

#9 2016-06-20 16:39:13

Re: 2つのテーブルを操作するスクリプトを教えてください

Shin 様
洗練されたスクリプトを教えていただき、ありがとうございます。

テストをしていて気がついた事象について質問させてください。

日本語以外のフィールドの場合に「"OK"」で対象レコードを絞り込むと、どうも OK1 や OK123 なども対象になってしまうようですが、これをただ OK だけのフィールドのみを対象とすることはできるのでしょうか。
http://www.filemaker.com/help/12/fmp/jp … t.5.6.html

M1 の削除対象レコードを削除すると同時に、対応する M2 のレコードも削除されてしまうようなのですが、 M2 のレコードを残すことはできないでしょうか。

どうぞ、よろしくお願い申し上げます。

Offline

#10 2016-06-20 17:54:59

Shin
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

検索条件で、 =="OK" にしておくと、その他の物は除外されます。
M2 のレコードは、削除されていないはずです。対象外になっていて、見えていないだけでは。削除されてしまっているのでしたら、リレーションの設定を確認してみてください。

Offline

#11 2016-06-21 17:07:17

Re: 2つのテーブルを操作するスクリプトを教えてください

Shin 様
ご指摘の通り、=="OK" で対応出来ました。
また、M2 も削除されておらず、見えていないだけでした。

確認不足で申し訳ございませんでした。


次のつまずきを、出来れば教えていただきたいのですが。

M1 - code Text option resist
M2 - code condition Text option resist1 resist2 resist3

先の応用で、下記のような処理は可能であることを確認しました。

1.M2-resist3 が > 0 の場合、M2-resist3 を M1-resist に代入。


しかし、下記のような計算式を伴った場合、対象レコードの絞り込みで対応できそうにないのですが、可能でしょうか。


2.M2-resist3 が ≦ 0 かつ M2-resist1 ✕ 1.1 > M2-resist2 の場合、M2-resist2 を M1-resist に代入。

3.M2-resist3 が ≦ 0 かつ M2-resist1 ✕ 1.1 ≦ M2-resist2 の場合、M2-resist1 ✕ 1.1 を M1-resist に代入。


度々申し訳ございません。
どうぞ、よろしくお願い申し上げます。

Offline

#12 2016-06-21 22:26:08

Shin
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

M1-resist に自動入力で、

Case (
 M2-resist3 > 0 ; M2-resist3 ;
 Min ( M2-resist1 ✕ 1.1 ; M2-resist2 )
)

と設定しておくか、フィールド全置換を行えば良いでしょう。
または、その式を M2 側に作っておいて、それを M1 resist へインポートする、でも良いでしょうね。

Last edited by Shin (2016-06-21 22:57:16)

Offline

#13 2016-06-22 17:02:33

Re: 2つのテーブルを操作するスクリプトを教えてください

Shin 様

「自動入力」を教えていただきありがとうございます。

インポート方法で

・対象レコードの既存のレコードを更新

こちらで、希望する正しい結果が得られました。
ありがとうございました。

・対象レコードで一致するレコードを更新

こちらでは、M1-resist に値が入りませんでした。
一つ前に教えていただいたスクリプトでは、こちらの方法にて正しく更新されていましたが、今回はこれで正しい動きなのでしょうか。

いつもありがとうございます。
どうぞ、よろしくお願い申し上げます。

Offline

#14 2016-06-22 18:51:11

Shin
Member

Re: 2つのテーブルを操作するスクリプトを教えてください

自動入力は、新規レコードの時に動きますので、上書き更新では作働しません。
やはり、M2側にその式を持たせた計算フィールドを作っておき、それをインポートするのが良いと思います。

Offline

#15 2016-06-23 16:00:16

Re: 2つのテーブルを操作するスクリプトを教えてください

Shin 様

M2側に持たせることで、先の処理と同時に効率的に処理ができるようになりました。
お忙しい中、お付き合い頂きましてありがとうございました。

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.004 seconds, 7 queries executed - Memory usage: 554.59 KiB (Peak: 575.49 KiB) ]