みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
ページ: 1
よろしくお願いします。
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代、(性別)はすべて、
という選択をした場合、どのように検索をしていけばよいでしょうか?
検索用のテーブルを作って、チェックボックスの選択をそれぞれグローバルフィールドに保存して、それを変数に入れて順番に検索していくのかな?と想像するものの、改行で複数格納されている値をどのようにしてフィールドに設定したらよいのかわかりません。
ご指導よろしくお願い致します。
オフライン
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 [$選択されていない]」のところで新規レコード、レコードを対象外に、フィールド設定をすれば一度にまとめられます。
編集者 mic (2017-08-29 06:47:15)
オフライン
検索対象フィールドが全て値一覧になっているのなら、
検索値入力用にグローバルフィールドを作り、
さらに照合用の計算フィールドを作ります。
例えば、
検索入力用フィールドを ランク_1gとし、
照合用を ランク_1照合用 として、その計算式
Case ( IsEmpty ( ランク_1g ) ; ValuListItems ( Get ( ファイル名 ) ; "ランク_1の値一覧名" ) ; ランク_1g )
とします。
これを必要なフィールド分全て作り、
元のフィールドとそれぞれandでリレーションします。
これでブラウズモードで、必要な条件を入力して、
関連レコードへ移動
でご希望のレコードが対象レコードとなります。
オフライン
検索指定用のグローバルフィールドを作って
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
エラー処理 [オン]
対象レコードの絞り込み []
エラー処理 [オフ]
オフライン
柿ピーです。
mic様、チポ様、Hiro様、qb_dp様、ありがとうございます!
チポ様の教えてくださった方法がとてもわかりやすく、ポータルで表示した会員レコードがチェックボックスに連動して増減するので選択結果も見やすく、感動しています。
チェックボックスで選択した複数の値でリエーションできることも驚きで、とっても勉強になりました。
mic様、Hiro様、qb_dp様の教えてくださった方法も勉強中です。
ちゃんと理解してできることを増やしていきたいと思います。
こちらで相談して本当によかったです。
ありがとうございました!
オフライン
チポ様、Hiro様ありがとうございます。
ありり?
理解が追いつかなくてすみません!
ただの「ポータル」でレコードを表示しただけで、ポータル設定の中の「ポータルレコードのフィルタ」は使用していないです・・・
「関連レコードへ移動」をしなくてもチェックボックスで選択した条件のレコードがポータルで絞り込まれているので、スクリプトは使っていませんでした。
何度か試して正しい結果が得られていると思うのですが、ポータルを利用する場合はポータルフィルタも設定しなくてはいけないということでしょうか?
すみません、もう少し詳しく教えていただけますようお願い致します。m(_ _)m
オフライン
チポ様すみません。
私は基礎的な勉強ができていないようで、検索とポータルの違いも考えていませんでした。
紛らわしくてすみませんでした。
最初は対象レコードの絞り込みが目的だったのですが、チェックボタンの下にポータルを置いてみたらチェックボックスで指定したレコードだけが表示されたので舞い上がってしまいました。
教えていただいた方法に挑戦してみたのですが、計算フィールドを使わずにポータルのフィルタ機能だけでレコードを絞り込むことができませんでした。
大変恐縮ですが、もしよろしければ、ポータルのフィルタを使って絞り込む方法について教えてください。
会員テーブルの検索入力用グローバルフィールド(ランク_1g)と、自己リレーションの会員テーブル_2の(ランク_1)を「=」でリレーションをしました。
とりあえずランク_1の条件だけで試してみました。
ポータルフィルタのところで、以下の計算式を設定してみましたがチェックボックスで1つだけ選択する場合は表示されるのですが、2つ以上選択したり、選択が0だと何も表示されなくなってしまいます。
Case (
IsEmpty ( 会員マスター::ランク_1g ) ;
ValueListItems ( "会員マスター" ; "ランク_1" );
会員マスター::ランク_1g = 会員マスター_2::ランク_1
)
勉強が足りず申し訳ありませんが、お時間がございましたら引き続きご指導いただけますようお願い致します。
オフライン
結果をポータル表示するので良いなら、
全件ヒットするデカルト積[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)≠"")
編集者 Hiro (2017-09-01 00:26:57)
オフライン
ページ: 1