2015-09-07 79 views
1

我是組織中票務系統的應用程序管理員。 我們正在添加一個新客戶,並且需要將他們的客戶記錄導入到我們的系統中。從CSV導入更新現有訪問記錄,原生到MS Access或VB.NET中

但是,我們被拒絕訪問直接從直接數據庫連接獲取這些記錄。

我們僅限於輸入他們的票務系統,並將現有記錄導出到CSV文件。

爲了使與我們的系統這項工作,我服用這些CSV的和將它們輸入一個MS Access數據庫,我們的系統將讀取並從我們的售票系統上導入/更新記錄。

但是,我無法找到一個方法來更新從CSV中的記錄MS Access數據庫中的記錄。

我可以將記錄導入表中,但它會跳過任何已存在的記錄(客戶數據中包含的字段被用作唯一標識符/主鍵來區分新的/現有的記錄)。

任何已經包含此主鍵的記錄都會被略過,它不會更新包含該鍵的ms訪問數據庫中的記錄。

除了創建基本的表格和表格之外,我對MS Access沒有多少經驗;這超出了我的正常工作範圍。

我需要找到一種方法來獲取包含可能已經或可能不在此ms訪問數據庫中的記錄的CSV文件,並創建新記錄(如果不包含在CSV中)或更新記錄(如果它們包含在CSV。

這並不一定關係如何做到這一點,我可以實現這個用vb.net或宏,如果你能提供的方式有兩種做到這一點。

我知道這是有點偏離指導原則,我試圖找到方法來做到這一點我自己並沒有能夠拿出任何代碼來測試和發佈作爲一個起點(我的歉意)。

+1

讀取CSV到一個DataTable,那麼您可以更新或根據需要插入 – Plutonix

+0

因此,將csv導入到單獨的表中,然後呢?運行更新查詢?我不確定如何利用更新查詢更新來自原始表的記錄,使用此新表中的記錄... – schizoid04

+1

它可能是數據表或數據庫中的實際表。像稅務記錄這樣的描述從來都不是一個適合所有人的查詢;總有一些特別的地方。但是,是的,一些基本上是INSERT和一些更新查詢 – Plutonix

回答

2

本質上,您將不得不執行一系列操作查詢:使用過濾器和連接的追加,更新和刪除。您可以查詢保存爲存儲的查詢,並通過DoCmd.OpenQuery給他們打電話,也可以在VBA寫他們作爲字符串傳遞到DoCmd.RunSQL sqlStatementCurrentDb.Excecute sqlStatement

IMPORT

首先,使用DoCmd.TransferText acImportDelim導入CSV到一個臨時表。確保在導入之前從臨時表中清除先前的csv數據。

DELETE FROM tempTable; 

UPDATE

然後,更新臨時和現場表,但條件之間存在的記錄在現場的桌面現有客戶。在訪問SQL,連接可以在更新查詢中使用,但你可能會碰到不可更新查詢:

UPDATE tempTable INNER JOIN liveTable 
ON tempTable.CustomerID = liveTable.CustomerID 
SET liveTable.Col1 = tempTable.Col1, 
    liveTable.Col2 = tempTable.Col2, 
    liveTable.Col3 = tempTable.Col3, 
    ... ; 

另外,繞過不可更新查詢:

UPDATE liveTable 
SET liveTable.Col1 = DLookUp("Col1", "tempTable", "CustomerID=" & liveTable.CustomerID), 
    liveTable.Col2 = DLookUp("Col2", "tempTable", "CustomerID=" & liveTable.CustomerID), 
    liveTable.Col3 = DLookUp("Col3", "tempTable", "CustomerID=" & liveTable.CustomerID), 
    ... 
WHERE CustomerID IN 
    (SELECT CustomerID FROM tempTable); 

一旦完成,清理出記錄剛剛從臨時表更新(不帶附加步衝突和重複項):

DELETE FROM tempTable 
WHERE CustomerID IN 
     (SELECT CustomerID FROM liveTable); 

APPE ND

最後,追加從臨時表中的新記錄到現場表,但條件不活表的客戶,你可以用LEFT JOIN ... NULL做:

INSERT INTO (Col1, Col2, Col3 ...) 
SELECT Col1, Col2, Col3 ... 
FROM tempTable LEFT JOIN liveTable 
ON tempTable.CustomerID = liveTable.CustomerID 
WHERE liveTable.CustomerID Is Null;