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

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

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

You are not logged in.

Announcement

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


#1 2017-08-29 03:31:30

柿ぴー
Member

チェックボックスを使った複数条件の検索方法

よろしくお願いします。
FMP 15 Advanced、Windows10

会員テーブルから複数条件で絞り込みたいのですが、どのようにしたらよいかわかりません。

【会員テーブル】の主なフィールド
(ID)(氏名)(ランク_1)(ランク_2)(都道府県)(住所)(生年月日)(年齢)(性別)

チェクボックスで絞り込み条件を選択
(ランク_1)・・・A、B、C、D、E
(ランク_2)・・・1、2、3、4、5
(都道府県)・・・東京都、神奈川県、大阪府、愛知県、兵庫県、福岡県など
(年齢)・・・20代、30代、40代、50代
(性別)・・・男性、女性、不明

例えば、(ランク_1)はA or B or C で、(ランク_2)は1 or 2 or 3、(都道府県)は東京都 or 神奈川件、(年齢)は20代 or 30代、(性別)はすべて、
という選択をした場合、どのように検索をしていけばよいでしょうか?

検索用のテーブルを作って、チェックボックスの選択をそれぞれグローバルフィールドに保存して、それを変数に入れて順番に検索していくのかな?と想像するものの、改行で複数格納されている値をどのようにしてフィールドに設定したらよいのかわかりません。

ご指導よろしくお願い致します。

Offline

#2 2017-08-29 06:42:17

mic
Member

Re: チェックボックスを使った複数条件の検索方法

OR条件の項目が複数ある場合、全ての組み合わせを網羅するのが面倒なのでたいていは選択しなかった値を除外する方法を採っています。

環境が下記のようであったとします。
・「ランク_1」という値一覧がファイルに登録されている
・値一覧「ランク_1」は、会員テーブル::ランク_1に入力されている全種類の値を網羅している
・_val::ランク_1 というグローバルフィールドで、値一覧「ランク_1」をチェックボックスで選択させた


以下、既に検索モードに入っており、他の検索条件を設定済みとした場合のステップ

変数を設定[$除外対象; 値: ""]
IF [not IsEmpty(_val::ランク_1)]
	変数を設定[$リスト; 値: ValuListItems( Get(ファイル名) ; "ランク_1" )]
	変数を設定[$選択対象; 値: _val::ランク_1]
	変数を設定[$n1; 値: 1]
	Loop
		Exit Loop If [ValueCount($リスト) < $n1]
		変数を設定[$v1; 値: GetValue($リスト ; $n1 )]
		変数を設定[$n2; 値: 1]
		変数を設定[$選択されていない; 値: 1]
		Loop
			Exit Loop If [ValueCount($選択対象) < $n2]
			If [$v = GetValue($選択対象 ; $n2)]
				変数を設定[$選択されていない; 値: 0]
				Exit Loop If [1]
			End If
			変数を設定[$n2; 値: $n2 + 1]
		End Loop
		If [$選択されていない]
			変数を設定[$除外対象; 値: $除外対象 & $v & ¶ ]
		End If
		変数を設定[$n1; 値: $n1 + 1]
	End Loop
End If
If [not IsEmpty($除外対象)]
	変数を設定[$n; 値: 1]
	Loop
		Exit Loop If [ValueCount($除外対象) < $n]
		変数を設定[$v; 値: GetValue($除外対象 ; $n )]
		If [not IsEmpty($v)]
			新規レコード/検索条件
			レコードを対象外に
			フィールド設定[会員テーブル::ランク_1; "==" & $v]
		End If
		変数を設定[$n; 値: $n + 1]
	End Loop
End If

これを各項目分実行する感じです。
ただお察しの通り、値一覧が全網羅していない場合は選択していないどころか選択肢にない値もHITしてしまうため、あくまで完全網羅している値一覧を利用できる状況でのみ使えます。
事前準備と実際の条件設定を分けていますが、「If [$選択されていない]」のところで新規レコード、レコードを対象外に、フィールド設定をすれば一度にまとめられます。

Last edited by mic (2017-08-29 06:47:15)

Offline

#3 2017-08-29 09:26:01

チポ
Member

Re: チェックボックスを使った複数条件の検索方法

検索対象フィールドが全て値一覧になっているのなら、
検索値入力用にグローバルフィールドを作り、
さらに照合用の計算フィールドを作ります。

例えば、
検索入力用フィールドを ランク_1gとし、
照合用を ランク_1照合用 として、その計算式
  Case ( IsEmpty ( ランク_1g ) ; ValuListItems ( Get ( ファイル名 ) ; "ランク_1の値一覧名" ) ; ランク_1g )
とします。

これを必要なフィールド分全て作り、
元のフィールドとそれぞれandでリレーションします。

これでブラウズモードで、必要な条件を入力して、
  関連レコードへ移動
でご希望のレコードが対象レコードとなります。

Offline

#4 2017-08-29 11:20:58

mic
Member

Re: チェックボックスを使った複数条件の検索方法

