繁体   English   中英

在 Access VBA SQL 中更新链接表时向 Access 表添加新记录

[英]Adding new records to Access table on an update to a linked table in Access VBA SQL

我有两个表(skillsMatrix),另一个表是(elementTree),在表skillsMatrix中有列[mediumElement],[ID],mediumElement是表二中mediumElements的查找下拉列表。 我想编写一个宏来更新技能矩阵表以添加新记录“名称”、“新主题”、“”,并且在将新 mediumElement 添加到 elementTree 时不重复任何其他记录。

表:技能矩阵

ID 员工 中元 完成日期
自动编号 戴夫 步行 2020 年 10 月 27 日

表:元素树

ID 中元
26 步行
27 跑步

我希望技能矩阵表在运行代码后看起来像这样

ID 员工 中元 完成日期
自动编号 戴夫 步行 2020 年 10 月 27 日
自动编号 戴夫 跑步

我尝试了以下方法来解决构建逻辑的问题。 以下打印出 RS 始终以 1 开头,ME 以元素树中 mediumElement 的正确 ID 开头。
rs
1

26
rs
2

27
rs
3

28
rs
4

29
rs
5

30
rs
6

31
rs
7

32
rs
8

33
rs
9

34
rs
10

35

Dim db                    As DAO.Database
Dim rs                    As DAO.Recordset
Dim mediumElements        As DAO.Recordset
Dim employeeTable         As DAO.Recordset
Dim strSQL                As String
Dim strSQLName            As String
Dim strSQLintegrityCheck    As String
Dim idValue     As Long
Dim recordExists          As Boolean
If Me.Dirty = True Then Me.Dirty = False 'Save any unsaved data
Set db = CurrentDb
strSQLName = "SELECT employeeTable.ID, employeeTable.[Employee Name] FROM employeeTable WHERE (((employeeTable.[Employee Name])=""" & Me.employeeName & """));"
Set employeeTable = db.OpenRecordset(strSQLName)
idValue = employeeTable.Fields("ID")
Debug.Print (idValue)
strSQLintegrityCheck = "Select skillsMatrix.employee, skillsMatrix.mediumElement From skillsMatrix Where skillsMatrix.employee =  " & idValue & ""
Set rs = db.OpenRecordset("skillsMatrix")
strSQL = "Select elementTree.[ID], elementTree.[mediumElement] From elementTree  Where  ( elementTree.plantPosition = " & Me.jobPosition & ")"
'Debug.Print strSQL
Set mediumElements = db.OpenRecordset(strSQL)
Debug.Print employeeTable.Fields("ID")
If Not mediumElements.BOF And Not mediumElements.EOF Then
    mediumElements.MoveFirst
    rs.MoveFirst
    While (Not mediumElements.EOF)
       Debug.Print ("rs")
       Debug.Print rs.Fields("mediumElement").Value
       Debug.Print ("ME")
       Debug.Print mediumElements.Fields("id")
        If (rs![employee] <> employeeTable.Fields("ID") And rs![mediumElement] <> mediumElements.Fields("ID")) Then
             With rs
                .AddNew
                ![employee] = employeeTable.Fields("ID")
                ![mediumElement] = mediumElements.Fields("ID")
                .Update
            End With
         End If
       rs.MoveNext
       mediumElements.MoveNext
    Wend
End If
rs.Close
Set rs = Nothing
Set mediumElements = Nothing
Set employeeTable = Nothing

由于 rs.Fields("mediumElement") 没有给出我期望的正确值,因此没有任何事情发生/错误的事情发生。 而不是 rs.[mediumElement] 显示 elementTree 表中元素的查找 ID,它始终显示 1 到 RS 中 rs.Fields("mediumElement") 的记录数。 有一个员工表,ID 保存在技能矩阵中。 尽管我在建立连接时使用了查找向导,但这可能是问题所在。 我为我糟糕的白话道歉,我很陌生,SQL。

我不希望所有员工都使用关联的新元素进行更新。 该代码是由按钮按下控制的子程序,并且在该表单上选择要更新的员工,并使用控件employeeName

编辑:关于插入 Select 的建议

以下用于将 mediumElements 添加到技能矩阵表中,具体取决于它们是否存在于用户中。 有没有办法将员工姓名也添加到具有相同插入的技能矩阵表中?


Dim sqlString As String
Dim name As String
Dim strSQLName As String
Dim db                    As DAO.Database




Set db = CurrentDb
Dim employeeTable As DAO.Recordset


strSQLName = "SELECT employeeTable.ID, employeeTable.[Employee Name] FROM employeeTable WHERE (((employeeTable.[Employee Name])=""" & Me.employeeName & """));"
    Set employeeTable = db.OpenRecordset(strSQLName)
    idValue = employeeTable.Fields("ID")

    Debug.Print (name)
sqlString = "INSERT INTO skillsMatrix (mediumElement)" _
            & "SELECT elementTree.ID FROM elementTree " _
            & "WHERE NOT EXISTS(SELECT * FROM skillsMatrix Where skillsMatrix.mediumElement = elementTree.ID AND skillsMatrix.employee = " & idValue & " ) "
            
   DoCmd.RunSQL sqlString
End Sub


如果通过表格上的 combobox 选择员工,则无需打开记录集即可获取员工 ID。 EmployeeID 应该是 combobox 的隐藏列,combobox 应该将其作为其值。

idValue = Me.employeeName

如果员工 ID 在表单上不可用,则仍然不需要记录集。 使用 DLookup。
idValue = DLookup("ID", "employeeTable", "[Employee Name]='" & Me.employeeName & "'")

在 INSERT 子句中包含员工字段并连接 idValue 以在 elementTree 子句的 SELECT 中生成计算字段。

sqlString = "INSERT INTO skillsMatrix (employee, mediumElement) " _
            & "SELECT " & idValue & " AS Emp, elementTree.ID FROM elementTree " _
            & "WHERE NOT EXISTS(SELECT * FROM skillsMatrix WHERE skillsMatrix.mediumElement = elementTree.ID AND skillsMatrix.employee = " & idValue & " ) "

如果将employee 和mediumElement 定义为表中的复合索引,则实际上不需要WHERE 条件,因为不允许重复对。 我不知道这个 WHERE 标准是否会减慢或提高性能。

如果可以从表单中捕获新元素 ID,请简化代码:

sqlString = "INSERT INTO skillsMatrix (employee, mediumElement) " _
            & "VALUES(" & idValue & "," & idElement & ")"

使用CurrentDb.Execute而不是DoCmd.RunSQL并且不会收到警告弹出窗口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM