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

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

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

You are not logged in.

Announcement

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


#1 2013-10-21 13:03:36

よしひろ
Guest

NGワードDBのテーブル管理

こんにちは。

FMP11で下記のような事は可能でしょうか。


【構成】

■テーブルA
・テキストフィールド「NGワード」

■テーブルB
・テキストフィールド「MEMO」
・計算式フィールド「NGフラグ」

【実装したい機能】
MEMOフィールドの中に、「NGワード」に登録されている単語が含まれていたら「NGフラグ」を"1"にする。



NGワードをレコード管理する方法ではなく、1つずつPatternCount関数でMEMOに含まれているかどうかチェックしていたのですが、
NGワードの追加がかなり多くて手間になってきたので、別テーブルでレコード管理出来ないか
ご相談させて頂いた次第です。


環境はWinXP、FMP11です。

よろしくお願いします。

#2 2013-10-21 14:16:45

よしひろ
Guest

Re: NGワードDBのテーブル管理

質問者です。

ちょっと他の方法を試してみましたので、そちらの方法でも1つ質問させて下さい。


【構成】

■テーブルA
・テキストフィールド「NGワード」

■テーブルB
・テキストフィールド「MEMO」
・テキストフィールド「NGフラグ」


フラグフィールドをテキスト形式にして、スクリプトでフラグをつけるようにしました。

スクリプト「NGチェック」

ウインドウの固定
エラー処理ON
テーブルAへ移動
最初のレコードへ移動
変数を設定[$$NG ;値 NGワード]↓
テーブルBに移動

最初の行へ移動
loop
PatternCount ( テーブル::MEMO ; $$NG )>0
フィールド設定[NGフラグ ; 1]
次の行へ移動(最後まで来たら終了)
else
次の行へ移動(最後まで来たら終了)
loop end


これでとりあえずキーワード1つ目のチェックは成功したのですが、
複数のNGワードを全てチェックする仕様にはなっていません。

これを、フラグがたったらテーブルBの次レコードに移動(そのあとは1つ目のNGワードチェックを繰り返す)。
フラグが立たなかったら次のNGワードを変数に格納してテーブルBの同行に戻りフラグをチェック。全てのNGワードを試したらテーブルBの次行へ移動、
というようにしたいのですがloopが複雑になりよく分からなくなってしまいましたので
どなたかご教授頂けはしないでしょうか。

お忙しいところすみませんが、よろしくお願いします。

#3 2013-10-21 16:10:36

keima
Member

Re: NGワードDBのテーブル管理

テーブルBにフィールド 「NGワードリスト」を追加。

変数を設定 [ $$NGワ_LIST; 値:List ( テーブルA::NGワード ) ] 
変数を設定 [ $$V_C; 値:ValueCount ( $$NGワ_LIST ) ] 
フィールドへ移動 [ テーブルB::MEMO ] 
レコード/検索条件/ページへ移動 [ 最初の ] 
Loop 
変数を設定 [ $NG_F_L; 値:"" ] 
変数を設定 [ $i; 値:1 ] 
Loop 
If [ Let( $ngw=GetValue ( $$NGワ_LIST ; $i ); PatternCount ( テーブルB::MEMO ; $ngw ) ) ] 
変数を設定 [ $NG_F_L; 値:$NG_F_L & If (IsEmpty($NG_F_L) ; "" ; ¶ ) & $ngw ] 
End If 
変数を設定 [ $i; 値:$i + 1 ] 
Exit Loop If [ $$V_C < $i ] 
フィールド設定 [ テーブルB::NGワードリスト; Substitute ( $NG_F_L ; ¶ ; " " ) ] 
End Loop 
レコード/検索条件/ページへ移動 [ 次の; 最後まできたら終了 ] 
End Loop 

Offline

#4 2013-10-21 17:59:41

よしひろ
Guest

Re: NGワードDBのテーブル管理

keima様

解法をご提示頂きまして、ありがとうございます。

