みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FMPAd13です。
薬名マスタテーブルに「薬名」・「薬名ふりがな」フィールドを作成してます。
「薬名」で自己リレーションしています。※リレーションは「薬名マスタ」「薬名マスタ2」となっています。
レイアウト(薬名マスタ2を表示)にポータルを配置してあ行の薬、か行の薬などを表示したいのですが、ポータルフィルタの計算式が分からず困っています。
「あ行」「か行」など各々でポータルを表示するにはどのように設定すればよいでしょうか?
Offline
ふりがなの最初の1文字をLeft関数で取り出して使う。
Offline
ポータルのリレーションは全レコードがヒットする[X]演算子リレーションとし、
行名を指定するフィールドを「薬名マスタ::行名指定フィールド」としたときの
フィルター式は、(計算結果は論理値(1,0)が返る)
Let(
[
#arg="あかさたなはまやらわん";
#key=薬名マスタ::行名指定フィールド;
#key0=Left(薬名マスタ2::薬名ふりがな; 1);
#key1=
Case(
#key="ん"; Char(12439);
Left(GetValue(Substitute(#arg; [#key;¶]); 2); 1)
)
];
#key0>=#key and #key0<#key1
)
この式の特徴は、同属の濁音、破裂音、小文字なども含め、行の判定ができることです。
Offline
ふりがなの最初の1文字をLeft関数で取り出して使う。
例えば、「あ~お」のレコードを拾う際にはLet(薬名マスタ2::薬名ふりがな;1)=<"あ" and Let(薬名マスタ2::薬名ふりがな;1)>"か"
でいいのでしょうか?
ポータルのリレーションは全レコードがヒットする[X]演算子リレーションとし、
行名を指定するフィールドを「薬名マスタ::行名指定フィールド」としたときの
フィルター式は、(計算結果は論理値(1,0)が返る)Let(
[
#arg="あかさたなはまやらわん";
#key=薬名マスタ::行名指定フィールド;
#key0=Left(薬名マスタ2::薬名ふりがな; 1);
#key1=
Case(
#key="ん"; Char(12439);
Left(GetValue(Substitute(#arg; [#key;¶]); 2); 1)
)
];
#key0>=#key and #key0<#key1
)この式の特徴は、同属の濁音、破裂音、小文字なども含め、行の判定ができることです。
この方法では「行名指定フィールド」フィールドにあらかじめ各ふりがなの頭文字に対応した文字を入力するという認識でよろしいでしょうか?
Offline
この#3の方法では「行名指定フィールド」フィールドにあらかじめ各ふりがなの頭文字に対応した文字を入力するという認識でよろしいでしょうか?
そうと言うか、「行名」を指定するです。
フィルターする行名(「あ」行とか)の指定は必須です、よね。
なお、「行名指定フィールド」はグローバル・フィールドです。
たとえば、「は」行を入力指定した場合、「薬品名ふりがな」の頭文字が、は行の同属文字「はばぱひびぴふぶぷへべぺほぼぽ」の何れかと一致する関連レコードだけをポータル表示します。
何はともあれ、とりあえずテストされるのが早いと思います。
Last edited by Hiro (2015-01-22 16:58:10)
Offline
Samu wrote:この#3の方法では「行名指定フィールド」フィールドにあらかじめ各ふりがなの頭文字に対応した文字を入力するという認識でよろしいでしょうか?
そうと言うか、「行名」を指定するです。
フィルターする行名(「あ」行とか)の指定は必須です、よね。
なお、「行名指定フィールド」はグローバル・フィールドです。たとえば、「は」行を入力指定した場合、「薬品名ふりがな」の頭文字が、は行の同属文字「はばぱひびぴふぶぷへべぺほぼぽ」の何れかと一致する関連レコードだけをポータル表示します。
何はともあれ、とりあえずテストされるのが早いと思います。
教えていただいたとおり、行を指定するグローバルフィールドを作成し(「行指定」フィールド)、リレーションをX演算子に変え、数式も入力いたしました。
※当方のふりがながカタカナでの入力でしたので数式をこの様に変えました。
Let(
[
#arg="アカサタナハマヤラワン";
#key=薬名マスタ::行指定;
#key0=Left(薬名マスタ 2::薬名ふりがな; 1);
#key1=
Case(
#key="ン"; Char(12439);
Left(GetValue(Substitute(#arg; [#key;¶]); 2); 1)
)
];
#key0>=#key and #key0<#key1
)
いざ行指定フィールドに「ア」と入力してみると全てのレコードが表示されました。
試しに「カ」と入れると、ポータルには何も表示されませんでした。
どこかが変でしょうか?
Offline
それでいいはずですが。。
もう一つの方法
行指定のフィールドと、もう一つ計算フィールド
行指定 & "愛" (漢字なら何でも可です)
フィルタ、またはリレーションの照合を
行指定<= ふりがな
and
計算フィールド >=ふりがな
でいいでしょう。
これは、
行指定に複数のふりがなを入力していくとそれで絞り込めます。
Last edited by チポ (2015-01-22 18:05:11)
Offline
カタカナなら、多少手直しして、
Let(
[
#arg="アカサタナハマヤラワン";
#key=薬名マスタ::行名指定;
#key0=Left(薬名マスタ 2::薬名ふりがな; 1);
#key0=Case(#key0="ヴ";"ア";#key0);
#key1=
Case(
#key="ン"; Char(12543);
Left(GetValue(Substitute(#arg;[#key;¶]);2);1)
)
];
#key0>=#key and #key0<#key1
)
Offline
>>チポさん
ありがとうございます。もう少し今のままいじってみようと思います。
>>Hiroさん
数式の手直しありがとうございます。
手直しいただいた数式をそのまま使用しましたが、やはり結果は変わらずでした。。。
再度、こちらの設定が間違ってる可能性が大いにあるので再度確認なのですが、
1、レイアウトに表示するテーブルは薬名マスタ2
2、グローバルフィールドで「行指定」フィールドを作成
3、リレーションは薬名マスタと薬名マスタ2をX演算子リレーションでリレーションする
※わたしの設定では「行指定」フィールド同士でリレーションしてます。
4、この状態でポータルを作成し、「ポータルレコードのフィルタリング」に教えていただいた数式を書き込む。
5、レイアウトの作成を終了し、グローバルフィールドに表示させたい行を入力→「あ行」ならば「ア」
これでいいと思うのですが、如何でしょう?
Offline
あぁ、フィルター変更の反映・更新には「ウインドウの再表示」が必要でしたネ。
「行名指定」フィールドのonModifyトリガで強制更新を掛けてください。
それ以外に、実装すると良いかなと思う点を加えたサンプルをアップしときます。
●サンプル「行名指定フィルタポータル.fmp12」 → http://yahoo.jp/box/iRudGD
Offline
>>Hiroさん
ありがとうございます。サンプルを確認して無事実装できました!
グローバルへの実装サンプルまでご提示頂いて大変感謝です。
>>チポさん
今回はHiroさんの案でさせていただきました。
参考までにチポさんの方法でも実装できました。
今後薬名が増えてきたときの絞り込みなどで実装できればと参考にさせていただきます。
ありがとうございます。
Offline
Pages: 1
[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 546.12 KiB (Peak: 567.02 KiB) ]