2017-09-14 73 views
0

我正在嘗試編寫一些代碼來審計通過窗體所做的更改。我有工作要做這樣的功能:如何使用控件源的名稱從控件獲取值?

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 

如何使用這個來從控制(文本框)的值具有確定的主鍵其控制源。

請原諒我的代碼中的任何愚蠢的錯誤,因爲我是一個相對的新手。預先感謝您的幫助。

回答

0

我不是100%肯定你想究竟是什麼,但如果你有字段的名稱,你可以使用以下命令:

Dim primaryKeyValue As Variant 
Dim primaryKeyColumnName As String 
primaryKeyColumnName = fFindPrimaryKeyFields(TableDefs!MyTable) 
Dim f as Form 
'Get the form somehow 

Dim c As Control 
On Error GoTo NextC 'Escape errors because lots of controls don't have a control source 
For Each c In f.Controls 
    If c.ControlSource = primaryKeyColumnName Then 
     primaryKeyValue = c.Value 
    End If 
NextC: 
Next c 
On Error GoTo 0 
+0

感謝您的回覆。不幸的是,我從窗體上的所有三個文本框中獲取內容。這些是控件源(ID,Name1,Name2)窗體上唯一的三個控件(ID,Name1和Name2)。代碼的第一位正確地將主鍵字段標識爲ID,但是當我在下一個循環中使用debug.print primaryKeyValue時,我得到每個控件的值以及兩個空值。我不明白爲什麼我得到這個,因爲只有一個controlsource應該等於主鍵列名字符串 – AndyDudley

+0

道歉我看你編輯你的答案,現在給了我正確的價值。出於某種原因,我多次添加debug.print primaryKeyValue,但我不認爲這會是一個問題。謝謝你的幫助! – AndyDudley

+0

一個debug.print只能返回一個值。如果它多次返回,那是因爲你多次運行這段代碼。 –

0

如果主鍵列的形式記錄的一部分源,你可以簡單地通過閱讀:

Debug.Print "PK value: " & f(pri_key) 

記錄源的每一列是在運行時的形式財產,獨立於是否存在具有相同名稱的控件。

注意:如果您有基於連接多個表的查詢的表單,則整個構造將停止工作。

+0

這也適用。謝謝 – AndyDudley

相關問題