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

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

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

You are not logged in.

Announcement

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


#1 2020-06-28 18:01:28

超初心者 FM担当
Guest

重複する過去のデータをまとめて削除

お世話になります。

重複する過去のデータを、まとめて削除したくて悩んでおります。

データは、次のような形で約10,000レコードほどあります。

フィールド:商品    フィールド:日付   フィールド:ステイタス  フィールド:営業所 

商品名 A         2020/06/01           貸出           神田支店
商品名 B         2020/06/02           貸出           府中支店
               2020/06/03           貸出           府中支店
商品名 C         2020/06/03           貸出           府中支店
商品名 A         2020/06/05           返却           神田支店
商品名 A         2020/06/07           貸出           蕨支店
商品名 A         2020/06/08           返却           蕨支店
商品名 B         2020/06/07           返却           府中支店
商品名 A         2020/06/08           貸出           神田支店
商品名 C         2020/06/09           返却           府中支店



この様なデータの中から フィールド:商品 の商品毎に、 フィールド:日付の 最新の日付のレコードのみ残して、
過去の フィールド:商品 の値が重複する分をまとめ削除したいのです。
さらに、困ったことに商品名が入力されていない場合もありました。
商品名は、単純な重複検索で約3000ほどでした。


処理後になって欲しい形

フィールド:商品    フィールド:日付   フィールド:ステイタス  フィールド:営業所

               2020/06/03           貸出           府中支店
商品名 B         2020/06/07           返却           府中支店
商品名 A         2020/06/08           貸出           神田支店
商品名 C         2020/06/09           返却           府中支店


ネットで調べて、重複する値の検索  https://fmhelp.filemaker.com/help/13/fm … .5.11.html
を試してみたのですが、日付が新しいレコードで消えた物があったり、検索後のデータのみを保存して他のデータを
消す方法がわからず、他に
https://blog.withachristianwife.com/201 … uplicates/

http://kajiwara-mac.com/filemaker/2932/2013/10/03/

http://kotokunohate.hatenablog.com/entr … 9%E6%B3%95

https://fm-aid.com/bbs2/viewtopic.php?id=2200

なども、よくわからずに悩んでおります。


上記の他に、担当者名や料金など8つのフィールドもあります。

パソコンは、Windows10 、Filemakerは 15 です。

良い方法がございましたら、ご教授下さい。

よろしくお願い申し上げます。

#2 2020-06-28 18:11:26

Moz
Member

Re: 重複する過去のデータをまとめて削除

まずは現状のデータの中から削除の対象とするレコードの条件を決めることでしょう。
商品名が空欄のレコードも存在するなら重複だけが条件ではないですよね。

Offline

#3 2020-06-28 22:20:28

Shin
Member

Re: 重複する過去のデータをまとめて削除

商品名が未入力はどう処理しますか。

処理は簡単で、
重複を抽出します。
日付で昇順でソートし、
最初のレコードを削除、
それを対象レコードが無くなるまで繰り返します。

Offline

#4 2020-06-29 08:31:13

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Moz様

ありがとうございます。
フィールド:商品名が空欄の場合は、後で確認をするように、そのまま残しておきたいです。
削除の対象とするレコードの条件は、フィールド:商品が重複している物で最新の日付以外のレコードで、
もしフィールド:商品が空欄の場合はそのまま残すようにしたいです。

お世話になります。

よろしくお願い申し上げます。

#5 2020-06-29 08:45:01

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Shin様

お世話になります。

フィールド:商品が空欄の場合は、残すようにしたいです。

「重複を抽出します。」
こちらは、フィールド:商品 に ! を入れて、検索を試しましたが、重複しているレコードの
いずれかが抽出されるような結果になりました。

「最初のレコードを削除、
それを対象レコードが無くなるまで繰り返します。」
ネットで調べているのですが、検索の語句がいけないのか、手順などのページがみつからないので、
もう少し探してみます。

処理は簡単でとございますが、もう一週間以上悩んでいてお恥ずかしいばかりです。

ご迷惑をおかけしてすみませんが、よろしかったらご教授ください
甘えてすみません。

宜しくお願い申し上げます。

#6 2020-06-29 16:00:28

Hiro
Member

Re: 重複する過去のデータをまとめて削除

