みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
ファイルメーカーへのインポート時に、ファイルメーカーに保存されているマスターレコードと2項目が一致するレコードをインポートしないか削除する方法を教えてください。
具体的にはECサイト(またはクラウド)からダウンロードするcsvファイルとファイルメーカーのマスターとで「サイト受注番号」と「明細番号」とが一致するレコードが対象です。
マスターレコードの概要
サイト受注番号 氏名 住所 明細番号 商品番号 商品名 個数 単価
001-000001 ○○○○ 大阪府○○市 1 001234 ○○〇〇 1 100
001-000002 □□□□ 東京都□□区 1 009999 □□□□ 2 500
001-000002 □□□□ 東京都□□区 3 004321 ■■■■ 1 200
002-000001 △△△△ 愛知県△△市 3 001111 △△△△ 3 150
002-000002 ◇◇◇◇ 大阪府◇◇市 2 002222 ◇◇◇◇ 2 200
001-000003 ◆◆◆◆ 兵庫県◆◆市 1 002345 ◆◆◆◆ 1 300
インポートレコードの概要
サイト受注番号 氏名 住所 明細番号 商品番号 商品名 個数 単価
002-000001 △△△△ 愛知県△△市 3 001111 △△△△ 3 150
002-000003 XXXX 埼玉県XX市 1 009876 XXXX 1 300
002-000003 @@@@ 東京都@@市 1 009999 @@@@ 1 500
001-000004 **** 東京都□□区 1 002222 ◇◇◇◇ 4 200
インポート結果(ソートなし)
001-000001 ○○○○ 大阪府○○市 1 001234 ○○〇〇 1 100
001-000002 □□□□ 東京都□□区 1 009999 □□□□ 2 500
001-000002 □□□□ 東京都□□区 3 004321 ■■■■ 1 200
002-000001 △△△△ 愛知県△△市 3 001111 △△△△ 3 150
002-000002 ◇◇◇◇ 大阪府◇◇市 2 002222 ◇◇◇◇ 2 200
001-000003 ◆◆◆◆ 兵庫県◆◆市 1 002345 ◆◆◆◆ 1 300
002-000003 XXXX 埼玉県XX市 1 009876 XXXX 1 300
002-000003 @@@@ 東京都@@市 1 009999 @@@@ 1 500
001-000004 **** 東京都□□区 1 002222 ◇◇◇◇ 4 200
Offline
「サイト受注番号」と「明細番号」を照合フィールドとする比較インポートを行えばいいでしょう。
Offline
照合インポートは上書きされます。
上書きもしたくないのなら、
自動入力で
サイト受注番号 & 明細番号
となるフィールドを作り、
入力値の制限で
ユニーク・常時
とすれば重複インポート・上書きされません。
Offline
マスターレコードとインポートレコードのテーブルでリレーションしておき、マスターテーブルの全レコードから対象レコードの関連レコードへ移動、を行います。対象外レコードのみを表示すると、上書きされるレコードは除外されています。それを、インポートすると良いでしょう。
Offline
Shinさん、チボさん
ありがとうございます。
前任者の設計が誤っているようで、マスターレコードの先頭行以外の明細行に注文番号がセットされていない事が判明して、設計をしなおしています。
1.別テーブルにインポートして、マスターテーブルの全レコードとの紹介(重複チェック)をLoop処理でしてから重複レコードを削除してからインポートする。
2.その際にリピータチェックを行っていますが、マスターの先頭行の氏名、住所、電話番号、メールアドレスで絞り込みをしてLoop処理をかけています。
処理の概要(簡略表示)を書きます。
レイアウトの変更[マスターテーブル]
全レコード表示
レコードの最初へ
変数を設定($氏名、$住所、$電話番号、$メールアドレス)
Loop
レイアウトの変更[トランザクションテーブル]
全レコード表示
絞り込み(氏名&住所)
If 氏名&住所==$氏名&$住所 が一致したらリピータ
Else 全レコード表示
絞り込み(氏名&電話番号)
氏名&電話番号==$氏名&$電話番号が一致したらリピーター
Else 全レコード表示
絞り込み(氏名&メールアドレス)
氏名&メールアドレス==$氏名&$メールアドレスで一致したらリピーター
レイアウト変更[マスターテーブル]
次のレコード・最終レコードなら終了
変数を設定($氏名、$住所、$電話番号、$メールアドレス)
End Loop
の様に設計しています。
ただし、マスターテーブルの全レコードが300000件あるため、インポートするデータに関わらずかなりの時間がかかります。
紹介方法の時間短縮は可能でしょうか?
よろしくお願いいたします。
Offline
受注番号の抜けについては、
let (
$n = Case ( Isempty ( field ) ; $n ; field ) ;
$n
)
の様な式で全置換すると解決できるでしょう。
リピートチェックも、自己リレーションを張れば、その関連レコード数を見るだけで判断できます。レコードの作成日か全体のシリアル番号が振ってあれば、自分より前のレコードを対象にしておくだけで初回か何回目かを判断できます。
それよりも、顧客マスターを作れば、そちらから判断できますので、こちらがお薦めです。
さらに、受注テーブルを作り、今のマスターテーブルをその明細とするのが、一番良い構造です。
今になって気がついたのですが、明細番号の付番ルールは?
001-000002 では、1, 3 ですし、002-000003 は異なる受注元で2件あり同じ1が付番されています。
Last edited by Shin (2017-11-15 11:04:05)
Offline
元のデータの構造から情報を抜き出していくのが必要ですので、複雑な動きが必要かも。
顧客テーブル-受注テーブル-明細テーブル という構造にします。(明細テーブルは、今のマスターテーブルにいくつかのフィールドを追加して流用します)
マスターテーブルから、氏名住所を、顧客テーブルへインポートし、重複を処理しておきます。(マスター側に住所氏名の計算フィールドを作っておけば、顧客テーブル側で対処できます)
マスターテーブルで、顧客No フィールドを追加し、ルックアップで自動入力します。(初期には再ルックアップが必要)
また、受注テーブルのデータもマスターテーブルからインポートして作っておきます。
まず、マスターテーブルとインポートテーブルは、伝票番号と明細番号でリレーションして置きます。
マスターテーブルからインポートテーブルへ、関連レコードへ移動し、対象外のみを表示、にすると、重複していないレコードのみが表示されます。
新規の顧客データを抜き出すために、インポートテーブルから顧客テーブルへ氏名住所をインポートし、顧客No を付与して置きます。
重複していないインポートレコードを、インポートテーブルからマスターテーブルへインポートします。
インポートした状態のままで、マスターテーブルから受注テーブルに、伝票番号と顧客番号をインポートします。
マスターテーブルで、全レコードを表示させれば、受注一覧となり、リピート回数が表示されます。
顧客テーブルのポータルには受注一覧がポータルで表示され、受注テーブルでは明細がポータルで表示されています。
その動きのサンプルです。
https://www.dropbox.com/s/wpj2rklszyti2 … 7.zip?dl=0
提示されているテーブルにメールがないので、この処理が必要でしたら、御自分で追加してください。
ただ、その処理を加えると、同一顧客が、名前とメールのみ、名前と住所のみで登録してきた時に、別顧客として扱われることになります。それは、貴方が提示しているスクリプトの中身と同じ動きになります。
Last edited by Shin (2017-11-17 14:16:27)
Offline
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 584.62 KiB (Peak: 601.52 KiB) ]