[英]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.