話題 10  FM内部の検索/置換を実行, フィールド内容の全置換, 検索実行あれこれ

目的のレコードを検索抽出して置換する動作, 検索実行についてです。

個人的な感想ですが, この”検索/置換を実行”というstepは, ほとんど使ったことがないです。このstepは ちょうどワープロで長い文章を校正しているときにある文字を別の文字に置き換えたい, というときに一カ所ずつ, 確認しながら行うイメージの検索/置換と同じです。検索実行は頻繁に使うstepですが, いろいろバリエーションがあるのでまとめてみました。v12から使えるようになったstepも幾つかあります。


1. 検索/置換を実行

ネットでFilemakerのことを調べていたら, MS_アクセスの上級者がFilemakerを使ったときの感想が載っていました。「アクセスでは3行のVBScriptでできることがFMのScriptでは30行も書かねばならないんです。アクセスはFMの100倍強力です。」といった感じの内容でした。 例えば,

“田中商店”を”長砂商店”に置換して, さらに“AF社”を”KT社”に置換する, というような事例です。


その ホームページでは 例えば 商店名 “田中”を”長砂”に置換するのに 以下のような Scriptを組んで,

「やっぱり Filemakerは こんなに長いScriptがいるんです。」と書いてあって, さらに“AF社”を”KT社”に置換するのに 同様なLoopのScriptが組んであります。


↑これはちょっと勘違いで, (もちろん目的は達しますが...), すべてを置換, なら, そもそもLoopは必要ないです。


↑この2行で十分です。

1カ所ずつ検討しながら, 検索/置換を繰り返す場合は, ”検索/置換を開く”stepを入れると, メインメニューの”編集”の”検索/置換”が現れますが, Scriptではちょっと工夫が要ります。

”テキストを挿入”で, “内容全体を選択”のcheckをはずしておくと, そのField内の末尾にカーソルが移動します( “フィールドへ移動”stepは無効です), で, “検索/置換を実行”stepの”後方へ”を選択します。これで, Scriptがそれなりに動きます。(sample 参照)




そのFieldの検索/置換が終わると,


という, 警告が出ます。(エラーではないようです。) 次のレコード,あるいはFieldにカーソルを移動させます。

置換部分には計算式を記述することも可能ですが, その計算式は  実行開始時1回しか実行されず, その値(文字列)が すべての置換に適用されるようです。つまり, ボタンを押すごとに, そのときの(そのレコードの値をもとに)計算式で置換内容が決定します。全部のレコード, 全部のFieldを一度に置換する場合は, 同じ文字列の置換になります。(sample 参照)

“検索/置換を実行”が 以下に述べる”フィールド内容の全置換”より有利なのは, すべてのFieldに対して,一括して行うことができるということです。例えば, “渡部”さんだと入力していたのが, 実は”渡辺”さんだったので, すべてのレコードのすべてのFieldで修正したい, というときはこれが便利かもしれませんね。でも, 正しい”渡部”さんもいるかもしれないので, 安易には使えませんね。


  1. 2.フィールド内容の全置換

上記の検索/置換の例は


↑”Field内容の全置換”でも可能です。置換内容は Substitute関数で指定します。

レコードごとに異なる置換を一括して実行する場合は,  ”Field内容の全置換”を使う必要があります。

例えば, 2014.5.1以降で 1件の取引額が10000円以上の場合は, 商店を赤色で表示する。と言うような, レコードごとに判断が必要で, それを一括で行うときに使います。

複数のFieldに対して行うときは, それぞれに”全置換”stepが必要です。


その 結果は



  1. 3.検索実行のあれこれ

  2. a.stepを簡略化したいときは

“検索実行”stepを使えば 1行で可能です (これは Script登録しないで使える, ということです)。


あるいは [記憶する]条件を”検索モードに切り替え”stepに入れても動きます。そのときは2行になります。


AND検索なら, 下記のように条件を記憶させることができます。


対象外検索もできます。


OR 検索のときは, いったん, 検索条件の画面を”OK”で抜けて, “新規”ボタンで条件を追加します。



  1. b. 条件を明確にするときは


Scriptに条件を書き込むときには, テキストとして入力します。例えば,

日付なら, “2014/5/1”, 比較演算子を入れるなら " ≥ 2014/5/1", とか " ≤  2014/5/19  > 2014/5/1", など, また Fieldと同じタイプの値, 例えば Date(5;1;2014)も可能です。変数も, 計算値も使えます。

“OR検索”, とか, “対象外”指定を含んだ検索は独立した条件を記述する必要があります。

  1. i. OR検索...”田中 あるいは 山田” に合致するレコード


  1. ii. 除外検索...除外したい条件は,独立して記載してその下に”レコードを対象外に”stepを入れます。


  1. iii. 絞り込み検索....その検索結果から, さらにある条件のものを絞り込みたい場合は,


この”対象レコードの絞り込み”stepは単独でも動きます。現在対象となっているレコードからさらに絞り込む,命令です。

  1. iv.複数レコードを対象外に”....v12から実装されました。単独で動きます。

現在対象となっているレコード群から, 現在activeのレコードから数えて,下方に指定した数のレコードを対象外とします。実際には 日付などでソートすることが必要でしょう。


  1. v.一致するレコードを検索”....v12から実装されました。単独で動きます。置換, 絞り込み, 拡大の3つのoptionがあります。 現在activeのレコードの指定Fieldをもとに, 現在対象となっているレコード群を変更します。


置換...現在activeのレコードの指定Field値で検索し直す。

絞り込み...現在対象となっているレコード群から, 指定Field値と一致するレコードを絞り込む。

拡大..., 現在activeのレコードのField値と同じ値のレコードを 現在対象のレコード群に追加する。

置換, 絞り込みは従来のScript stepでも記述できますが, 拡大は, 前の対象を記憶しておくメモリFieldを作成しておく, 等の工夫をしないと同じことはできないと思います。


Sample (FMsample10-12)

“田中” → “長砂” への検索/置換 を順次実行, 一括実行, レコードごとに判断をして置換内容を変える方法, “フィールド内容の全置換”で行う方法, 検索実行あれこれ, などを提示しました。




 
Sample のdownload (.fmp12)Tech_10_files/FMsample10-12.zip