Экспорт данных из Microsoft Access (VBA) с использованием набора записей без добавления к предыдущим документам
Я работаю над проектом группы в школе и должен иметь возможность экспортировать данные из таблицы Access в документ Excel, который отформатирован с определенными заголовками (для импорта Sage). У меня возникают проблемы с функцией «exportItems».
Каждый раз, когда я запускаю свой код, он создает повторяющиеся строки в excel. Например: при экспорте он экспортирует 1 элемент, который заказчик заказал. Если я снова экспортирую его в другое имя и местоположение файла, этот элемент будет дублирован, а документ excel содержит 2 экземпляра. Затем он становится 3, а затем 4, если я повторю эти шаги.
Любая помощь будет оценена по достоинству. Я чувствую, что это ошибка где-то в моей инструкции SQL Insert.
- access 2013 создать окно поиска в веб-форме с помощью макросов
- Как импортировать новые файлы в Access DB с существующим кодом VBA
- Сравнение строк в электронной таблице с записями в базе данных
- Использование коллекций в Access VBA
- Экспорт данных из Excel в Access - Ошибка: Аргумент не является необязательным
Private Sub cmdConfirmExport_Click() If Not IsNull(txtInputFile.Value) Or txtInputFile.Value = "" Then Dim exportID As Integer Dim insertOESQL, insertOEDSQL, FileName, DeleteSQL, nameInput, rsSQL As String exportID = Form_QuoteDetail.QuotesID nameInput = txtInputFile.Value exportOrders (exportID) ' To insert the order details and be able to get the line number, ' create a function similar to exportCommentsOE that will use a recordset to get the values for 'ORDUNIQ(QuotesID FK), ITEM(Vendor Item Num), DESC(Item Description), QTYORDERED(Quantity), QTYBACKORD(Quantity), 'UNITPRICE(Unit Price), UNITCOST(Unit Cost) ' Then with While (Not .EOF), Insert individual item records using rs.Fields([FieldName]). LINENUM ' will be added as a value from a counter that goes up by 32 until it reaches the end of the recordset. exportItems (exportID) exportCommentsOE (exportID) FileName = FolderSelection & "\" & "OE_" & nameInput & "_" & Format(Date, "yyyyMMdd") & ".xlsx" 'FileName = CurrentProject.Path & "\" & "OE_" & nameInput & "_" & Format(Date, "yyyyMMdd") & ".xlsx" DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Orders", FileName, True DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Order_Details", FileName, True DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Order_Detail_Lot_Numbers", FileName, True DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Order_Detail_Serial_Numbers", FileName, True DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Order_Payment_Schedules", FileName, True DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Order_Comments_Instructions", FileName, True MsgBox "Export Complete", vbOKOnly, "Success" DeleteSQL = "DELETE * FROM Orders WHERE NOT ORDUNIQ = " & exportID CurrentDb.Execute DeleteSQL DoCmd.Close Else MsgBox "You must input a file name.", vbOKOnly, "Invalid Input" End If End Sub Function exportItems(itemQuoteID As Integer) On Error GoTo exportError Dim rsSQL, rsINSERTSQL As String Dim rs As DAO.Recordset Dim rslineCount As Integer Dim rsORDUNIQ, rsQTYO, rsQTYBO As Integer Dim rsUP, rsUC As Currency Dim rsDesc, rsITEM, rsHC As String Set rs = Nothing rslineCount = 32 rsSQL = "SELECT [QuotesID FK], [Vendor Item Num], [Item Description], [Quantity], [Unit Price], [Unit Cost], [HASCOMMENT] FROM [Quote Detail]" _ & "WHERE [QuotesID FK] = " & itemQuoteID Set rs = CurrentDb.OpenRecordset(rsSQL) With rs .MoveLast .MoveFirst While (Not .EOF) rsORDUNIQ = .Fields("[QuotesID FK]") rsITEM = .Fields("[Vendor Item Num]") rsDesc = .Fields("[Item Description]") rsQTYO = .Fields("[Quantity]") rsQTYBO = .Fields("[Quantity]") rsUP = .Fields("[Unit Price]") rsUC = .Fields("[Unit Cost]") rsHC = .Fields("[HASCOMMENT]") rsINSERTSQL = "INSERT INTO Order_Details(ORDUNIQ, [LINENUM], [ITEM], [DESC], [QTYORDERED], [QTYBACKORD], [UNITPRICE], [UNITCOST], [COMMINST])" _ & "VALUES (" & rsORDUNIQ & "," & rslineCount & ", '" & rsITEM & "', '" & rsDesc & "'," & rsQTYO & "," & rsQTYBO & "," & rsUP & "," & rsUC _ & ", '" & rsHC & "')" CurrentDb.Execute rsINSERTSQL rslineCount = rslineCount + 32 .MoveNext Wend .Close End With Set rs = Nothing ExitFunction: Set rs = Nothing Exit Function exportError: MsgBox "An error has occured during export of items." Resume ExitFunction End Function
- Импорт таблицы Excel в Access с использованием DoCmd.TransferSpreadsheet создает дубликаты
- Экспорт из ограничения доступа к Excel
- Как передать имя таблицы в sql-запрос в VBA
- Excel VBA для запуска Access Macro - проблема с связанной таблицей
- Создание ListObjects - поздняя привязка - от доступа к Excel
- Доступ к VBA: как вернуть путь к файлу, который вы просматривали
- Чтение и запись таблицы базы данных доступа в python
- Ошибка A2K 3011 в методе TransferSpreadsheet
Выяснил причину. Фактический оператор SQL Insert продолжал создавать записи в БД. Все это будет экспортировано в электронную таблицу Excel, так как она выглядит «добавлена» к предыдущему документу.
Решение заключалось только в том, чтобы делать таблицы (в качестве примера у Ордеров была бы параллельная таблица под названием Orders_Export) и использовать ее как среднего человека. Команда INSERT вставляет данные в обе таблицы, и экспорт будет экспортировать данные только из таблицы Orders_Export. Затем была удалена таблица Orders_Export, но все данные остались в таблице Orders. Это была моя работа. Спасибо всем, что помогло!