我正在嘗試編寫一些代碼來審計通過窗體所做的更改。我有工作要做這樣的功能:如何使用控件源的名稱從控件獲取值?
Function WriteChanges()
Dim f As Form
Dim c As Control
Dim user As String
Dim db As DAO.Database
Dim cnn As ADODB.Connection
Dim MySet As ADODB.Recordset
Dim tbld As TableDef
Dim recsource As String
Set f = Screen.ActiveForm
Set db = CurrentDb
Set cnn = CurrentProject.Connection
Set MySet = New ADODB.Recordset
recsource = f.RecordSource
Set tbld = db.TableDefs(recsource)
pri_key = fFindPrimaryKeyFields(tbld)
Debug.Print "pri_key: "; pri_key
user = Environ("username")
MySet.Open "Audit", cnn, adOpenDynamic, adLockOptimistic, adCmdTable
For Each c In f.Controls
Select Case c.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup
If c.Value <> c.OldValue Then
With MySet
.AddNew
![EditDate] = Now
![user] = user
![SourceTable] = f.RecordSource
![SourceField] = c.ControlSource
![BeforeValue] = c.OldValue
![AfterValue] = c.Value
.update
End With
End If
End Select
Next c
MySet.Close
Set MySet = Nothing
Set f = Nothing
Set db = Nothing
End Function
我使用的各種形式的更新前屬性此功能,它用的細節的變化,審計表中的值在每個控件。我還需要從主鍵字段獲取值以添加到審計表。我可以使用下面的代碼添加到窗體的記錄源中標識的主鍵的名稱:
Function fFindPrimaryKeyFields(tdf As TableDef) As String
Dim idx As Index
On Error GoTo HandleIt
For Each idx In tdf.Indexes
If idx.Primary Then
fFindPrimaryKeyFields = Replace(idx.Fields, "+", "")
GoTo OutHere
End If
Next idx
OutHere:
Set idx = Nothing
Exit Function
HandleIt:
Select Case Err
Case 0
Resume Next
Case Else
Beep
MsgBox Err & " " & Err.Description, vbCritical + vbOKOnly, "Error"
fFindPrimaryKeyFields = vbNullString
Resume OutHere
End Select
End Function
如何使用這個來從控制(文本框)的值具有確定的主鍵其控制源。
請原諒我的代碼中的任何愚蠢的錯誤,因爲我是一個相對的新手。預先感謝您的幫助。
感謝您的回覆。不幸的是,我從窗體上的所有三個文本框中獲取內容。這些是控件源(ID,Name1,Name2)窗體上唯一的三個控件(ID,Name1和Name2)。代碼的第一位正確地將主鍵字段標識爲ID,但是當我在下一個循環中使用debug.print primaryKeyValue時,我得到每個控件的值以及兩個空值。我不明白爲什麼我得到這個,因爲只有一個controlsource應該等於主鍵列名字符串 – AndyDudley
道歉我看你編輯你的答案,現在給了我正確的價值。出於某種原因,我多次添加debug.print primaryKeyValue,但我不認爲這會是一個問題。謝謝你的幫助! – AndyDudley
一個debug.print只能返回一個值。如果它多次返回,那是因爲你多次運行這段代碼。 –