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

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

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

You are not logged in.

Announcement

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


#1 2021-10-31 08:02:47

xyz
Member

くり返しフィールドの重複を検出して削除したい

いつもありがとうございます。

繰り返しフィールドの重複をみつけて重複は削除し、同じフィールドに削除した値を入れたいと思っているのですがうまくいきません
fm18です

フィールド1[繰り返し5]
りんご
りんご
ばなな
めろん
ばなな

とあった場合

最終的に
フィールド1
りんご
ばなな
めろん
空白
空白
としたいです。


一応書いてみたのですがうまくいきません

変数設定 [$重複削除 ; UniqueValues ( フィールド1 )]
フィールド設定 [フィールド1;""]
フィールド設定 [フィールド1;$重複削除]

と書きました。
繰り替えしの1つ目だけ削除されているような挙動を示します。

もしかしたら単純な方法もあるのかもしませんが小生の知識では手詰まりなので
どうぞよろしくお願いいたします。

Offline

#2 2021-10-31 08:51:28

Shin
Member

Re: くり返しフィールドの重複を検出して削除したい

繰り返しフィールドは、データを保存する目的で使わないほうがいいですよ。今回のように、必ず苦労します。

どうしても今の構造がないとだめなのでしたら、UniqueValues ( List ( 繰り返しフィールド ) ) のリストを作り、GetValue ( リスト[1] ; Get ( 計算式繰り返し位置番号 ) ) という式で、各繰り返し位置を設定します。

Last edited by Shin (2021-10-31 14:45:41)

Offline

#3 2021-11-01 02:44:21

Hiro
Member

Re: くり返しフィールドの重複を検出して削除したい

|りんご|りんご|ばなな|めろん|ばなな| ➡ |りんご|ばなな|めろん|空白|空白|

目的が例示通り、順序を維持した一意配列化に在るなら、
UniqueValues関数はソート処理が基準の機能のため、今回は使えないでしょう。

地道に前から1項づつ重複精査しながらループ回しする作案です。

【値一覧化スクリプト】サンプル

  • 変数を設定[ $UniqueValues ;
    値 :
          Let(
          [
             $val=List(フィールド1);
             $i=0;
             $n=0;
             $res="";
             $LOOP="Case($i=5; $res;
                Let([
                   $i=$i+1;
                   $itm=GetValue($val;$i);
                   $res=List($res; Case(IsEmpty(FilterValues($res;$itm)); $itm))
                ]; Evaluate($LOOP))
             )"
          ];
             Evaluate($LOOP)
          )

  • Loop

  • Exit Loop If [ Let($n=$n+1; $n>5) ]

  • フィールド設定 [ フィールド1[$n] ; GetValue($UniqueValues; $n) ]

  • End Loop

Offline

#4 2021-11-01 05:02:58

xyz
Member

Re: くり返しフィールドの重複を検出して削除したい

Shin様Hiro様
いつも助けていただけきありがとうございます。
Shin様>くり返しフィールドで入力するフィールドから、結局一個ずつ抜き出していたので、そもそものフィールドを増やすことにした。
Hiro様>繰り返しフィールドを使わなくしたのですが、非常に参考になるスクリプトをありがとうございます。

今回は、順番はそこまで気にしていませんでしたので、

let(
    $list=List(フィールド1;フィールド2;・・・;フィールド5);
if(ValueCount ( $list ) = ValueCount ( UniqueValues ( $list ) ) ;1;0))

の結果で条件分岐させて、内容に重複があったら(他のフィールドに入っている値と同一を入力されたら)レコード復帰させる形で解決しました。
解決しましたありがとうございます。

Offline

#5 2021-11-01 10:02:27

Shin
Member

Re: くり返しフィールドの重複を検出して削除したい

> UniqueValues関数はソート処理が基準の機能のため、今回は使えないでしょう。
検証スミです。ソートもされませんが。
UniqueValues はソートとは関係ないのでは。内部では、IsEmpty(FilterValues($res;$itm)) と同じ条件で値を出てきた順で追加している処理をしていると思います。

フィールドを分けるのでしたら、別テーブルにしておき、リレーションをはります。そのテーブルでユニークにしておくと簡単です。

Offline

#6 2021-11-02 04:43:34

xyz
Member

Re: くり返しフィールドの重複を検出して削除したい

>フィールドを分けるのでしたら、別テーブルにしておき、リレーションをはります。そのテーブルでユニークにしておくと簡単です。
なるほど、FileMakerは色々な方法が勉強になります。別テーブルの方法も検証してみます。
ありがとうございます。

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 515.03 KiB (Peak: 519.57 KiB) ]