みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
レコードのインポートを「対象レコードで一致するレコードを更新」のインポート方法で実施した場合について質問です。
照合フィールドと一致するレコードがあった場合、データに変更がなかったとしても修正情報が更新されてしまいます。
例)
インポート元 インポート先
主キー 商品名 主キー 商品名
111 青りんご 111 りんご
222 みかん 222 みかん
333 ぶどう
このインポートを行なった場合、
全てのレコードの修正情報が更新されてしまいます。
111は青リンゴに変更されるので修正情報は更新されて良いですが、
222は情報に変更が無いので更新したくありません。
一度、仮テーブルにインポートしてからデータ比較後に、変更があるものだけを絞り込んでインポートするなどを考えましたが、
一度のインポートが大量になるため、時間がかかってしまい現実的ではありません。
何か簡単な方法がありますでしょうか。
Ver16を利用中です。
インポート対象のフィールド全てでリレーションします。インポートされるテーブルへ、関連レコードへ移動で移り、対象外を表示、その後インポートすればいいでしょう。
Offline
同じ値で書換えられて、何か困ったことがあるのですか?
Offline
インポート元が何か分かりませんが、変更分だけ貰うことはできないのですか?
Offline
Shinさま→
情報不足ですみません。
インポート元はcsvファイルになりますのでリレーションするとなるとやはり一度仮のテーブルへのインポートが必要でしょうか。
Hiroさま→
同じ値で書き換えられていること自体には困っていません。
同じ値で書き換えられている = データ修正されたわけでは無い
という認識で運用したいため、全てのフィールド情報が同じ値で書き換えられたならば修正情報が更新されないようにしたいという希望になります。
どこか1フィールドでも別の値に書き換えられたなら修正情報は更新されて欲しいです。
Mozさま→
貰えないんですよね、、、
FileMaker 側で簡単に行うことはできませんでしょうか。
全部をインポートして、その中で主キーが重複しているレコードを削除。
あまりほめられた方法ではないと思いますが、
これで最低のご希望には合っているかと。。
主キーの重複判定の方法もいろいろ考えられますが、どれも時間がかかりそうかな、、
別テーブルで仮インポートがお薦めですね。
Offline
FileMaker 側で簡単に行うことはできません。
Shinさんが1例を提示している様な感じで差分を確認する処理が必要です。
FileMaker からそれてしまいますが、
PowerShell で、処理した場合コードは、数行です。
PowerShell を使用した差分出力の例:
A.csv:新しいファイル
B.csv:以前のファイル
C.csv:以前のファイルに無い、もしくは変更のあった行が出力されます。
$NEW = Get-Content D:\A.csv -Encoding UTF8
$OID = Get-Content D:\B.csv -Encoding UTF8
$NEW | where {$OID -notcontains $_} | Set-Content D:\C.csv -Encoding UTF8
動作検証はWindowのみ
※Macの場合もPowerShellをインストールすればイケそうな。
※※データが多い場合、それなりに時間がかかります。
参考:
https://social.msdn.microsoft.com/Forum … wershellja
Last edited by qb_dp (2018-09-20 16:01:55)
Offline
>#5 『全てのフィールド情報が同じ値で書き換えられたならば修正情報が更新されないようにしたいという希望』
「修正情報」の意味と意義が不明ですが、
CSVファイルの差分のみデータ更新と言う事なら、
元本CSVデータを仮の空テーブルにクリーンインポートして、
>#2 Shinさん案を適用するのが良いでしょう。
この一連の流れをスクリプト化して実装するのが楽ちんかと!
Offline
チポさま→
主キーの重複だけだと上の例でいうと111 が青りんごにならないためNGなんです。
やっぱり仮のテーブルへインポートですかね。
qb_dpさま→
PowerShell だと楽チンなのですね。
ありがとうございます。
Hiroさま→
>「修正情報」の意味と意義が不明ですが、
すみません。タイトルに記載した通りFileMaker のフィールドオプションで設定できる「修正情報」になります。
具体的にはタイムスタンプとユーザーを取得しているフィールドになります。
やはりデータを比較して変更のあるレコードのみをインポートになりますか。
皆様ご回答ありがとうございます。
もしもう少し簡単に実現できる方法がありましたら教えてください。
よろしくお願いします。
FileMaker だけで処理するなら、一旦、同じ構造を持つテンポラリーファイルにインポートしておいて、上の処理を行ってインポート、テンポラリーファイルを削除するか、レコードを全削除する、という処理が現実的でしょうね。
テンポラリーファイルをテンポラリーフォルダーに作る作例です。
https://www.dropbox.com/s/mlbjzvkbvyvj0 … 2.zip?dl=0
または、テキストファイルをそのまま取り込んでしまい、1レコードずつ切り分けて、データを比較して同一でなければフィールド設定で変更、という手順も考えられますが、処理に時間がかかるのでインポートするレコード数によってはありかも。
Last edited by Shin (2018-09-20 21:11:11)
Offline
Shinさま→
sampleまでありがとうございます。
やはり2度のインポートが現実的なのですね。
FileMaker だけで処理するなら、ですが。処理は、まあまあ早いです。
ただし、サーバークライアント環境では、ファイルの保存ができませんので、ローカルのどこかに空の別ファイルを置いておき、それを開いて空のコピーを用意する様な処理とか、適当なファイルで毎回レコードを全削除する処理をが必要かもしれません。
Last edited by Shin (2018-09-21 13:44:59)
Offline
最終的に「修正情報」の条件付更新ができれば良い訳なので、
通常の照合インポート後に「修正情報」のみ修正処理をする方法が、
一番軽快で簡便かもしれませんネ。
現在の全比較フィールド値一覧を格納する「旧値一覧」フィールドを用意
FM標準の照合インポートを実行
「修正情報」フィールドを下記計算値で「フィールド内容の全置換」更新を実行
Case(
IsEmpty(旧値一覧)
or
FilterValues(List(比較フィールド1;・~・;比較フィールドn); 旧値一覧) <> FilterValues(旧値一覧; 旧値一覧)
; Get(アカウント名) &" : "& Get(タイムスタンプ)
; 修正情報
)
「旧値一覧」フィールドを下記計算値で「フィールド内容の全置換」更新を実行
List(比較フィールド1;・~・;比較フィールドn)
以上 (考えだけで、実動作テストは行っておりません)
Last edited by Hiro (2018-09-21 15:54:02)
Offline
Hiroさん、僕もそれ考えたんですが、
レコードを普通に編集した時に変更情報も更新しますよね。それとの兼ね合いで面倒では。全フィールドにトリガー仕掛けます?それとも自動入力の修正タイムスタンプと、上の修正情報を比較かな。
Offline
もし、やはり事前に差分精査して差分だけをインポートするなら、
>#7 qb_dpさんのPowerShell案もあるのでは?
その場合、>#7文中『B.csv:以前のファイル』として
自己テーブルをCSVエキスポートする案も、一法かと!
Offline
Hiroさんの方法を少し修正するとうまくいきそうな気も。
・修正日時
タイプ:タイムスタンプ
入力値の自動化:修正情報 タイムスタンプ(日付と時刻)
・修正情報
タイプ:テキスト
入力値の自動化:計算値
If(修正日時;
If ( List(列1;列2;列3)<>_旧値
;Get ( タイムスタンプ ) & Get ( アカウント名 )
;修正情報 )
)
・_旧値
タイプ:テキスト
入力値の自動化:計算値
If(修正情報;List(列1;列2;列3);_旧値)
インポートは試してませんが、手入力で編集する限りは意図した動きをしているようです。
Offline
0から考え直したら、そんなに難しくなかった。手編集も、インポートも、何も追加動作は不要です。
https://www.dropbox.com/s/j2m2196r4edjq … 2.zip?dl=0
Last edited by Shin (2018-09-23 17:39:15)
Offline
ご連絡が遅くなりまして申し訳ありません。
皆様のご投稿本当にありがとうございます。
どの方法で実装するのが良いか検討させていただきます。
Shin様のご投稿いただきましたsampleですが、チェックボックスフィールドのsubstituteは何のために行われている処理になるのでしょうか?
理解が及びませんでしたので教えていただけますと幸いです。
Hiroさんの書いておられた事を実験してたファイルを流用したので、そちらで使っていたゴミ設定です。無視してください。
Offline
Pages: 1
[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 562.8 KiB (Peak: 583.71 KiB) ]