Как вставить «весь» набор записей DAO в таблицу с VBA - PullRequest
6 голосов
/ 27 июля 2011

У меня есть набор записей DAO, который создается отлично, и я могу перенести записи из набора в таблицу, это делается построчно и работает хорошо, но я передаю большое количество данных одновременно, так что это может занятьочень долгое время строка за строкой.

Есть ли способ передать ВЕСЬ набор записей за один раз, а не строка за строкой

Ниже приведен текущий используемый код -

Dim SendE1 As DAO.Recordset

Set SendE1 = CurrentDb.OpenRecordset("SELECT TBL_ImportTable.* FROM TBL_ImportTable", dbOpenDynaset)

SendE1.MoveLast

Do Until SendE1.EOF

sqlinsert = "INSERT INTO TBL_E1Jobs (StartDate, StartTime, EndDate, EndTime, Location, UserID, WorkStationID, DocumentNumber, E1Shift, OperSeq, Facility, AdjustedforShifts, WeekNum)" & _
" VALUES ('" & SendE1("StartDate") & "', '" & SendE1("StartTime") & "', '" & SendE1("EndDate") & "', '" & SendE1("EndTime") & "', '" & SendE1("Location") & "', '" & SendE1("UserID") & "', '" & SendE1("WorkstationID") & "', '" & SendE1("DocumentNumber") & "', '" & SendE1("E1Shift") & "', '" & SendE1("OperSeq") & "', '" & SendE1("Facility") & "', '" & SendE1("AdjustedforShifts") & "', '" & SendE1("WeekNum") & "') "

DoCmd.RunSQL (sqlinsert)

SendE1.MoveNext

Loop


SendE1.Close
Set SendE1 = Nothing

Ответы [ 2 ]

7 голосов
/ 27 июля 2011

@ cularis правильный.Правильный способ сделать это - запрос SQL.Прочитав ваши комментарии к его ответу, вы можете предпринять несколько шагов, чтобы избежать уничтожения данных, которые не были скопированы:

Dim db As DAO.Database, RecCount As Long

'Get the total number of records in your import table to compare later
RecCount = DCount("*", "TBL_ImportTable")

'This line is IMPORTANT! each time you call CurrentDb a new db object is returned
'  that would cause problems for us later 
Set db = CurrentDb

'Add the records, being sure to use our db object, not CurrentDb
db.Execute "INSERT INTO TBL_E1Jobs (StartDate, StartTime, ..., WeekNum) " & _
           "SELECT StartDate, StartTime, ..., WeekNum " & _
           "FROM TBL_ImportTable", dbFailOnError

'db.RecordsAffected now contains the number of records that were inserted above
'  since CurrentDb returns a new db object, CurrentDb.RecordsAffected always = 0
If RecCount = db.RecordsAffected Then
    db.Execute "DELETE * FROM TBL_ImportTable", dbFailOnError
End If

Обратите внимание, что если вы выполняете эти запросы в связанных таблицах ODBC,потребуется включить параметр dbSeeChanges (т. е. dbFailOnError + dbSeeChanges).

2 голосов
/ 27 июля 2011

Не DAO, а решение SQL, которое делает то, что вам нужно:

INSERT INTO TBL_E1Jobs  (StartDate, StartTime, EndDate ...) 
SELECT StartDate, StartTime, EndDate ... FROM TBL_ImportTable

INSERT INTO ... SELECT MSDN

...