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

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

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

You are not logged in.

Announcement

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


#1 2015-01-13 18:05:34

見習い
Member

エクセルのような動き

Win 2008R2
FM13ser
Win7  FMPro13adv

お世話になっております。
可能であれば教えて頂きたいんですが
リスト形式で表示しているデータがありまして

ある行からある行までの範囲の特定のフィールドを一括で書き換える方法はありますか?

たとえば20レコードを絞り込んだ結果に対して全て置き換えをするのは可能ですが
絞り込まずに「こっからここ」というやり方はないでしょうか。

エクセルの場合、値をコピーしておき複数セルをマウスのドラッグで選択した状態で
ペーストすれば同じ値が一気に反映されます。

ファイルメーカーでも同じことはできないのかなぁと思いまして・・・

よろしくお願いします。

Offline

#2 2015-01-13 18:26:38

Shin
Member

Re: エクセルのような動き

全置換で、レコード番号等を指定した式を作れば出来なくも無いけど、面倒ですよね。

Offline

#3 2015-01-13 18:56:28

見習い
Member

Re: エクセルのような動き

Shin wrote:

全置換で、レコード番号等を指定した式を作れば出来なくも無いけど、面倒ですよね。

反映している値は「1」のみなんです。

上下で挟むとかは可能ですか?

たとえば3番目のレコードに「1」
15番目のレコードに「1」

3~15までのレコードの特定のフィールドに「1」という値を反映。


こんな流れでもいいんですがこれならできそうですか??

Offline

#4 2015-01-13 23:14:27

Shin
Member

Re: エクセルのような動き

そのフィールド名を 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

#5 2015-01-14 11:29:05

見習い
Member

Re: エクセルのような動き

shin様

ありがとうございます。

やってみようと思うんですが
もしよかったらざっくりでいいので解説もいただけないでしょうか・・・

よろしくお願いします。

Offline

#6 2015-01-14 12:35:37

Shin
Member

Re: エクセルのような動き

全置換は、レコード番号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

#7 2015-01-14 14:37:24

チポ
Member

Re: エクセルのような動き

もう少し簡単な思考の方法

その考え方は
フィールドの値が1のレコードから順に値が1のレコードになるまで1に書き換える


  最初のレコードへ
  Loop
    Exit Loop If[フィールド=1]
    次のレコードへ
  End Loop
  Loop
    フィールドへ1を入力
    次のレコードへ
    Exit Loop If[フィールド=1]
  End Loop


対象レコードの数が大量になると全置換より早くなるかも。。

Offline

#8 2015-01-14 15:15:54

見習い
Member

Re: エクセルのような動き

Shin wrote:

全置換は、レコード番号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

#9 2015-01-14 15:18:59

見習い
Member

Re: エクセルのような動き

チポ wrote:

もう少し簡単な思考の方法

その考え方は
フィールドの値が1のレコードから順に値が1のレコードになるまで1に書き換える


  最初のレコードへ
  Loop
    Exit Loop If[フィールド=1]
    次のレコードへ
  End Loop
  Loop
    フィールドへ1を入力
    次のレコードへ
    Exit Loop If[フィールド=1]
  End Loop


対象レコードの数が大量になると全置換より早くなるかも。。


ありがとうございます。
このloopはイメージができました。
試してみます。

ただこれはGOではサーバー上でスクリプトを実行させた方が処理が早いかと思いますが
このままではサーバー上ではうまく動作しませんよね?
ちなみに不特定多数のクライアントが同時に同じ動きで「1」で挟むとなると尚更サーバー上ではうまく動作しませんよね?

Offline

#10 2015-01-14 15:19:49

Shin
Member

Re: エクセルのような動き

それも考え方は簡単なのでやってみたんですが、範囲が最初の数十レコードのみなどの特殊な状況以外では、全置換の方が早くなります。
上の式での全置換は、40000レコードで2秒程度です。(MacBookPro i7 2.8G FM11 MacOSX 10.9.5)変数での処理は、オンメモリーのみのため、劇的に早いです。

Last edited by Shin (2015-01-14 16:32:57)

Offline

#11 2015-01-14 15:22:28

Hiro
Member

Re: エクセルのような動き

それって、位置決め引数が定数値(1)でしかも置換値(1)とも共通だと、使う度に前回の代入値(1)をクリアーリセットしなければならなくなりませんか?
位置決め引数はUUIDやタイムスタンプ番号など固有シリアル値にしておけば、そのクリアーリセットの手間は不用に出来ますけど。

Offline

#12 2015-01-14 15:29:44

見習い
Member

Re: エクセルのような動き

難しい会話をされておりますが補足質問をしていいでしょうか。

LOOPのスクリプトステップを開始する前に対象レコードの中に
「1」が2つ以上なくては範囲で挟んでいることにならないので
それを検証して万が一「1」が一か所にしかない場合はダイアログでスクリプトを終了させたいのですが
どのようなステップをふめばいいのでしょうか・・・・

Offline

#13 2015-01-14 16:35:15

Shin
Member

Re: エクセルのような動き

1を検査しておいて、対象レコード数を数える、という事をすると良いでしょうね。
1の範囲が複数の事も有るのでしょうか。

Offline

#14 2015-01-14 16:46:05

チポ
Member

Re: エクセルのような動き

考え方を変えました。

フィールドが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

#15 2015-01-14 16:54:08

scripter
Guest

Re: エクセルのような動き

FM13ser
と書いてますので共有が前提ですから、全置換する前に置換するレコードをロックしないと、他で使用中だった場合にそこだけ残ってしまいますよね。
ポータル内でやるしかないのかな。

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: 551.96 KiB (Peak: 572.5 KiB) ]