おお、なるほど。
対象レコードを絞るのにリレーションと関連レコードへ移動を使おうとは考えたことありませんでした。
スクリプトもすっきりしそうですし、次の機会にその方法をとってみようと思います。

Offline

#5 2017-08-29 12:20:58

Hiro
Member

Re: チェックボックスを使った複数条件の検索方法

リレーションの確立にはすべてのキーにチェック値が必須(空欄キー不可)ですが、
チェックなし(空欄キー)でも、何らかの判別処理が必要だとすれば、
照合条件を計算式等で動的に生成できる方法が必要でしょう。
例えば、
   条件付きフィルターポータルとか、ExecuteSQL関数とか、フィールド内容の全置換とか、
など。

Offline

#6 2017-08-29 14:08:51

qb_dp
Member

Re: チェックボックスを使った複数条件の検索方法

検索指定用のグローバルフィールドを作って
gランク_1
gランク_2
g都道府県
g年齢
g性別

以下のようなスクリプトを実行。
2回目以降は、「対象レコードの絞り込み []」

繰り返しているスクリプトは、似たような感じなので、短くすることも可能ですが、
分かりやすさで言えば、以下のようなスクリプトでも良いでしょう。


変数を設定 [$List; 値:GLOBAL::gランク_1]
変数を設定 [$MAX; 値:ValueCount ( $List )]
変数を設定 [$n; 値:1]
検索モードに切り替え []
Loop
Exit Loop If [$n > $MAX]
新規レコード/検索条件
フィールド設定 [Ex::ランク_1; GetValue ( $List ; $n )]
変数を設定 [$n; 値:$n+1]
End Loop
エラー処理 [オン]
検索実行 []
エラー処理 [オフ]
#
変数を設定 [$List; 値:GLOBAL::gランク_2]
変数を設定 [$MAX; 値:ValueCount ( $List )]
変数を設定 [$n; 値:1]
検索モードに切り替え []
Loop
Exit Loop If [$n > $MAX]
新規レコード/検索条件
フィールド設定 [Ex::ランク_2; GetValue ( $List ; $n )]
変数を設定 [$n; 値:$n+1]
End Loop
エラー処理 [オン]
対象レコードの絞り込み []
エラー処理 [オフ]
#
変数を設定 [$List; 値:GLOBAL::g都道府県]
変数を設定 [$MAX; 値:ValueCount ( $List )]
変数を設定 [$n; 値:1]
検索モードに切り替え []
Loop
Exit Loop If [$n > $MAX]
新規レコード/検索条件
フィールド設定 [Ex::都道府県; GetValue ( $List ; $n )]
変数を設定 [$n; 値:$n+1]
End Loop
エラー処理 [オン]
対象レコードの絞り込み []
エラー処理 [オフ]
#
変数を設定 [$List; 値:GLOBAL::g年齢]
変数を設定 [$MAX; 値:ValueCount ( $List )]
変数を設定 [$n; 値:1]
検索モードに切り替え []
Loop
Exit Loop If [$n > $MAX]
新規レコード/検索条件
フィールド設定 [Ex::年齢; GetValue ( $List ; $n )]
変数を設定 [$n; 値:$n+1]
End Loop
エラー処理 [オン]
対象レコードの絞り込み []
エラー処理 [オフ]

Offline

#7 2017-08-29 15:16:46

柿ぴー
Member

Re: チェックボックスを使った複数条件の検索方法

柿ぴーです。
皆さん、ありがとうございます。
今から教えていただいた方法に挑戦します!
取り急ぎお礼まで。。。
ありがとうございますm(_ _)m

ちなみに、チェックボックスの値はすべて値一覧になっています。

Last edited by 柿ぴー (2017-08-29 15:18:03)

Offline

#8 2017-08-30 15:15:49

柿ぴー
Member

Re: チェックボックスを使った複数条件の検索方法

柿ピーです。

mic様、チポ様、Hiro様、qb_dp様、ありがとうございます!

チポ様の教えてくださった方法がとてもわかりやすく、ポータルで表示した会員レコードがチェックボックスに連動して増減するので選択結果も見やすく、感動しています。
チェックボックスで選択した複数の値でリエーションできることも驚きで、とっても勉強になりました。

mic様、Hiro様、qb_dp様の教えてくださった方法も勉強中です。
ちゃんと理解してできることを増やしていきたいと思います。

こちらで相談して本当によかったです。
ありがとうございました!

Offline

#9 2017-08-30 16:29:18

チポ
Member

Re: チェックボックスを使った複数条件の検索方法

んん!

> ポータルで表示
ポータルフィルタでもいいのかな?

ならば、
計算フィールド不要でできますヨ

  関連レコードへ移動
は、ポータルフィルタの表示通りにはならず、
リレーションの関連レコード全てとなりますね。

Offline

#10 2017-08-30 18:07:13

Hiro
Member

Re: チェックボックスを使った複数条件の検索方法

チポ wrote:

んん!
  関連レコードへ移動
は、ポータルフィルタの表示通りにはならず、
リレーションの関連レコード全てとなりますね。

「フィルターポータル」の「関連レコードへ移動」でも、
明示的にその「フィルターポータル」へ移動・選択状態にしてから、
「関連レコードへ移動」すれば、フィルターを反映できます。

