みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
超初心者で申し訳ございません。
環境は 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
レイアウトを行ったりきたりするより、
M1のレイアウトにM2のポータルを置いて、
そのポータル行の削除の判定をした方が速いでしょうね。
Offline
2個のテーブルは、1:1になっているのでは。
ならば、code でリレーションを張っておきます。M2 を OK で抽出しておき、M1 から照合インポートを行い、関連レコードへ移動で M1 へ戻り、レコード削除、だけでいいかも。
ただ、テーブル間でレコードを移動して元を削除、という運用は、ファイルの構成が荒れていくので、私は好ましく無いと思っています。
Offline
ああ、
M1のレコード削除をM2と間違えていました。
ポータル行削除
ではなく、
M1のレコード削除ですね。
Shinさんの方法、
いいですがフィールドコピーの方向をお間違えです。
M2を「OK」で検索
M2からM1へ関連レコード移動(対象レコード)
M1で対象外のレコードを削除
M1で照合インポート
M1が全レコードを表示から始めるのが条件です。
Offline
対処のテーブルを勘違いしていました。
M2で検索後、M1を全レコードを対象にして、M2を照合インポート、対象外のみを表示し削除、で良いでしょうね。
Last edited by Shin (2016-06-16 17:47:02)
Offline
お世話になります。
スクリプトを書いてみました。
他の開発言語では 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
度々、申し訳ございません。
書いたスクリプトを文字としてコピーする方法はないのでしょううか。
全選択しても行で選択肢ても、コピーできませんでした。
よろしくお願い申し上げます。
Offline
スクリプトの流れとしては良いのですが、コピペを使うより、フィールド設定を使った方が確実です。
また、レコードを削除した後に次のレコードへ移動すると、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
Shin 様
洗練されたスクリプトを教えていただき、ありがとうございます。
テストをしていて気がついた事象について質問させてください。
日本語以外のフィールドの場合に「"OK"」で対象レコードを絞り込むと、どうも OK1 や OK123 なども対象になってしまうようですが、これをただ OK だけのフィールドのみを対象とすることはできるのでしょうか。
http://www.filemaker.com/help/12/fmp/jp … t.5.6.html
M1 の削除対象レコードを削除すると同時に、対応する M2 のレコードも削除されてしまうようなのですが、 M2 のレコードを残すことはできないでしょうか。
どうぞ、よろしくお願い申し上げます。
Offline
検索条件で、 =="OK" にしておくと、その他の物は除外されます。
M2 のレコードは、削除されていないはずです。対象外になっていて、見えていないだけでは。削除されてしまっているのでしたら、リレーションの設定を確認してみてください。
Offline
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
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
Shin 様
「自動入力」を教えていただきありがとうございます。
インポート方法で
・対象レコードの既存のレコードを更新
こちらで、希望する正しい結果が得られました。
ありがとうございました。
・対象レコードで一致するレコードを更新
こちらでは、M1-resist に値が入りませんでした。
一つ前に教えていただいたスクリプトでは、こちらの方法にて正しく更新されていましたが、今回はこれで正しい動きなのでしょうか。
いつもありがとうございます。
どうぞ、よろしくお願い申し上げます。
Offline
自動入力は、新規レコードの時に動きますので、上書き更新では作働しません。
やはり、M2側にその式を持たせた計算フィールドを作っておき、それをインポートするのが良いと思います。
Offline
Shin 様
M2側に持たせることで、先の処理と同時に効率的に処理ができるようになりました。
お忙しい中、お付き合い頂きましてありがとうございました。
Offline
Pages: 1
[ Generated in 0.012 seconds, 9 queries executed - Memory usage: 553.59 KiB (Peak: 574.5 KiB) ]