簡體   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