これ、あまり知られていませんが、非常に便利で強力な裏技です!!

Last edited by Hiro (2017-08-30 18:35:41)

Offline

#11 2017-08-31 02:27:15

柿ぴー
Member

Re: チェックボックスを使った複数条件の検索方法

チポ様、Hiro様ありがとうございます。

ありり?
理解が追いつかなくてすみません!
ただの「ポータル」でレコードを表示しただけで、ポータル設定の中の「ポータルレコードのフィルタ」は使用していないです・・・
「関連レコードへ移動」をしなくてもチェックボックスで選択した条件のレコードがポータルで絞り込まれているので、スクリプトは使っていませんでした。
何度か試して正しい結果が得られていると思うのですが、ポータルを利用する場合はポータルフィルタも設定しなくてはいけないということでしょうか?
すみません、もう少し詳しく教えていただけますようお願い致します。m(_ _)m

Offline

#12 2017-08-31 09:12:41

チポ
Member

Re: チェックボックスを使った複数条件の検索方法

最初に検索と書かれていましたので、
対象レコードの絞込みを考えたレスを付けました。

しかし、後に
ポータルの表示と書かれたので、
ポータルフィルタを使うのなら、
先に提示した計算フィールドを使わなくてもできますよ。

と書いたのです。


Hiroさんが書かれた様に、
フィルタの掛かったポータルから関連レコード移動ができるので、
いずれにせよ、私の最初のレスの計算フィールドがなくてもできますね。

Offline

#13 2017-08-31 18:23:11

柿ぴー
Member

Re: チェックボックスを使った複数条件の検索方法

チポ様すみません。
私は基礎的な勉強ができていないようで、検索とポータルの違いも考えていませんでした。
紛らわしくてすみませんでした。
最初は対象レコードの絞り込みが目的だったのですが、チェックボタンの下にポータルを置いてみたらチェックボックスで指定したレコードだけが表示されたので舞い上がってしまいました。

教えていただいた方法に挑戦してみたのですが、計算フィールドを使わずにポータルのフィルタ機能だけでレコードを絞り込むことができませんでした。
大変恐縮ですが、もしよろしければ、ポータルのフィルタを使って絞り込む方法について教えてください。

会員テーブルの検索入力用グローバルフィールド(ランク_1g)と、自己リレーションの会員テーブル_2の(ランク_1)を「=」でリレーションをしました。
とりあえずランク_1の条件だけで試してみました。

ポータルフィルタのところで、以下の計算式を設定してみましたがチェックボックスで1つだけ選択する場合は表示されるのですが、2つ以上選択したり、選択が0だと何も表示されなくなってしまいます。

Case (
   IsEmpty ( 会員マスター::ランク_1g ) ;
   ValueListItems ( "会員マスター" ; "ランク_1" );
   会員マスター::ランク_1g = 会員マスター_2::ランク_1
)

勉強が足りず申し訳ありませんが、お時間がございましたら引き続きご指導いただけますようお願い致します。

Offline

#14 2017-08-31 23:33:17

Hiro
Member

Re: チェックボックスを使った複数条件の検索方法

結果をポータル表示するので良いなら、
全件ヒットするデカルト積[X]リレーションポータルに、
計算式で動的ポータルフィルターを掛ける方法がベストでしょう。

・空欄不可の適当な照合フィールドで、デカルト積リレーションを組む。
   「検索テーブル::空欄不可フィールド」[X]「会員テーブル::空欄不可フィールド」
・このXリレーションのポータルを検索レイアウトに設置。
・そのポータルに下記条件式のポータルフィルターを設定して完成。
(なお、式は、チェックなしの場合、「真」つまり非絞込=表示するようにしています。)
・チェックボックスgフィールドは検索テーブルに設定する。

Case(IsEmpty(ランク_1g); True; FilterValues(会員テーブル::ランク_1; ランク_1g)≠"")
   and
Case(IsEmpty(ランク_2g); True; FilterValues(会員テーブル::ランク_2; ランク_2g)≠"")
   and
Case(IsEmpty(都道府県g); True; FilterValues(会員テーブル::都道府県; 都道府県g)≠"")
   and
Case(IsEmpty(年齢g); True; FilterValues(会員テーブル::年齢; 年齢g)≠"")
   and
Case(IsEmpty(性別g); True; FilterValues(会員テーブル::性別; 性別g)≠"")

Last edited by Hiro (2017-09-01 00:26:57)

Offline

#15 2017-09-03 22:17:34

柿ぴー
Member

Re: チェックボックスを使った複数条件の検索方法

Hiro様
お礼が遅くなってすみませんでした。
ようやく教えていただいた方法でできました!
ファイルが壊れていたのか、何度確認してもポータルフィルターが効かなかったのですが、ファイルを作り直したらちゃんと表示されるようになりました。
とても詳しく教えていただいたので、お陰様でよく理解できました。
これで改めて「解決」とさせていただきます。
本当にありがとうございました!

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 567.68 KiB (Peak: 588.22 KiB) ]