みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
こんにちは。
FMP11で下記のような事は可能でしょうか。
【構成】
■テーブルA
・テキストフィールド「NGワード」
■テーブルB
・テキストフィールド「MEMO」
・計算式フィールド「NGフラグ」
【実装したい機能】
MEMOフィールドの中に、「NGワード」に登録されている単語が含まれていたら「NGフラグ」を"1"にする。
NGワードをレコード管理する方法ではなく、1つずつPatternCount関数でMEMOに含まれているかどうかチェックしていたのですが、
NGワードの追加がかなり多くて手間になってきたので、別テーブルでレコード管理出来ないか
ご相談させて頂いた次第です。
環境はWinXP、FMP11です。
よろしくお願いします。
質問者です。
ちょっと他の方法を試してみましたので、そちらの方法でも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が複雑になりよく分からなくなってしまいましたので
どなたかご教授頂けはしないでしょうか。
お忙しいところすみませんが、よろしくお願いします。
テーブル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
keima様
解法をご提示頂きまして、ありがとうございます。
ですが、このまま実行しても砂時計表示が終わらず、上手く行きませんでした。
ちなみに、テーブルAとテーブルBはリレーションさせていないのですが、
こちらの設定含め、実行に必要な条件などはございますでしょうか。
また、私の不勉強のため何をしているかさっぱり分からないため、すみませんが
出来ましたらスクリプトの解説をお願い出来ますと大変有り難いです。
お願いばかりで恐縮ですが、よろしくお願いします。
テーブルAとテーブルBはリレーションさせていないのですが
List 関数を使っているので、× 印 のリレーションが必要です。
NGワードリストは、含まれるNGワードを横並びで表示します。
NGフラグの計算式は not IsEmpty ( NGワードリスト)
サンプルはV12なのであしからず。
NGワードの換りにくだもの名にしたサンプル NGワード.fmp12
Offline
ここにも同じ質問が。スレッドが長いよ。
http://www.russ.jp/stepbbs/step.cgi?mode=view&no=80357
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
こんなんでどうですか。
計算結果は、見つかった位置(なければ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)
)
Shinさんのは Patterncount をつかった計算式ながら、
第二引数を繰り返しにすることでループの働きとは恐れ入りました。
使い勝手がいいのは、以前のスレッドのHiroさんとシャチさんの
Substitute でテキスト内のNGワードを赤字にするのが使いやすい
かなと思います。
Offline
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ワードの位置(なければ空欄)になります。
Pages: 1
[ Generated in 0.027 seconds, 9 queries executed - Memory usage: 535.41 KiB (Peak: 556.31 KiB) ]