みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
FileMaker Server 2023
FileMaker Pro 2023
macOS 13.5.2
受注データの重複チェックについて教えてください。
メールで届くCSVデータをFileMakerでインポートして、受注データの抽出等を行っています。
CSVデータには、本日の新規受注データ以外にも、過去1週間分の受注データが保存されており、
毎日新規の受注データと、過去の登録済み受注データの納期変更なども含まれています。
CSVデータをインポートして、重複チェックを行って、すべてのフィールドが同じレコードは
単純な重複として削除して、納期変更などがあった場合は、古いレコードを無効にして
新規レコードを有効にしています。
重複チェックを行うフィールドは、 [伝票No].や[品番]、[受注日]、[納期]、[受注数]、[納期変更]、[数量変更]のフィールドを
連結して、自己リレーションで重複か固有を判断しています。
上記の重複レコードの中から、更に「対象レコードの絞り込み」で、納期変更など差異のあるレコードを
抽出して、古いレコードを無効にするなどの処理をしています。
古いレコードを無効にしたあと、同じレコードで重複チェックに引っかからないように、
重複チェック除外フラグを立てています。
ここまでは前任者が作ってくれて、今までこの方法でも問題なく動いていたのですが、
最近、重複チェックで正しい結果を得られなくなり、索引を作り直したりファイルの最適化を試しましたが不安定です。
計算フィールドでの重複チェックよりも、良い方法はありますか?
説明が下手で申し訳ありません。
宜しくお願いいたいします。
送られてきたレコードで、どのフィールドをチェックすれば重複と判断できますか。
1伝票に同じ品目が重複しなければ、 [伝票No].と[品番]を組み合わせるといいはずです。
受信した履歴は必要でしょうから、取り敢えずテーブルにインポートするといいでしょう。
さらにそれを別のテーブルへ比較インポートします。キーとなるフィールドは、上のフィールドの組み合わせです。このテーブルを見れば、最終状態になっていますので、このデータで運用すればいいでしょう。
Offline
> [伝票No].や[品番]、[受注日]、[納期]、[受注数]、[納期変更]、[数量変更]のフィールドを
> 連結して、自己リレーションで重複か固有を判断
リレーションのためだけなら連結したフィールドは不要でしょう。
各フィールドをandで照合すればいいです。
しかし、これでは、
納期変更や数量変更があった場合に照合されないのでは?
Offline
> 重複チェックを行うフィールドは、 [伝票No].や[品番]、[受注日]、[納期]、[受注数]、[納期変更]、[数量変更]のフィールドを連結して、自己リレーションで重複か固有を判断
おそらく、全く同じレコードのチェックだけなのでしょうね。
その計算フィールドに、常時ユニークの制限をつければ、自動的にインポートしなく出来ます。
Offline
Shinさま チポさま ありがとうございます。
1伝票に同じ品目が重複しなければ、 [伝票No].と[品番]を組み合わせるといいはずです。
はい、伝票No.について略してしまいましたが、伝票No. + 行No. につき 1品番 なので、固有の値になっています。
受信した履歴は必要でしょうから、取り敢えずテーブルにインポートするといいでしょう。さらにそれを別のテーブルへ比較インポートします。キーとなるフィールドは、上のフィールドの組み合わせです。このテーブルを見れば、最終状態になっていますので、このデータで運用すればいいでしょう。
とりあえずインポートするテーブルはCSVの全データを保存しておくもので、比較インポートする「別のテーブル」が「受注テーブル」という解釈で合っていますか?
比較インポートというのは、レコードのインポートの「更新」ですよね?
リレーションのためだけなら連結したフィールドは不要でしょう。
各フィールドをandで照合すればいいです。
そうですね、and でリレーションした方がよさそうですね。直してみます。
しかし、これでは、
納期変更や数量変更があった場合に照合されないのでは?
そうなんです。それで苦肉の策で、全フィールドが一致していないものを絞り込んで、変更の処理をしています。
先に[伝票No.]、[品番]、[受注日]、[納期]、[受注数]などで重複チェックをして、更に、「対象レコードの絞り込み」で [納期変更]、[数量変更] などを含む全てのフィールドで一致しないレコードを絞り込んで、変更の処理後、変更のない単純な重複レコードは削除をしています。
おそらく、全く同じレコードのチェックだけなのでしょうね。
その計算フィールドに、常時ユニークの制限をつければ、自動的にインポートしなく出来ます。
なんと!計算フィールドにユニークの制限がつけられるのですね。
お二方ありがとうございます。
教えていただいた方法に挑戦してみます。
また、つまづいたらこちらで相談させていただきますので、引き続き宜しくお願いいたいします。
制限するのは計算タイプのフィールドでなく計算値自動入力のフィールド
ユニークの制限で、重複レコードのインポートをしないようにできます。
これでインポートされたレコードが同じ伝票と判定できるリレーションにすれば、
変更伝票を特定できます。
目視等のチェック不要で書き換えていいのなら、
インポート時に上書きさせることも可能ですネ。
Offline
himadaneeさま、ありがとうございます。
計算値自動入力のフィールドなんですね。
計算タイプのフィールドに制限を設定できなくて、どうしたものかと思っていました。
使ったことのない機能なので、早速やってみました。便利ですね。
チポさま、ありがとうございます。
これでインポートされたレコードが同じ伝票と判定できるリレーションにすれば、
変更伝票を特定できます。
なるほどー!それで変更伝票を特定するんですね。すごいですね。
目視等のチェック不要で書き換えていいのなら、
インポート時に上書きさせることも可能ですネ。
目視でのチェックは不要なのですが、今までは、どこのフィールドが変更になったのかわかるように上書きをせずに古い方のレコードを対象から除外するフラグを立てていましたが、それだと無駄なレコードがたくさんできてしまい気になっていました。
上書きに変更したいです。
更新されたレコードの、どのフィールドが変更になったか特定する方法は、[納期変更]などの各フィールドにスクリプトトリガの「OnObjectModify」で備考欄にフィールド名を残していくような方法でいいでしょうか?
変更になる前のレコードと比較する機会は少ないのですが、初回登録の「作成情報タイムスタンプ」のCSVデータと比較する際に、フィールドが特定できていれば調べやすいので、可能であれば追加したい機能です。
上書きインポートでは、
インポートするフィールド全て上書きされますから、
どのフィールドが変更されたかは、まともには分からないでしょう。
例えば、インポート前に、
変更可能なフィールドの値を別のフィールドに退避させておいて、
インポート後にその値を比べる。
とかの方法はいかがでしょうかね。。
Offline
>すべてのフィールドが同じレコードは単純な重複として削除して、
> 納期変更などがあった場合は、古いレコードを無効にして新規レコードを有効
なのだから、単純に更新インポートさせればいいのでは。
Offline
実験できる環境がないのですが、「トランザクション」内でインポートすれば、トランザクションが終了するまでサーバには反映されないだろうから、サーバ側の値と照合(SQL?)して変更点を検出できませんかね。
トランザクションがない時代でも、何かそういう方法があった気がするけど、思い出せない...SQLでなくサーバ上のスクリプトだったかな。
中間テーブルを使うなら、方法はあるのですが。
同じ構造のテーブルを作り、同一とするフィールド内容を自動計算で結合させたデータを持たせるテキストフィールドを作り、常時ユニークにしておきます。
そこに、元テーブルのレコードを全てインポートし、そこに、新しいレコードを更新インポートします。全てのレコードを対象外にして、元テーブルのレコードを全て新規インポートします。これでインポートされたレコードが、更新のかかった元レコードになります。
Last edited by Shin (2023-12-22 17:39:36)
Offline
チポさま Shinさま himadaneeさま
ありがとうございます。
上書きインポートでは、
インポートするフィールド全て上書きされますから、
どのフィールドが変更されたかは、まともには分からないでしょう。
Oh...!そうなんですね(悲)。。。勉強になります。。。
>すべてのフィールドが同じレコードは単純な重複として削除して、
> 納期変更などがあった場合は、古いレコードを無効にして新規レコードを有効
なのだから、単純に更新インポートさせればいいのでは。
そうですね、古い方のレコードが残っていることで [伝票No.] で比較しやすかったから残してあったのだと思いますが
上書きで問題ないので、変更したいと思っています。
上書きされたフィールドが特定できれば、と思っていましたが、お三方からご教示いただいた方法は
私の手に負えるレベルではないので諦めます。。。
せっかくご丁寧に教えてくださったのに、申し訳ありません。
上書きをしたレコードの特定は可能でしょうか?
[伝票No.] がわかれば、CSVデータを検索して比較ができるので、フラグを立てるなどができれば件数も把握できます。
引き続き、ご指導いただけますよう宜しくお願いいたします。
追加されたレコードと上書きされたレコードの区別は、「作成情報タイムスタンプ」のフィールドを見ればわかります。
他には、Get(レコード編集回数)のフィールドを作っておくとか
検証したファイルを上げておきます。
https://www.dropbox.com/scl/fi/gdmuptij … 9fz3p&dl=0
変更されたレコードが抽出されますので、それを本テーブルへ更新インポートしていますので、作業は軽くなりますし、中間テーブルにその時の古いデータが残っていきます。中間テーブル側のテーブルデータの削除とレコードインポートを止めていれば、履歴データとして使えるデータになりますが、運用によっては大きなテーブルになってしまいます。
Last edited by Shin (2023-12-24 15:18:46)
Offline
himadaneemさま Shinさま
ありがとうございます。
お礼が遅くなり申し訳ございません。
追加されたレコードと上書きされたレコードの区別は、「作成情報タイムスタンプ」のフィールドを見ればわかります。
他には、Get(レコード編集回数)のフィールドを作っておくとか
なるほど〜。
集計表などの帳票類を発行した日時も受注テーブルで持っているので、その都度、修正情報が更新されてしまうので
CSVからインポートするフィールドと、受注処理で使うフィールドは分けて修正情報を残した方が良さそうですね。
Get(レコード編集回数)はレコード全体のフィールドに対してですよね?
あれ?もしかして、受注処理で使うフィールドは別のテーブルに分離した方がいいのでしょうか?
Shinさま、検証ファイルを作成していただききまして本当にありがとうございます!!
ダウンロードさせていただいて、今から学習させていただきます。
自分も実データでテスト用のものを作って試してみます。
皆様ありがとうございます。
理解が遅く恐縮ですが、引き続きご指導のほど宜しくお願いいたいします。
今さらですが、、
> [伝票No].や[品番]、[受注日]、[納期]、[受注数]、[納期変更]、[数量変更]のフィールド
最初のレコードは
[納期変更]、[数量変更]
これは空白ですよね。
では、変更の場合は
[納期]、[受注数]、[納期変更]、[数量変更]
これらにはどのように入力されているのですか?
Offline
お世話になります。
年明けから手術入院などで、すっかりお礼が遅くなってしまい申し訳ございませんでした。
> [伝票No].や[品番]、[受注日]、[納期]、[受注数]、[納期変更]、[数量変更]のフィールド
最初のレコードは
[納期変更]、[数量変更]
これは空白ですよね。
では、変更の場合は
[納期]、[受注数]、[納期変更]、[数量変更]
これらにはどのように入力されているのですか?
本来であれば納期変更などが発生するまでは [納期変更]、[数量変更]は空白なのかも知れませんが、変更前の[納期]と[受注数]と同じ値が入っています。
変更があった場合は、その値がしれっと変わるだけです。
皆様のお知恵を拝借しながらShinさまに作っていただいたファイルで勉強中なのですが、わからないところが出てきたので教えてください。
ひとまず自分の実データのファイルで、更新インポートを試してみたところ、更新されないレコードがありました。
重複レコードをインポートしないように、比較用にテキストフィールドの計算値自動入力のところで、フィールドを連結して、常時ユニークの設定をしたのですが
更新インポートをすると、[納期変更]の値が変更されているのにも関わらず、スルーされているレコードがありました。
何が原因になりますでしょうか?
索引を「すべて」や「最小限」も試してみましたが、変わりませんでした。
重複しているレコードはスキップされています。
宜しくお願いいたします。
どんな設定をして、どんなインポートをしました?
Offline
大変だったようで、ご自愛くださいね
> [納期]、[受注数]、[納期変更]、[数量変更]
新規の場合と、
変更の場合
CSVではどのように入力されているのでしょうか?
Offline
お世話になります。
どんな設定をして、どんなインポートをしました?
受注テーブル側に「重複チェック」というテキストフィールドを作成して、下記のように設定しました。
・入力値の自動化設定:計算値に、CSVから読み込むフィールドを全て「&」で連結
・入力値の制限:「常時」と「ユニークな値」をON
・データの格納:索引「すべて」に変更
CSVファイルには、[品番]や[担当者名]などに値の後ろにスペースが複数個くっついているので、一旦、FileMakerの「CSVインポート」というファイルにインポートして、入力値の自動化設定で余分なスペースを削除しています。
CSVインポートテーブルのレイアウトから、製品種類などで検索して絞り込み、更新インポート
・「一致しないレコードを追加」をON
・照合フィールド:[伝票番号] と [品番]
・「インポート中にフィールドに対して入力値の自動化オプションを実行:重複チェックフィールドをON
> [納期]、[受注数]、[納期変更]、[数量変更]
新規の場合と、
変更の場合
CSVではどのように入力されているのでしょうか?
新規も変更も値が変わるだけなのですが、以下のような値です。
新規・・・[納期] 20240202 [受注数] 10 [納期変更] 20240202 [数量変更] 10
変更・・・[納期] 20240202 [受注数] 10 [納期変更] 20240205 [数量変更] 10
初回の更新インポートは、重複チェックの索引を「最小限」と「必要時に索引を自動設定」の設定で、スルーでした。
何度か試してダメだったので、「最適化」をして、索引を「すべて」で試してみたら、[納期変更] が更新されました。
どこか間違っている設定があれば教えてください。
データが壊れている可能性もあれば、データなしのファイルを作って、データを入れ直した方がよいですか?
チポ様あたたかいお言葉ありがとうございます。
膝の皿が割れてカケラが動き回る「関節ねずみ」という症状の手術でした。
膝の皿が割れるほどのケガをした記憶もないのですが、激痛なので皆様もお気をつけくださいませ。
引き続き、ご指導宜しくお願いいたします。
ひとつの伝票No.で見ると、
そのすべてで納期と受注数は変わらないのですね。
とすれば、
納期と受注数の照合は不要となりますよね。
> FileMakerの「CSVインポート」というファイルにインポートして、
> 入力値の自動化設定で余分なスペースを削除
この作業後に、このテーブルの対象レコードと重複を見て、
重複レコードを対象外か、削除してからインポートすればいいのでは。
> 膝の皿が割れてカケラが動き回る「関節ねずみ」
私、結構いい歳ですが、初めて聞きました、お大事に。。
Offline
> [品番]や[担当者名]などに値の後ろにスペースが複数個くっついている
中間テーブルは必ずしもいらないのでは。品番、担当者の自動入力で、Trim() 使って、self に対しての式を書いておけばいいと思います。
インポートは、納品番号と [納期変更]、[数量変更] を照合フィールドにして、インポートすればいいはずです。
関節ねずみ、結構痛いらしいですね。関節橋での手術でしょうから、手術自体は簡単なはずですが、術後も結構痛かったでしょう。お大事に
Last edited by Shin (2024-01-31 13:29:34)
Offline
チポ様、Shin様 お世話になっております。
お礼が遅くなり申し訳ございません。
ひとつの伝票No.で見ると、
そのすべてで納期と受注数は変わらないのですね。
とすれば、
納期と受注数の照合は不要となりますよね。
なんと!!ご指摘の通りです!!
集計表などは [納期変更] と [数量変更] を元に作っているので、不要ですね。外します!
この作業後に、このテーブルの対象レコードと重複を見て、
重複レコードを対象外か、削除してからインポートすればいいのでは。
重複レコードを対象外にしてから、新規と変更のみに絞り込んでから更新インポートを行うと、更新がかからないレコードがありました。
絞り込まずに一気に更新インポートをした場合は変更も更新されました。
データがおかしくなっているのだと思いますので、作り直します。
中間テーブルは必ずしもいらないのでは。品番、担当者の自動入力で、Trim() 使って、self に対しての式を書いておけばいいと思います。
CSVファイルを直接検索すると、Excelの起動に時間がかかるのと、FileMakerの方が見やすいのでこのまま使用したいと思います。
Shin様に作っていただいたサンプルをようやく理解できました!
最初はどちらが受注テーブルなのかわからず、スクリプトの流れもわからず、難しい!と思っていたのですが
すごいです!!!
履歴まで確認できて、感謝感謝です!早速、実データで同じように作ってみます!
1つネットで調べてもわからなかったところがあるので、教えてください。
スクリプトの新規ウインドウの後に続く、If [1] のところは何が「1」になるのですか?
今のところ、「1」以外になったことがありません。
中間テーブルに履歴を残す場合が「1」で、履歴を残さない場合が「1」以外という解釈で合っていますか?
関節ねずみの件、御二方のあたたかいお言葉に・・・(涙)
ありがとうございます。
[ Generated in 0.010 seconds, 7 queries executed - Memory usage: 615.82 KiB (Peak: 652.73 KiB) ]