【问题标题】:MS Access multiple table updates from flat excelMS Access 来自平面 excel 的多个表更新
【发布时间】:2020-07-13 19:59:54
【问题描述】:

我正在尝试做一个我认为相对常见的任务。我有一个平面 Excel 文件,我从中创建了一个规范化的 Access DB。现在我想接收具有相同格式的新 Excel 文件并填充各种主数据表和事务表。结构与此类似:Excel 文件包含 Customer、Product 和 Quantity 列。 Access DB 具有客户(ID、Customer_Name 和 Address 列)和 Product(ID、Product_Name 和 Color 列)的主数据表。我想在新的 Excel 文件中搜索新客户和新产品,然后将它们添加到各自的主数据表中,并为它们自动分配一个新的增量 ID 号。然后我想在 Orders 表中创建与 Excel 文件中的行匹配但使用自动分配的 ID 的记录。很明显,这里的重点是保持规范化结构,同时通过导入其他地方生成的 Excel 工作表来自动化构建数据库的任务。我疯了还是这种普遍现象?请帮忙!如果可以,你就是最棒的!

【问题讨论】:

  • Excel 文件不明确 -- 它有客户名称、客户 ID、客户地址还是客户电话?产品同上..???如果 Excel 有这些“名称”,错字和拼写错误的几率是多少?创建新行然后变成自动化垃圾。 Excel 似乎没有客户地址或产品颜色,不足以创建正确的行。我们需要更全面地了解您所面临的系统问题,以便推荐解决方案。将数据库在线放在当前正在输入 excel 的每个人的指尖可能是一个更好的解决方案。
  • 谢谢。我想我对“订单”表的类比更为笼统。如果值不存在,我首先想从 Excel 文件中获取列并将它们放在不同的表中。

标签: sql excel database ms-access-2010


【解决方案1】:

这样做的一种方法是链接到 Excel 文件,使用不匹配查询来查看哪些记录是新的,然后根据需要添加它们。这样的事情应该会让你指向正确的方向:

Sub sGetCustomerData(strXLFile As String)
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Dim rsCustomer As DAO.Recordset
    Dim rsAdd As DAO.Recordset
    Dim strSQL As String
    DoCmd.DeleteObject acTable, "tblTemp"
    DoCmd.TransferSpreadsheet acLink, acSpreadsheetTypeExcel12Xml, "tblTemp", strXLFile, True
    Set db = DBEngine(0)(0)
    strSQL = "SELECT T.Customer " _
        & " FROM tblTemp AS T LEFT JOIN tblCustomer AS C ON T.Customer=C.Customer_Name " _
        & " WHERE C.Customer_Name IS NULL;"
    Set rsCustomer = db.OpenRecordset(strSQL)
    If Not (rsCustomer.BOF And rsCustomer.EOF) Then
        Set rsAdd = db.OpenRecordset("SELECT * FROM tblCustomer WHERE 1=2;")
        Do
            With rsAdd
                .AddNew
                !Customer_Name = rsCustomer!Customer
                .Update
            End With
            rsCustomer.MoveNext
        Loop Until rsCustomer.EOF
    End If
sExit:
    On Error Resume Next
    rsAdd.Close
    rsCustomer.Close
    Set rsAdd = Nothing
    Set rsCustomer = Nothing
    Set db = Nothing
    DoCmd.DeleteObject acTable, "tblTemp"
    Exit Sub
E_Handle:
    Select Case Err.Number
        Case 7874   '   temp table not found to delete
            Resume Next
        Case 7889   '   file does not exist
        Case Else
        MsgBox Err.Description & vbCrLf & vbCrLf & "sGetCustomerData", vbOKOnly + vbCritical, "Error: " & Err.Number
    End Select
    Resume sExit
End Sub

您可能会遇到 Excel 文件中的数据被复制且拼写略有不同的问题 - 例如“Mr J Smith”/“Mr J. Smith”/“Mr John Smith”。

问候,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多