スクリプトで一括処理する案です。

【条件付き削除スクリプト】

・ 全レコードを表示
・ レコードへ移動[最初の]
・Loop
・  If[※判別式]
・  ( レコード削除[ダイヤログあり:オフ]) ⇔ 「レコードを対象外に」で先ず動作テストすること!
・    Exit Loop If[Get(レコード番号)=Get(対象レコード数)]
・  Else
・    レコードへ移動[次の;最後まできたら終了:オン]
・  End If
・End Loop


※判別式
Let(
[
   #sql=ExecuteSQL("SELECT MAX(""日付"") FROM ""テーブル"" WHERE ""商品""=?"; ""; ""; テーブル::商品)
];
   (GetAsDate(#sql)<>テーブル::日付)*Length(テーブル::商品)
)

Offline

#7 2020-06-29 18:44:54

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Hiro様

お世話になります。
ご教授していただいて、ありがとうございます。

まだ、スクリプトと言うのがよくわかなくて、教えていただいたように
やってみましたら、データがすべて ?マーク になってしまいました。

画面はチカチカして、データが変わっているように見えたのですが、
わたしが何か間違えているのかと思いますので、もう少し試してみて
またご報告いたします。

ご親切に教えていただいたのに、わたしの知識が乏しいのですみません。

宜しくお願い申し上げます。

#8 2020-06-30 08:51:53

Shin
Member

Re: 重複する過去のデータをまとめて削除

重複レコードで、最後に作成されたレコードを残すのでしたら、
Loop
  検索実行  重複を検索します
  レコードへ移動[最初の]
  レコード削除[ダイヤログあり:オフ]
  Exit Loop If[Get(対象レコード数) = 0]
End Loop

重複がなくなれば、検索実行でエラーになりダイアログが表示されるので、それで終了させてもいいでしょう。

別の方法として、全体にシリアル番号を振っておきます。dateで降べきソートした顧客名をキーとする自己リレーションを貼ります。リレーション::シリアル番号 = シリアル番号 という計算フィールドを作り、0で検索します。商品名が空白のものを除外すれば、削除対象です。

Last edited by Shin (2020-06-30 08:58:20)

Offline

#9 2020-06-30 09:54:01

チポ
Member

Re: 重複する過去のデータをまとめて削除

重複
と書かれていますけれど、
各商品の貸出・返却の履歴ですよね?

そのレコードを削除していいのでしょうか?

履歴の最後のレコードのみを表示する方法は他にもありますが。。

Offline

#10 2020-06-30 10:32:07

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Shin様

お世話になります。

Loop・・・・のスクリプトは、どうも「 検索実行  重複を検索します」の場所が上手く
できなくて、「 リレーション 」 ってのがよくわかっていないので、エラーがばかりで
挑戦中です。

やはり、わたしみたいにまだ初心には難しいのかもと、反省してます。

引き続き、試してみます。

ご教授ありがとうございます。

#11 2020-06-30 10:37:56

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

チポ様

お世話になります。

「そのレコードを削除していいのでしょうか?」

履歴は、保存をしておかないといけないので、今までのファイルで保存をしておいて、
社内的なことで申し訳ございませんが、新しい体制になったので、データーすべて整理して
最終の状態から、あらためて管理をする事になったので、最終の日付のレコードのみに
して、過去の重複分を削除したくて、困っているのです。。

甘えて申し訳ございませんが、もし良い方法がありましたら教えてください。

宜しくお願い申し上げます。

#12 2020-06-30 10:43:20

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Hiro様

お世話になります。

その後の結果ですが、やはり全部の値が ?マーク になっちゃって、試験用に作った
ファイルでも同じ結果になりました。

わたしが、きちんと理解できたり、応用がきけば良いのに、おばかなのでせっかく教えて
もらったのに、上手にできなくてすみません。

他の方からの方法といっしょに、今日また試してみます。

ありがとうございました。

宜しくお願い申し上げます。

#13 2020-06-30 11:06:44

Shin
Member

Re: 重複する過去のデータをまとめて削除

最初に、
> この様なデータの中から フィールド:商品 の商品毎に、 フィールド:日付の 最新の日付のレコードのみ残して、
> 過去の フィールド:商品 の値が重複する分をまとめ削除したいのです。
と書いていらっしゃいますね。
> 履歴は、保存をしておかないといけないので、今までのファイルで保存をしておいて、
後出し条件は、全部を覆しますが。

最後の履歴だけを、または最近の履歴を数回分だけみたい、という事なんでしょう。

新しいテーブルに、商品名フィールドを作ります。そのフィールドでは、フィールドオプションの制限で、ユニーク と 空欄不可 をチェックしておき、常にチェック としておきます。
今のテーブルから商品名をインポートすると、重複しない商品名リストができます。
このテーブルから履歴テーブルへ商品名をキーとするリレーションをはり、ポータルで表示します。日付で降べきにソートします。ポータルの表示を1行だけにしておけば最新の履歴だけが表示され、複数行にすれば最近の履歴が表示されます。

Offline

#14 2020-06-30 11:57:48

チポ
Member

Re: 重複する過去のデータをまとめて削除

現テーブルはそのままにして、
新たなテーブルで最新情報だけを残したい。
ですよね。

現テーブルのデータなしのコピーをとって、
現テーブルで商品が空白と、日付最新レコードのみを対象としてそれをインポート。
とした方がきれいなテーブルができますよ。

対象レコードの抽出は、
  商品
  日付
でソートし、最初のレコードから順に、
商品名が空白をスルー、
商品名が次のレコードと同じレコードを対象外。
これを最後のレコードまで続けます。

これをスクリプトにすればいいのですが、
ハードルが高いかな?

Offline

#15 2020-06-30 13:49:49

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Shin様

ご親切にありがとうございます。

「後出し条件は、全部を覆しますが。」

言葉足らずですみません。
今までの履歴は、そのまま保管をしておいて、ファイルやテーブルを複製して、その後にこの作業をおこなって
きれいなデータを作りたかったのです。

説明不足で、気分を害してしまいましてすみませんでした。

まだ本当に初心者で、リレーションとかポータルってのがよくわからないので、調べながら
試してみます。

お手数をおかけして、ごめんなさい。

ありがとうございます。

#16 2020-06-30 14:12:35

Shin
Member

Re: 重複する過去のデータをまとめて削除

簡単なサンプルです。
https://www.dropbox.com/s/jmwxfshphzu8b … 2.zip?dl=0

新しいテーブルの内容は、商品名フィールドに制限をつけて、履歴テーブルのレコードをインポートしただけです。

Last edited by Shin (2020-06-30 15:48:55)

Offline

#17 2020-06-30 14:16:42

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

チポ様

ご教授ありがとうございます。

「現テーブルはそのままにして、
新たなテーブルで最新情報だけを残したい。
ですよね。」

まさしく、その通りです。

「これをスクリプトにすればいいのですが、
ハードルが高いかな?」

手順の方法、ありがとうございます。

ご説明いただいた動作は、なんとなくわかるのですが、ご指摘の通り スクリプトに
するのってのが、まったくわからなくてすみません。

Hiro様に教わったのを、昨夜から試しているのですが、どうしても値がすべて ?マーク なって
いろいろ調べたり試しております。

今夜より後になるかと思いますが、調べて見ます。

ご親切にありがとうございます。

#18 2020-06-30 14:25:30

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Shin様

ご教授、ありがとうございます。

ご親切にサンプルまで作っていただいてありがとうございます。

はじめてリレーションっての見せていただいてありがとうございます。
勉強になります。

この後、どうなっているのか、よく見させていただいて、またご報告いたします。

甘えちゃってごめんなさい。
ほんとうに、助かります。

#19 2020-06-30 14:51:30

チポ
Member

Re: 重複する過去のデータをまとめて削除

ステップを書いちゃいますね。

  全レコードを表示
  レコードのソート
   (ソート順  商品
                    日付)
  レコードへ移動[最初の]
  Loop
    If [ IsEmpty ( 商品 ) ]
      レコードへ移動 [ 次の ]
    Else If [ GetNthRecord ( 商品 ; Get ( レコード番号 ) + 1 ) = 商品 ]
      レコードを対象外に
    Else
      レコードへ移動 [ 次の ; 最後まできたら終了 ]
    End If
  End Loop

これで残すべきレコードが対象レコードとなります。
これを新しいテーブルでインポートすればいいでしょう。

Offline

#20 2020-06-30 15:54:26

Shin
Member

Re: 重複する過去のデータをまとめて削除

ちょっと気になったのですが、
> 今までの履歴は、そのまま保管をしておいて、ファイルやテーブルを複製して、
別ファイルを作る、という事ですか。その後の履歴が貯まれば、また別ファイルを作る、を繰り返していく?
その運用は強くお薦めしません。履歴データは、現在のデータの大事な基礎です。そのまま追加保存していくべきです。その中から、今必要な情報を抜き出してユーザーへ見せる、というのがデータベースの基本です。

Offline

#21 2020-06-30 16:45:34

Hiro
Member

Re: 重複する過去のデータをまとめて削除

#4案は同一「商品&日付」の場合の最新判断ができなかったので、修正案サンプルをアップしました。
作成順を得る要素に「レコードID」計算フィールド(式:Get(レコード ID))を追加しています。
また、#1問『重複する過去のデータをまとめて削除』の「削除」は復帰出来ませんから、「対象外」処理に変更してあります。
さらに、結果を別テーブルに取り出すなら、元本テーブルで「最新データ検出」されたレコードを対象に「インポート」するのが良いでしょう。

●サンプル「最新データ検出.fmp12」 → https://1drv.ms/u/s!AlaCGhTKTWEOqCbuaUD … d?e=o5lNsy

【新 判別式】(対象外レコードの判別式)
Let(
[
   #sql=
      ExecuteSQL(
         "SELECT MAX(\"日付\"+\"レコードID\") FROM \"テーブル\" WHERE \"商品\"=?"
         ; ""; ""; テーブル::商品
      )
];
   Choose(IsEmpty(テーブル::商品); GetAsDate(#sql)≠(テーブル::日付+テーブル::レコードID))
)

Offline

#22 2020-06-30 17:58:33

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

チポ様

ご指導ありがとうございます。

わたしが、まだまだスクリプトってものを理解していないので、なんかエラーが出たり、
何も変化がなかったりして、まだ試しているところです。
関数など、調べながらなので遅くてすみません。

もう少しやってみて、またご報告いたします。

よろしくお願い申し上げます。

#23 2020-06-30 18:11:24

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Shin様

ご心配までいただいてありがとうございます。
おっしゃる通りです。

おっしゃる通りなのですが、会社の体制の変更や諸事情で、新たな管理方法にかわるので
その準備で過去の分とは別に、新たに管理をしないといけない事になってしまいまして
しかも、いままで入力の作業しかした事が無かったので、本当に初歩的な質問ばかり
すみません。
この後、フィールドの追加とか、それに合わせてレイアウトを作ったりとか、また変な質問を
お願いすると思いますが、お願いいたします。

今夜、いただいたサンプルを参考に試してみます。

#24 2020-06-30 18:21:57

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

Hiro様

サンプルファイルまで作ってくださって、本当にありがとうございます。

おかげまで、試験用のファイルで思うように動きました。

スクリプトを間違えて作っていたみたいで、いただいたサンプルファイルのようにしたら
バッチリ思っていた通りの結果がでました。
手品でも見ているようで、驚きました。

ありがとうございました。

この後、再度試験をおこなって作業用のファイルで試してみます。

また、いろいろと初歩的な質問をすると思いますが、懲りずにお願いいたします。

ご親切にしていただいて、本当に助かりました。

ありがとうございました。

#25 2020-07-01 06:22:23

超初心者 FM担当
Guest

Re: 重複する過去のデータをまとめて削除

チポ様

この度は、ご教授ありがとうございました。

試験用準備したファイルで上手く動きました。
「 ダイアログあり 」 とか 「 最後まできたら終了 」 の後のオン・オフなど
でちょっと悩みましたが、思っていたような結果になりました。

Hiro様の方法など、いろいろなやり方があるが、とても勉強になります。

この後も、また初歩的な質問でお手を煩わすかと思いますが、懲りずにお願いいたします。
ご親切にしていただいて、本当に助かりました。

ありがとうございました。

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.007 seconds, 8 queries executed - Memory usage: 591.68 KiB (Peak: 628.59 KiB) ]