みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
お世話になります。
重複する過去のデータを、まとめて削除したくて悩んでおります。
データは、次のような形で約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 です。
良い方法がございましたら、ご教授下さい。
よろしくお願い申し上げます。
まずは現状のデータの中から削除の対象とするレコードの条件を決めることでしょう。
商品名が空欄のレコードも存在するなら重複だけが条件ではないですよね。
Offline
商品名が未入力はどう処理しますか。
処理は簡単で、
重複を抽出します。
日付で昇順でソートし、
最初のレコードを削除、
それを対象レコードが無くなるまで繰り返します。
Offline
Moz様
ありがとうございます。
フィールド:商品名が空欄の場合は、後で確認をするように、そのまま残しておきたいです。
削除の対象とするレコードの条件は、フィールド:商品が重複している物で最新の日付以外のレコードで、
もしフィールド:商品が空欄の場合はそのまま残すようにしたいです。
お世話になります。
よろしくお願い申し上げます。
Shin様
お世話になります。
フィールド:商品が空欄の場合は、残すようにしたいです。
「重複を抽出します。」
こちらは、フィールド:商品 に ! を入れて、検索を試しましたが、重複しているレコードの
いずれかが抽出されるような結果になりました。
「最初のレコードを削除、
それを対象レコードが無くなるまで繰り返します。」
ネットで調べているのですが、検索の語句がいけないのか、手順などのページがみつからないので、
もう少し探してみます。
処理は簡単でとございますが、もう一週間以上悩んでいてお恥ずかしいばかりです。
ご迷惑をおかけしてすみませんが、よろしかったらご教授ください
甘えてすみません。
宜しくお願い申し上げます。
スクリプトで一括処理する案です。
・ 全レコードを表示
・ レコードへ移動[最初の]
・Loop
・ If[※判別式]
・ ( レコード削除[ダイヤログあり:オフ]) ⇔ 「レコードを対象外に」で先ず動作テストすること!
・ Exit Loop If[Get(レコード番号)=Get(対象レコード数)]
・ Else
・ レコードへ移動[次の;最後まできたら終了:オン]
・ End If
・End Loop
※判別式
Let(
[
#sql=ExecuteSQL("SELECT MAX(""日付"") FROM ""テーブル"" WHERE ""商品""=?"; ""; ""; テーブル::商品)
];
(GetAsDate(#sql)<>テーブル::日付)*Length(テーブル::商品)
)
Offline
Hiro様
お世話になります。
ご教授していただいて、ありがとうございます。
まだ、スクリプトと言うのがよくわかなくて、教えていただいたように
やってみましたら、データがすべて ?マーク になってしまいました。
画面はチカチカして、データが変わっているように見えたのですが、
わたしが何か間違えているのかと思いますので、もう少し試してみて
またご報告いたします。
ご親切に教えていただいたのに、わたしの知識が乏しいのですみません。
宜しくお願い申し上げます。
重複レコードで、最後に作成されたレコードを残すのでしたら、
Loop
検索実行 重複を検索します
レコードへ移動[最初の]
レコード削除[ダイヤログあり:オフ]
Exit Loop If[Get(対象レコード数) = 0]
End Loop
重複がなくなれば、検索実行でエラーになりダイアログが表示されるので、それで終了させてもいいでしょう。
別の方法として、全体にシリアル番号を振っておきます。dateで降べきソートした顧客名をキーとする自己リレーションを貼ります。リレーション::シリアル番号 = シリアル番号 という計算フィールドを作り、0で検索します。商品名が空白のものを除外すれば、削除対象です。
Last edited by Shin (2020-06-30 08:58:20)
Offline
重複
と書かれていますけれど、
各商品の貸出・返却の履歴ですよね?
そのレコードを削除していいのでしょうか?
履歴の最後のレコードのみを表示する方法は他にもありますが。。
Offline
Shin様
お世話になります。
Loop・・・・のスクリプトは、どうも「 検索実行 重複を検索します」の場所が上手く
できなくて、「 リレーション 」 ってのがよくわかっていないので、エラーがばかりで
挑戦中です。
やはり、わたしみたいにまだ初心には難しいのかもと、反省してます。
引き続き、試してみます。
ご教授ありがとうございます。
チポ様
お世話になります。
「そのレコードを削除していいのでしょうか?」
履歴は、保存をしておかないといけないので、今までのファイルで保存をしておいて、
社内的なことで申し訳ございませんが、新しい体制になったので、データーすべて整理して
最終の状態から、あらためて管理をする事になったので、最終の日付のレコードのみに
して、過去の重複分を削除したくて、困っているのです。。
甘えて申し訳ございませんが、もし良い方法がありましたら教えてください。
宜しくお願い申し上げます。
Hiro様
お世話になります。
その後の結果ですが、やはり全部の値が ?マーク になっちゃって、試験用に作った
ファイルでも同じ結果になりました。
わたしが、きちんと理解できたり、応用がきけば良いのに、おばかなのでせっかく教えて
もらったのに、上手にできなくてすみません。
他の方からの方法といっしょに、今日また試してみます。
ありがとうございました。
宜しくお願い申し上げます。
最初に、
> この様なデータの中から フィールド:商品 の商品毎に、 フィールド:日付の 最新の日付のレコードのみ残して、
> 過去の フィールド:商品 の値が重複する分をまとめ削除したいのです。
と書いていらっしゃいますね。
> 履歴は、保存をしておかないといけないので、今までのファイルで保存をしておいて、
後出し条件は、全部を覆しますが。
最後の履歴だけを、または最近の履歴を数回分だけみたい、という事なんでしょう。
新しいテーブルに、商品名フィールドを作ります。そのフィールドでは、フィールドオプションの制限で、ユニーク と 空欄不可 をチェックしておき、常にチェック としておきます。
今のテーブルから商品名をインポートすると、重複しない商品名リストができます。
このテーブルから履歴テーブルへ商品名をキーとするリレーションをはり、ポータルで表示します。日付で降べきにソートします。ポータルの表示を1行だけにしておけば最新の履歴だけが表示され、複数行にすれば最近の履歴が表示されます。
Offline
現テーブルはそのままにして、
新たなテーブルで最新情報だけを残したい。
ですよね。
現テーブルのデータなしのコピーをとって、
現テーブルで商品が空白と、日付最新レコードのみを対象としてそれをインポート。
とした方がきれいなテーブルができますよ。
対象レコードの抽出は、
商品
日付
でソートし、最初のレコードから順に、
商品名が空白をスルー、
商品名が次のレコードと同じレコードを対象外。
これを最後のレコードまで続けます。
これをスクリプトにすればいいのですが、
ハードルが高いかな?
Offline
Shin様
ご親切にありがとうございます。
「後出し条件は、全部を覆しますが。」
言葉足らずですみません。
今までの履歴は、そのまま保管をしておいて、ファイルやテーブルを複製して、その後にこの作業をおこなって
きれいなデータを作りたかったのです。
説明不足で、気分を害してしまいましてすみませんでした。
まだ本当に初心者で、リレーションとかポータルってのがよくわからないので、調べながら
試してみます。
お手数をおかけして、ごめんなさい。
ありがとうございます。
簡単なサンプルです。
https://www.dropbox.com/s/jmwxfshphzu8b … 2.zip?dl=0
新しいテーブルの内容は、商品名フィールドに制限をつけて、履歴テーブルのレコードをインポートしただけです。
Last edited by Shin (2020-06-30 15:48:55)
Offline
チポ様
ご教授ありがとうございます。
「現テーブルはそのままにして、
新たなテーブルで最新情報だけを残したい。
ですよね。」
まさしく、その通りです。
「これをスクリプトにすればいいのですが、
ハードルが高いかな?」
手順の方法、ありがとうございます。
ご説明いただいた動作は、なんとなくわかるのですが、ご指摘の通り スクリプトに
するのってのが、まったくわからなくてすみません。
Hiro様に教わったのを、昨夜から試しているのですが、どうしても値がすべて ?マーク なって
いろいろ調べたり試しております。
今夜より後になるかと思いますが、調べて見ます。
ご親切にありがとうございます。
Shin様
ご教授、ありがとうございます。
ご親切にサンプルまで作っていただいてありがとうございます。
はじめてリレーションっての見せていただいてありがとうございます。
勉強になります。
この後、どうなっているのか、よく見させていただいて、またご報告いたします。
甘えちゃってごめんなさい。
ほんとうに、助かります。
ステップを書いちゃいますね。
全レコードを表示
レコードのソート
(ソート順 商品
日付)
レコードへ移動[最初の]
Loop
If [ IsEmpty ( 商品 ) ]
レコードへ移動 [ 次の ]
Else If [ GetNthRecord ( 商品 ; Get ( レコード番号 ) + 1 ) = 商品 ]
レコードを対象外に
Else
レコードへ移動 [ 次の ; 最後まできたら終了 ]
End If
End Loop
これで残すべきレコードが対象レコードとなります。
これを新しいテーブルでインポートすればいいでしょう。
Offline
ちょっと気になったのですが、
> 今までの履歴は、そのまま保管をしておいて、ファイルやテーブルを複製して、
別ファイルを作る、という事ですか。その後の履歴が貯まれば、また別ファイルを作る、を繰り返していく?
その運用は強くお薦めしません。履歴データは、現在のデータの大事な基礎です。そのまま追加保存していくべきです。その中から、今必要な情報を抜き出してユーザーへ見せる、というのがデータベースの基本です。
Offline
#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
チポ様
ご指導ありがとうございます。
わたしが、まだまだスクリプトってものを理解していないので、なんかエラーが出たり、
何も変化がなかったりして、まだ試しているところです。
関数など、調べながらなので遅くてすみません。
もう少しやってみて、またご報告いたします。
よろしくお願い申し上げます。
Shin様
ご心配までいただいてありがとうございます。
おっしゃる通りです。
おっしゃる通りなのですが、会社の体制の変更や諸事情で、新たな管理方法にかわるので
その準備で過去の分とは別に、新たに管理をしないといけない事になってしまいまして
しかも、いままで入力の作業しかした事が無かったので、本当に初歩的な質問ばかり
すみません。
この後、フィールドの追加とか、それに合わせてレイアウトを作ったりとか、また変な質問を
お願いすると思いますが、お願いいたします。
今夜、いただいたサンプルを参考に試してみます。
Hiro様
サンプルファイルまで作ってくださって、本当にありがとうございます。
おかげまで、試験用のファイルで思うように動きました。
スクリプトを間違えて作っていたみたいで、いただいたサンプルファイルのようにしたら
バッチリ思っていた通りの結果がでました。
手品でも見ているようで、驚きました。
ありがとうございました。
この後、再度試験をおこなって作業用のファイルで試してみます。
また、いろいろと初歩的な質問をすると思いますが、懲りずにお願いいたします。
ご親切にしていただいて、本当に助かりました。
ありがとうございました。
チポ様
この度は、ご教授ありがとうございました。
試験用準備したファイルで上手く動きました。
「 ダイアログあり 」 とか 「 最後まできたら終了 」 の後のオン・オフなど
でちょっと悩みましたが、思っていたような結果になりました。
Hiro様の方法など、いろいろなやり方があるが、とても勉強になります。
この後も、また初歩的な質問でお手を煩わすかと思いますが、懲りずにお願いいたします。
ご親切にしていただいて、本当に助かりました。
ありがとうございました。
[ Generated in 0.007 seconds, 8 queries executed - Memory usage: 591.68 KiB (Peak: 628.59 KiB) ]