问题
I am the application administrator for a ticketing system at my organization. We're adding a new client, and need to import their customer records into our system.
However, we have been denied access to simply grab these records from a direct database connection.
We are limited to entering their ticketing system, and running an export of the existing records to a CSV file.
In order to make this work with our system, I'm taking these CSV's and entering them into an MS Access database, which our system will read and import/update records on our ticketing system from.
However, I cannot find a way to update records in the MS Access db from records in the CSV.
I can import records into a table, but it skips any records that already exist (There is a field included in the customer data that is being used as a unique identifier / primary key to distinguish new / existing records).
Any records which already contain this primary key are simply skipped, it does not update the records in the ms access db containing that key.
I do not have much experience with MS Access other than creating basic tables and forms; it's outside my normal scope of work.
I need to find a way to take a CSV file containing records that may or may not already be in this ms access db, and create new records if not contained within the CSV, or update records if they are contained in the CSV.
It doesn't necessarily matter how this is done, I could implement this using vb.net or a macro, if you could provide a way to do this with either.
I understand that this is a bit off-guidelines, I tried to find ways to do this on my own and haven't been able to come up with any code to test out and post as a starting point (my apologies).
回答1:
Essentially, you will have to do a series of action queries: append, update, and delete that use filters and joins. You can save queries as stored queries and call them by DoCmd.OpenQuery
, or you can write them in VBA as strings to be passed into DoCmd.RunSQL sqlStatement
or CurrentDb.Excecute sqlStatement
IMPORT
First, import the CSV using DoCmd.TransferText acImportDelim
into a temporary table. Be sure to clean out previous csv data from temp table prior to import.
DELETE FROM tempTable;
UPDATE
Then, update existing records between temp and live table but condition for existing customers in live table. In Access SQL, joins can be used in update queries but you may run into not updateable queries:
UPDATE tempTable INNER JOIN liveTable
ON tempTable.CustomerID = liveTable.CustomerID
SET liveTable.Col1 = tempTable.Col1,
liveTable.Col2 = tempTable.Col2,
liveTable.Col3 = tempTable.Col3,
... ;
Alternatively, to bypass non-updateable query:
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);
Once done, clean out records just updated from temp table (to not conflict with append step and duplicate entries):
DELETE FROM tempTable
WHERE CustomerID IN
(SELECT CustomerID FROM liveTable);
APPEND
Finally, append new records from temp table into live table but condition for customers NOT in live table which you can do with the 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;
来源:https://stackoverflow.com/questions/32440734/update-existing-access-records-from-csv-import-native-to-ms-access-or-in-vb-ne