みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FM初心者です。いつもお世話になっています。
今回も初歩的な質問かもしれないのですがよろしくお願いします。
ポータルレコードのフィルタについて
条件が3つあり、1つ目と2つ目を満たして かつ 3つ目はいずれかを満たす、という文にしたいです。
TableA::day= TableB::day
and
TableA::room = 101
and
TableA::ok = "決定" or TableA::ok = "keep"
と入力しています。
3つ目の ok というフィールドには、「決定」「keep1」「keep2」「キャンセル」・・・などというレコードがあり
「決定」「keep1」「keep2」(keepの数字は3以降もあります)だけを表示させたいのですが
「“keep”を含む」という条件がうまくいきません。
決定のものだけが表示されます。keep1 まで指定してやると、決定とkeep1のレコードが表示されました。
ヘルプページを参考に
TableA::ok = keep や、TableA::ok =keep* を試したのですが、「指定されたテーブルが見つかりません」のエラーが出ます。
どこがおかしいかご教授いただけますでしょうか。
また、検索のルールやand,orの使い方 のわかりやすいヘルプや過去質問がありましたら教えていただきたいです。
よろしくお願いします。
補足です。
参考にしたヘルプはこちらです
文字列を含むを評価するには PatternCount 関数を利用します。
PatternCount
https://fmhelp.filemaker.com/help/18/fm … count.html
TableA::ok = keep や、TableA::ok =keep*
ヘルプのどこにもこのような記述はないと思いますが、文字列は必ず "" で囲みます。
上記式では keep は文字列ではなくフィールド名として扱われるためエラーです。
また計算式ではワイルドカード演算子の * は利用できません。
条件式の繋げ方ですが、AとBを満たし、CまたはDを満たすという場合、
A and B and ( C or D ) と表現すると分かりやすいでしょう。
Offline
> 「“keep”を含む」
はMozさんの通りですが、、
and は orより計算評価順が上ですから
TableA::day= TableB::day
and
TableA::room = 101
and
( TableA::ok = "決定" or 「“keep”を含む」 )
目的からすれば、こうするのが必須ですね。
FM15 演算子の評価順のヘルプのリンクです
https://fmhelp.filemaker.com/help/15/fm … as.html%23
Offline
TableA::day= TableB::day
and
TableA::room = 101
and
( TableA::ok = "決定" or 「“keep”を含む」 )
A(TableA::day= TableB::day) and B(TableA::room = 101) and ( C(TableA::ok = "決定") or D(「“keep”を含む」) )
同じじゃないです?
Offline
全く同じですね。。
> A and B and ( C or D ) と表現すると分かりやすいでしょう
こう書かれたので、
分かりやすいではダメで、必須ですよ。
と書いたつもりですが。。
Offline
Mozさん チポさん
お二方、ご回答ありがとうございます。
ANDとORの使い方について、わかりやすく書いていただき理解できました。
「keep」を含む文字列、の書き方についてが解決しないのでもう一度質問させてください。
TableA::ok = "決定" or "keep"
と記述すると、「テーブルAのokフィールドがkeep1」のレコードは表示されません。
(keep2、keep3・・などkeepと入るものは全て表示させたいです)
Mozさんの教えてくださったPatternCountはこの場合どのように使用すればいいのでしょうか?
ヘルプを見ると数字が返るとのことですが、カウントではなく「okフィールドにkeepを含むレコードをポータルに全て表示」させたいです。
よろしくお願いします。
TableA::ok = "決定" or "keep"
論理演算子の AND や OR の計算式は計算式単位での評価を行います。
それぞれの計算式を計算式として成立させます。
元の式では OR 以降の計算式が不成立です。
TableA::ok = "決定" or TableA::ok = "keep"
"決定" または "keep" の場合と表現したいならば上記となります。
PatternCount ( TableA::ok ; "keep" )
いくつ含むかを返しますから論理式で利用すれば0または1以上(=1)となります。
まずは手を動かして試すことを心がけましょう。
Offline
Mozさん
ご回答ありがとうございます。
しかし私の勉強不足で理解できず
「文字の一部の検索(「keep」を含む文字列」を全て表示)がやはり上手くいきませんでした。
TableA::ok = "決定" or TableA::ok = "keep"
と記述してみたのですが keep1 は表示されません。
(これは okフィールドが 決定 または Keep に完全一致する、という意味になるんですよね・・?)
自分でも色々試しているのですが上手くいかず困っています。
よろしければまた教えていただけると幸いです。
#8 の後半部分をお読みになっていないのでしょうか......
PatternCount ( TableA::ok ; "keep" )
「TableA::OK」フィールドが keep を含んでいればこの式が成立します。
Last edited by Moz (2019-07-23 11:39:12)
Offline
Mozさんの言われる通りにすれば解決なんですが。。
ポータルフィルタの条件式ですから、
その式の結果が
真(0以外)
か
偽(0)
を返せばいいんです。
> PatternCount ( TableA::ok ; "keep" )
これは、
okフィールドに「keep」が含まれていなければ0を
含まれていれば1以上(0以外)を返しますね。
Offline
結局、具体式は、
TableA::day = TableB::day
and
TableA::room = 101
and
( TableA::ok = "決定" or PatternCount ( TableA::ok ; "keep" ) )
Offline
Mozさん、何度もありがとうございます!
チポさん、Hiroさん、補足いただきおかげさまで理解・解決ができました。
ポータルフィルタの仕組み(真(0以外) か 偽(0)によってフィルタする)を理解していませんでした。
またPatternCount を試した際、入力を間違っていたのかエラーが出てしまってこの方法じゃないのかと勘違いしていました。
大変失礼いたしました。
本当にありがとうございました。
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 546.5 KiB (Peak: 567.41 KiB) ]