ですが、このまま実行しても砂時計表示が終わらず、上手く行きませんでした。

ちなみに、テーブルAとテーブルBはリレーションさせていないのですが、
こちらの設定含め、実行に必要な条件などはございますでしょうか。

また、私の不勉強のため何をしているかさっぱり分からないため、すみませんが
出来ましたらスクリプトの解説をお願い出来ますと大変有り難いです。

お願いばかりで恐縮ですが、よろしくお願いします。

#5 2013-10-21 18:40:29

keima
Member

Re: NGワードDBのテーブル管理

テーブルAとテーブルBはリレーションさせていないのですが

List 関数を使っているので、× 印 のリレーションが必要です。
NGワードリストは、含まれるNGワードを横並びで表示します。
NGフラグの計算式は not IsEmpty ( NGワードリスト)

サンプルはV12なのであしからず。
  NGワードの換りにくだもの名にしたサンプル    NGワード.fmp12

Offline

#6 2013-10-21 19:11:44

エステ
Guest

Re: NGワードDBのテーブル管理

ここにも同じ質問が。スレッドが長いよ。
http://www.russ.jp/stepbbs/step.cgi?mode=view&no=80357

#7 2013-10-21 20:07:16

Shin
Member

Re: NGワードDBのテーブル管理

2テーブルで管理するならば、NGワードを、繰り返しフィールドに設定していき、別の繰り返し計算フィールドで PatterCount() を行い、その合計を取る、という方法が簡単かも。
繰り返しグローバルフィールドを使ってNGワードを管理するなら、1テーブルで管理できるでしょう。

https://www.dropbox.com/s/qb5gms5a6eyw4 … 7.zip?dl=0

Last edited by Shin (2022-11-15 16:21:15)

Offline

#8 2013-10-23 13:16:55

himaganee
Guest

Re: NGワードDBのテーブル管理

こんなんでどうですか。
計算結果は、見つかった位置(なければ0)
(リストの順に調べて見つかったらやめるので、複数あるばあいにテキスト中の先頭とは限らない)
//の次の行は実験用に時間計測してるので、使用時は外してください。

Let([
//
$start=Get(UTCmSecs);

$l=List(A::NGワード);
$t=B::MEMO;

$n=ValueCount($l);
$cond="$hit=0 and $i<$n";
$do="Let($hit=Position($t;Let($i=$i+1;GetValue($l;$i));1;1);$hit)";
$i=0;
$hit=0;

$f1="If(Evaluate($cond);Evaluate($do)+";
$s="";
$g1=Substitute(10^400-1;9;"$f1&");
$g=Evaluate($g1&"$s")&"0"&Substitute(10^400-1;9;")");
$g2=Substitute($g;"$do";"$g")
];
Evaluate($g2)
//
& ¶ & (Get(UTCmSecs)-$start)
)

#9 2013-10-24 20:58:01

keima
Member

Re: NGワードDBのテーブル管理

Shinさんのは Patterncount をつかった計算式ながら、
第二引数を繰り返しにすることでループの働きとは恐れ入りました。
使い勝手がいいのは、以前のスレッドのHiroさんとシャチさんの
Substitute でテキスト内のNGワードを赤字にするのが使いやすい
かなと思います。

Offline

#10 2013-10-25 10:24:44

Listist
Guest

Re: NGワードDBのテーブル管理

よしひろ wrote:

NGワードの追加がかなり多くて手間になってきたので、別テーブルでレコード管理出来ないか

ということなので、繰り返しでやるのはそれなりに手間がかかりそうです。

A X Bのリレーションで、テーブルAに
pos(計算 非保存)Let ( p = Position ( $$text ; word ; 1 ; 1 ) ; Case ( p ; p ))
を追加して、テーブルBのNGフラグは数字で全置換で入れる
Let ( $$text=MEMO ; Min ( A::pos ))
先頭のNGワードの位置(なければ空欄)になります。

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 526.25 KiB (Peak: 547.16 KiB) ]