みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
FilemakerAdvanced 12
リレーションについて、助言など頂ければありがたいです。
説明が、へたくそなんですが。。
金額テーブル:すべてのお客様の商品テーブル
集計テーブル:金額テーブルの商品の合計を表示するテーブル
顧客テーブル:お客様の、それぞれ条件のポータルを表示するテーブル
条件A:ポータル表示の区分(新規・追加・物代)
条件B:受注NO(お客様個々の番号)
条件C:営業担当
条件D:GET月
以下のようにリレーションを組んで、お客様テーブルに
それぞれをポータル表示し集計も併せて表示しています。
集計テーブルBから条件Dを元に金額テーブルBを削除したいのですが
何故か、条件Dを無視してA~Cの条件でフィールドが消えてしまいます。
どうやら金額テーブルCの条件Dをつけるとうまくいくのですが、それだと少し都合が悪いです。
(ほぼ単一データなので条件Dをわざわざ入力したくない。)
新規注文(新規)は1回。追加発注(追加)は複数月。物件代金(物代)は1回
なので、追加発注のみ月ごとに削除する場合があります。
削除の問題以外はすべてうまくいっています。(集計表示など)
条件A(新規) 条件A(新規)
条件B 条件B
条件C 条件C
条件D
金額テーブルA-------集計テーブルA-------|
|
条件A(追加) 条件A(追加) |
条件B 条件B |
条件C 条件C |
条件D |
金額テーブルB-------集計テーブルB-------お客様テーブル
|
条件A(物代) 条件A(物代) |
条件B 条件B |
条件C 条件C |
金額テーブルC-------集計テーブルC-------|
以上、よろしくお願いします。
消えるのはテーブルのレコード?フィールド?どちらでしょう。
レコードをリレーションオプションで削除している場合、
レイアウトのオカレンスに関係なく関連レコードが消されるオプションがどこかにあると消えてしまいますよ。
Offline
Mozさん、ご返答ありがとうございます。
すいません、フィールドではなく金額テーブルのレコードが消えます。
解決策は金額テーブルCの条件にDを加えるしかないという事でしょうか。
条件で消えるというのがいまいちわかりづらいのですが
レコードの削除をどうやって行っているのでしょうか?
各テーブルのリレーション構造とそのオプションを書き出してみては如何でしょう。
Offline
今のところ、レコードの削除は、スクリプト等を使わず、上部のレコード削除から直接消しています。
集計テーブルは新規や追加や物代の合計レコードにしてますので
このレコードを消すと、金額テーブルの関連するレコードが消えてほしいです。
リレーション構造はどのように表現したら一番いいかわからないですが、上部にあるような感じなのですが。
一番上の条件Dを削除しても同じ状況でした。
リレーションはすべてイコール(=)です。
条件A(新規) 条件A(新規)
条件B 条件B
条件C 条件C
金額テーブルA-------集計テーブルA-------お客様テーブル
条件A(追加) 条件A(追加)
条件B 条件B
条件C 条件C
条件D
金額テーブルB-------集計テーブルB-------お客様テーブル
条件A(物代) 条件A(物代)
条件B 条件B
条件C 条件C
金額テーブルC-------集計テーブルC-------お客様テーブル
A,B,Cと付いていますがそれぞれ別のテーブル、それともオカレンスでしょうか?
オカレンスだと仮定した場合、最初に書いた内容と重複しますが、
集計テーブルAからリレーションが成立していれば、
集計テーブルCから見た場合にはリレーションが成立していなくても金額テーブルのレコードは消えます。
削除オプションを使わずに必要となるリレーションが成立しているオカレンスから関連レコードへ移動した方が賢明だと思いますよ。
Last edited by Moz (2014-10-21 16:15:46)
Offline
オカレンスになります。
関連レコードへ移動して削除する場合と、通常の削除との違いはなんでしょうか?
集計テーブルBから条件Dを元に金額テーブルBを削除したいのですが
何故か、条件Dを無視してA~Cの条件でフィールドが消えてしまいます。
これを読んだ感じリレーションオプションの削除にチェックを付けているのですよね?
何故消えてしまうのかは理解できましたか?
削除オプションでは現在のレコードと別のオカレンスに基づいてリレーションが成立しているレコードも消えます。
関連移動で対象レコードを削除する場合は、現在のオカレンスに基づいてリレーションが成立しているレコードのみ消せます。
金額テーブルA、集計テーブルA には 追加条件D(月)がありますが、
金額テーブルB、集計テーブルB で削除オプションが設定されていたら、追加条件Dに関わらず消えるということです。
※追加条件Dのあるオカレンスで削除オプションでもいいと思いますが......
個人の好みもありますが削除オプションはあまり好ましくないかなと思います。
Last edited by Moz (2014-10-21 16:46:08)
Offline
下記を読み落としていましたね。
どうやら金額テーブルCの条件Dをつけるとうまくいくのですが、それだと少し都合が悪いです。
(ほぼ単一データなので条件Dをわざわざ入力したくない。)
条件Dを使ってのリレーションができないのであれば削除オプションの線はナシです。
Offline
大分分かってきました。
リレーションオプションの削除はやめた方がいいという事ですよね?
それで、関連移動で対象レコードのみを削除する。
少し分からないのが、お客様テーブルから関連レコード(集計テーブル)に移動して削除
そこから金額テーブルに移動しようにも、削除してしまって関連レコードに移動できないんですが
変数とって検索かけるしかないですか?
関連レコードを削除する場合、子(金額テーブル)から親(集計テーブル)の順で消します。
関連レコードへ移動して子を削除してから親に戻って親を消します。
スクリプト作って削除の確認ダイアログなども作り込んだ方がよいでしょう。
Offline
上記のようにスクリプトで
関連レコードへ移動 金額テーブルB 関連レコードのみ表示
対象レコード削除
関連レコードへ移動 集計テーブルB 関連レコードのみ表示
対象レコード削除
レイアウト切替【元のレイアウト】
これで、集計テーブルに移動できません。
何か間違いがありますでしょうか?
スクリプトを実行するレイアウトのオカレンスとリレーションが成立していなければ関連レコードに移動できません。
各関連レコードへ移動のステップの際にどのオカレンスのレイアウトにいるのでしょう?
Offline
やはりうまくいきません。
関連レコードへ移動 金額テーブルB 関連レコードのみ表示(金額テーブルBのレイアウト)
対象レコード削除
関連レコードへ移動 集計テーブルB 関連レコードのみ表示(集計テーブルBのレイアウト)
対象レコード削除
レイアウト切替【元のレイアウト】
個々に移動は出来ます。
これは新規や物代のリレーションオプションも削除を切らないとダメでしょうか?
個々に移動というのはレイアウト切り替えならうまくいくという意味ですか?
関連レコードに移動できないというのは
・移動元のレイアウトのオカレンスが正しくない
・本当に関連レコードがない
ということが考えられます。
リレーションが成立している(関連レコードがある)ことは確認できますか?
これは新規や物代のリレーションオプションも削除を切らないとダメでしょうか?
リレーションというものを正しく理解して下さい。
リレーションオプションの削除チェックとリレーションが成立しないことは無関係です。
Offline
お客様テーブル(レイアウト)から①やお客様テーブル(レイアウト)から②はうまく移動でき、関連のレコードのみ表示されます。
①関連レコードへ移動 金額テーブルB 関連レコードのみ表示(金額テーブルBのレイアウト)
②関連レコードへ移動 集計テーブルB 関連レコードのみ表示(集計テーブルBのレイアウト)
ただ、金額テーブルのレコードを削除すると、①から②に移動できなくなります。
集計テーブルのレコードに関連する金額テーブルのレコードを削除したいんですよね?
集計テーブルのオカレンス基づくレイアウトでレコードを表示して、
関連レコードへ移動で金額テーブルの関連レコードに移動することもできていないのですか?
削除したあとに戻る際には関連レコードへ移動は使いません。
※関連するレコード消してしまっているので移動できませんね。
Offline
関連レコードへ移動 集計テーブルB 関連レコードのみ表示
関連レコードへ移動 金額テーブルB 関連レコードのみ表示
対象レコード削除
レイアウト切替【集計テーブルB】
対象レコード削除
レイアウト切替【元のレイアウト】
でうまくいきました。
ただ、、集計テーブルの対象レコードを削除すると、条件A、B、Cで、Dを無視した金額テーブル
のレコードが消えてしまいました。
オカレンスは合っていると思うのですが。
すいません、長くなってしまいまして。
ちなみに
お客様テーブルー集計テーブルー金額テーブル
このリレーションはすべて削除はチェックはしていません。
すいません。
お客様テーブルー集計テーブルBー金額テーブルB
このリレーションのみ削除はチェックしていません。
集計テーブルでは現在のレコードのみ削除できればいいので対象レコードを削除してはいけません。
対象レコードでは表示中の集計テーブルのレコードが全て消えてしまいます。
スクリプトは1個1個のステップが何をするためのものなのか考えて作るとよいと思います。
もし、Advanced ならば必ずデバッガを使って、
Advanced ではないのなら1ステップ毎に[スクリプトの一時停止]で状況を確認しながら落ち着いて作ると失敗も減ると思いますよ。
Offline
関連レコードへ移動
対象レコード削除
何もエラー処理挟んでいないと、関連レコードが0の場合、レイアウト切り替えが起こらないので、元テーブルの対象レコードが全部削除されちゃいますよ。
必ず関連先レコード数確認して、レコードがあればって、条件分岐してやらないと。
エラー処理には何を使いましょうね?
Offline
関連先レコード数確認するために Count 関数でレコード数確認して条件分岐
If [Count ( 金額::リレーションキー ) ≥ 1 ]
関連レコードへ移動 [関連レコードのみを表示; テーブル: 「金額」; 使用するレイアウト: 「金額テーブルのレイアウト」]
対象レコード削除 [ダイアログなし]
End If
関連レコードへ移動のエラーキャプチャするよりこっちの方がわかりやすいかな。
とおりすがりさん、助言ありがとうございます。
すでに全部消えてしまいまして、大変でした。。すぐに下のスクリプトをいれました。
問題ありませんか?
If[GET(最終エラー)]="101"
現在のスクリプト終了[]
End If
Mozさん、引き続きありがとうございます。
Advancedですので、一つ一つ見ていってます。
集計テーブルBレコードを、削除するとD条件無視で金額テーブルBレコードが消えてしまう物を格闘しています。
上で言われています、対象レコード削除ではなく、スクリプトのレコード/検索条件削除や、
レコードメニューのレコード削除を使っても同じでした。
理解力不足で、、3つのリレーションオプションの削除切るしかなさそうですね。
[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 577.59 KiB (Peak: 614.13 KiB) ]