みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
Win 2008R2
FM13ser
Win7 FMPro13adv
お世話になっております。
可能であれば教えて頂きたいんですが
リスト形式で表示しているデータがありまして
ある行からある行までの範囲の特定のフィールドを一括で書き換える方法はありますか?
たとえば20レコードを絞り込んだ結果に対して全て置き換えをするのは可能ですが
絞り込まずに「こっからここ」というやり方はないでしょうか。
エクセルの場合、値をコピーしておき複数セルをマウスのドラッグで選択した状態で
ペーストすれば同じ値が一気に反映されます。
ファイルメーカーでも同じことはできないのかなぁと思いまして・・・
よろしくお願いします。
Offline
全置換で、レコード番号等を指定した式を作れば出来なくも無いけど、面倒ですよね。
Offline
全置換で、レコード番号等を指定した式を作れば出来なくも無いけど、面倒ですよね。
反映している値は「1」のみなんです。
上下で挟むとかは可能ですか?
たとえば3番目のレコードに「1」
15番目のレコードに「1」
3~15までのレコードの特定のフィールドに「1」という値を反映。
こんな流れでもいいんですがこれならできそうですか??
Offline
そのフィールド名を num として、
let (
[
m = ( num = 1 ) ;
$$n = Case ( Get ( レコード番号 ) = 1 ; m ; $$n xor m )
] ;
Case ( $$n or m ; 1 ; num )
)
という式で全置換すれば良いでしょう。
Last edited by Shin (2015-01-14 11:38:36)
Offline
shin様
ありがとうございます。
やってみようと思うんですが
もしよかったらざっくりでいいので解説もいただけないでしょうか・・・
よろしくお願いします。
Offline
全置換は、レコード番号1のレコードから評価されて行きます。
グローバル変数は、代入されるまでは前の値を保持しています。
レコード番号1のレコードでは,num の値が $$n へ代入され、num が1ならば1、1以外ならばその値をそのまま設定。
それ以降では、num が1のレコードになるまで、$$n は0が設定され、num をそのまま保持して行く。
num が1のレコードがあれば、$$n は1になり、num に1が設定され、以降続く
次の num が1のレコードがあれば、$$n は0になり、num には m が設定され1
その次からは、$$n は0、m は0で、num がそのままの値に保持されている
という動きですが、文字で書いても解らないですよ。
Offline
もう少し簡単な思考の方法
その考え方は
フィールドの値が1のレコードから順に値が1のレコードになるまで1に書き換える
最初のレコードへ
Loop
Exit Loop If[フィールド=1]
次のレコードへ
End Loop
Loop
フィールドへ1を入力
次のレコードへ
Exit Loop If[フィールド=1]
End Loop
対象レコードの数が大量になると全置換より早くなるかも。。
Offline
全置換は、レコード番号1のレコードから評価されて行きます。
グローバル変数は、代入されるまでは前の値を保持しています。レコード番号1のレコードでは,num の値が $$n へ代入され、num が1ならば1、1以外ならばその値をそのまま設定。
それ以降では、num が1のレコードになるまで、$$n は0が設定され、num をそのまま保持して行く。
num が1のレコードがあれば、$$n は1になり、num に1が設定され、以降続く
次の num が1のレコードがあれば、$$n は0になり、num には m が設定され1
その次からは、$$n は0、m は0で、num がそのままの値に保持されているという動きですが、文字で書いても解らないですよ。
ありがとうございます。
確かに文字では理解しづらいですね・・・
でもありがとうございます、一度チポ様の案を試してみたいと思います。
Offline
もう少し簡単な思考の方法
その考え方は
フィールドの値が1のレコードから順に値が1のレコードになるまで1に書き換える最初のレコードへ
Loop
Exit Loop If[フィールド=1]
次のレコードへ
End Loop
Loop
フィールドへ1を入力
次のレコードへ
Exit Loop If[フィールド=1]
End Loop対象レコードの数が大量になると全置換より早くなるかも。。
ありがとうございます。
このloopはイメージができました。
試してみます。
ただこれはGOではサーバー上でスクリプトを実行させた方が処理が早いかと思いますが
このままではサーバー上ではうまく動作しませんよね?
ちなみに不特定多数のクライアントが同時に同じ動きで「1」で挟むとなると尚更サーバー上ではうまく動作しませんよね?
Offline
それも考え方は簡単なのでやってみたんですが、範囲が最初の数十レコードのみなどの特殊な状況以外では、全置換の方が早くなります。
上の式での全置換は、40000レコードで2秒程度です。(MacBookPro i7 2.8G FM11 MacOSX 10.9.5)変数での処理は、オンメモリーのみのため、劇的に早いです。
Last edited by Shin (2015-01-14 16:32:57)
Offline
それって、位置決め引数が定数値(1)でしかも置換値(1)とも共通だと、使う度に前回の代入値(1)をクリアーリセットしなければならなくなりませんか?
位置決め引数はUUIDやタイムスタンプ番号など固有シリアル値にしておけば、そのクリアーリセットの手間は不用に出来ますけど。
Offline
難しい会話をされておりますが補足質問をしていいでしょうか。
LOOPのスクリプトステップを開始する前に対象レコードの中に
「1」が2つ以上なくては範囲で挟んでいることにならないので
それを検証して万が一「1」が一か所にしかない場合はダイアログでスクリプトを終了させたいのですが
どのようなステップをふめばいいのでしょうか・・・・
Offline
1を検査しておいて、対象レコード数を数える、という事をすると良いでしょうね。
1の範囲が複数の事も有るのでしょうか。
Offline
考え方を変えました。
フィールドが1のレコードの二番目を捜して
それから前のレコードに1を入力
フィールドが1なら終了
二つ無い場合はカスタムダイアログ
最初のレコードへ
Loop
If[フィールド=1]
Loop
次のレコードへ[最後まできたら終了]
If[フィールド=1]
Loop
前のレコードへ
If[フィールド=1]
スクリプト終了
End If
フィールドへ1を入力
End Loop
End If
End Loop
End If
次のレコードへ[最後まできたら終了]
End Loop
カスタムダイアログ
早さは期待できそうも無いと思いましたが、
全置換より早くなるには条件が限られそうですね。
共有の場合、
いずれの方法でも問題が有るのでは。
Offline
FM13ser
と書いてますので共有が前提ですから、全置換する前に置換するレコードをロックしないと、他で使用中だった場合にそこだけ残ってしまいますよね。
ポータル内でやるしかないのかな。
Pages: 1
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 551.96 KiB (Peak: 572.5 KiB) ]