best way to 'secure'/lock data on forms?

J

Jerome

Hi,

What would be the best way to secure data on forms? So that no one
accidentally erases or modifies a record.

I thought about using 'Edit', 'Save', 'Cancel', 'New' buttons.
But how would I mostly effiently code this?

I tried to use AllowEdits etc, but then my dropdown list used to select
records doesn't work anymore. I would have to manually lock and unlock
all control on my forms?? Or is there a better way?

Thanks a lot,

Jerome
 
A

Allen Browne

Locking/unlocking all the bound controls is the most flexible approach.

Paste the funtion below into a standard module, and you can use it with any
form. Pass in: a reference to your form, True to lock or False to unlock,
and then a list of controls not to lock (if any).

First, it saves any edits in progress. Then it loops through the controls on
your form, setting the Locked property except for: controls that don't have
a Control Source (lines, labels, buttons in an option group, etc), controls
that are unbound or bound to an expression, and those named in your
exception list.

If it finds a subform, the function calls itself recursively to lock/unlock
those as well. If you don't want to set the Locked property of the controls
in your subform, name it in the exception list.

Example to lock all bound controls except for Combo31 and the controls in
subform Sub1:
Call LockBoundControls(Me, True, "Combo31", "Sub1")

Replace the calls to LogError() with your own error handler, or use this
one:
http://allenbrowne.com/ser-23a.html

HTH.

----------------------code begins-------------------
Public Const conMod = "ajbLockBound" 'Name of your module, for the error
handler.
Public Function LockBoundControls(frm As Form, bLock As Boolean, ParamArray
avarExceptionList())
On Error GoTo Err_Handler
'Purpose: Lock the bound controls and prevent deletes on the form any
its subforms.
'Arguments frm = the form to be locked
' bLock = True to lock, False to unlock.
' avarExceptionList: Names of the controls NOT to lock
(variant array of strings).
'Usage: Call LockBoundControls(Me. True)
Dim ctl As Control 'Each control on the form
Dim lngI As Long 'Loop controller.
Dim bSkip As Boolean

'Save any edits.
If frm.Dirty Then
frm.Dirty = False
End If
'Block deletions.
frm.AllowDeletions = Not bLock

For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox,
acOptionButton, acToggleButton
'Lock/unlock these controls if bound to fields.
bSkip = False
For lngI = LBound(avarExceptionList) To
UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If HasProperty(ctl, "ControlSource") Then
If Len(ctl.ControlSource) > 0& And Not ctl.ControlSource
Like "=*" Then
If ctl.Locked <> bLock Then
ctl.Locked = bLock
End If
End If
End If
End If

Case acSubform
'Recursive call to handle all subforms.
bSkip = False
For lngI = LBound(avarExceptionList) To
UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If Len(Nz(ctl.SourceObject, vbNullString)) > 0& Then
ctl.Form.AllowDeletions = Not bLock
ctl.Form.AllowAdditions = Not bLock
Call LockBoundControls(ctl.Form, bLock)
End If
End If

Case acLabel, acLine, acRectangle, acCommandButton, acTabCtl,
acPage, acPageBreak, acImage, acObjectFrame
'Do nothing

Case Else
'Includes acBoundObjectFrame, acCustomControl
Debug.Print ctl.Name & " not handled on " & conMod & " at " &
Now()
End Select
Next

Exit_Handler:
Set ctl = Nothing
Exit Function

Err_Handler:
Call LogError(Err.Number, Err.Description, conMod & "LockBoundControls")
Resume Exit_Handler
End Function

Public Function HasProperty(obj As Object, strPropName As String) As Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant

On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function
----------------------code ends-------------------
 
J

Jerome

Thanks a lot!

Allen said:
Locking/unlocking all the bound controls is the most flexible approach.

Paste the funtion below into a standard module, and you can use it with any
form. Pass in: a reference to your form, True to lock or False to unlock,
and then a list of controls not to lock (if any).

First, it saves any edits in progress. Then it loops through the controls on
your form, setting the Locked property except for: controls that don't have
a Control Source (lines, labels, buttons in an option group, etc), controls
that are unbound or bound to an expression, and those named in your
exception list.

If it finds a subform, the function calls itself recursively to lock/unlock
those as well. If you don't want to set the Locked property of the controls
in your subform, name it in the exception list.

Example to lock all bound controls except for Combo31 and the controls in
subform Sub1:
Call LockBoundControls(Me, True, "Combo31", "Sub1")

Replace the calls to LogError() with your own error handler, or use this
one:
http://allenbrowne.com/ser-23a.html

HTH.

----------------------code begins-------------------
Public Const conMod = "ajbLockBound" 'Name of your module, for the error
handler.
Public Function LockBoundControls(frm As Form, bLock As Boolean, ParamArray
avarExceptionList())
On Error GoTo Err_Handler
'Purpose: Lock the bound controls and prevent deletes on the form any
its subforms.
'Arguments frm = the form to be locked
' bLock = True to lock, False to unlock.
' avarExceptionList: Names of the controls NOT to lock
(variant array of strings).
'Usage: Call LockBoundControls(Me. True)
Dim ctl As Control 'Each control on the form
Dim lngI As Long 'Loop controller.
Dim bSkip As Boolean

'Save any edits.
If frm.Dirty Then
frm.Dirty = False
End If
'Block deletions.
frm.AllowDeletions = Not bLock

For Each ctl In frm.Controls
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox,
acOptionButton, acToggleButton
'Lock/unlock these controls if bound to fields.
bSkip = False
For lngI = LBound(avarExceptionList) To
UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If HasProperty(ctl, "ControlSource") Then
If Len(ctl.ControlSource) > 0& And Not ctl.ControlSource
Like "=*" Then
If ctl.Locked <> bLock Then
ctl.Locked = bLock
End If
End If
End If
End If

Case acSubform
'Recursive call to handle all subforms.
bSkip = False
For lngI = LBound(avarExceptionList) To
UBound(avarExceptionList)
If avarExceptionList(lngI) = ctl.Name Then
bSkip = True
Exit For
End If
Next
If Not bSkip Then
If Len(Nz(ctl.SourceObject, vbNullString)) > 0& Then
ctl.Form.AllowDeletions = Not bLock
ctl.Form.AllowAdditions = Not bLock
Call LockBoundControls(ctl.Form, bLock)
End If
End If

Case acLabel, acLine, acRectangle, acCommandButton, acTabCtl,
acPage, acPageBreak, acImage, acObjectFrame
'Do nothing

Case Else
'Includes acBoundObjectFrame, acCustomControl
Debug.Print ctl.Name & " not handled on " & conMod & " at " &
Now()
End Select
Next

Exit_Handler:
Set ctl = Nothing
Exit Function

Err_Handler:
Call LogError(Err.Number, Err.Description, conMod & "LockBoundControls")
Resume Exit_Handler
End Function

Public Function HasProperty(obj As Object, strPropName As String) As Boolean
'Purpose: Return true if the object has the property.
Dim varDummy As Variant

On Error Resume Next
varDummy = obj.Properties(strPropName)
HasProperty = (Err.Number = 0)
End Function
----------------------code ends-------------------
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top