PDA

Vollständige Version anzeigen : Kontrolle der Datensatzänderungen in einem Formular


erpel
27.08.2001, 23:42
<html><head><title>Kontrolle der Datensatzänderungen in einem Formular</title><meta name="author" content="andre graeser (andre.graeser@web.de)"><meta name="generator" content="Ulli Meybohms HTML EDITOR"></head><body text="#000000" bgcolor="#FFFFFF" link="#0000FF" alink="#FF0000" vlink="#00C0FF"><h1>Kontrolle der Datensatzänderungen in einem Formular</h1>
Dieser Artikel orientiert sich an einem vor knapp einem Jahr von mir in der msdn online library gefundenen und von Antonio Melo stammenden Artikel Gaining Control over a Form in Microsoft Access und ist als Erweiterung derart zu verstehen, daß die dort aufgezeigte Funktionalität in Form einer Klasse agclsControlOverForm implementiert wird. Leider habe ich diesen Original-Artikel selbst nach intensiver Suche nicht mehr finden können, so daß ich hier keine entsprechende Internetadresse angeben kann. Falls jemand bei der Suche mehr Glück hat, würde ich über eine diesbezügliche Nachricht an andre.graeser@web.de sehr dankbar sein.

<h2>Hinweise zum Gebrauch der Klasse agclsControlOverForm</h2>

Da die Klasse agclsControlOverForm die Event-Weitergabe mittels einer Referenz auf das zu kontrollierende Formular nutzt (Stichwort <code>Dim WithEvents ...</code>), müssen die beiden Formular-Eigenschaften

BeforeUpdate</li>
OnError</li>

auf "[event procedure]" gesetzt werden (das Schreiben entsprechender Event-Handler-Prozeduren ist nicht notwendig).

<h2>Code der Klasse agclsControlOverForm:</h2>


'### instructions for use ######################################################
'
'The following example code (of a form modul) illustrates the use of the
'class 'agclsControlOverForm' to gain control over record changes in a form.
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'Option Compare Database
'Option Explicit
'
'Dim ControlOverForm As New agclsControlOverForm
'
'Private Sub Form_Open(Cancel As Integer)
' ControlOverForm.Initialize Me
'End Sub
'
'
'Private Sub btn_SaveRecord_Click()
' ControlOverForm.SaveRecord
'End Sub
'
'Private Sub btn_DeleteRecord_Click()
' ControlOverForm.DeleteRecord
'End Sub
'
'Private Sub btn_CloseForm_Click()
' ControlOverForm.CloseForm
'End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
'This class has its origin in the article
'"Gaining Control over a Form in Microsoft Access" written by Antonio Melo,
'available in the "msdn online library"
'
'###############################################################################


Option Compare Database
Option Explicit

Private WithEvents frm As Form
Private flg_Form_BeforeUpdate_Cancel As Boolean


Public Sub Initialize(FormToControl As Form)
Set frm = FormToControl
flg_Form_BeforeUpdate_Cancel = True
End Sub


Private Sub frm_BeforeUpdate(Cancel As Integer)
Cancel = flg_Form_BeforeUpdate_Cancel 'test if saving is allowed
'the flag is 'False' only if the user forces the
'record saving explicite (procedure 'SaveRecord')

flg_Form_BeforeUpdate_Cancel = True 'prepare for next time
End Sub


Private Sub frm_Error(DataErr As Integer, Response As Integer)
Const ERR_REC_BEING_ED_CANT_BE_SAVED = 2169

'in case, the user closes form by the form's builtin close button ...
If DataErr = ERR_REC_BEING_ED_CANT_BE_SAVED Then
MsgBox ("The changes you've made will not be saved!")
Response = DATA_ERRCONTINUE
End If
End Sub


Public Sub CloseForm()
On Error GoTo Err_CloseForm

Dim flgCloseForm As Boolean
Dim MsgBoxResponse As VbMsgBoxResult

If frm.Dirty Then
MsgBoxResponse = MsgBox("You have changed data. " _
& "Do you want to close form without saving?", _
vbQuestion Or vbYesNo Or vbDefaultButton2)
flgCloseForm = (MsgBoxResponse = vbYes)

If flgCloseForm Then
flg_Form_BeforeUpdate_Cancel = True
DoCmd.Close acForm, frm.Name
End If
Else
DoCmd.Close acForm, frm.Name
End If

Exit_CloseForm:
Exit Sub
Err_CloseForm:
MsgBox Err.Description
Resume Exit_CloseForm
End Sub


Public Sub DeleteRecord()
On Error GoTo Err_DeleteRecord

If frm.Dirty Then
MsgBox ("You have changed the record. Deletion not allowed!")
Else
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70
End If

Exit_DeleteRecord:
Exit Sub
Err_DeleteRecord:
MsgBox Err.Description
Resume Exit_DeleteRecord
End Sub


Public Sub SaveRecord()
On Error GoTo Err_SaveRecord

If frm.Dirty Then

flg_Form_BeforeUpdate_Cancel = False 'allow save => frm_BeforeUpdate() will
'look at this flag

'The next code-line forces the record saving => the frm_Before_Update Event
'will be activated (further code after this code-line will be executed after
'the procedure 'frm_BeforeUpdate')
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
End If

Exit_SaveRecord:
Exit Sub
Err_SaveRecord:
MsgBox Err.Description
Resume Exit_SaveRecord
End Sub


<h2>Beispielhafter Code im Modul des zu kontrollierenden Formulars:</h2>


Option Compare Database
Option Explicit

Dim ControlOverForm As New agclsControlOverForm

Private Sub Form_Open(Cancel As Integer)
ControlOverForm.Initialize Me
End Sub


Private Sub btn_SaveRecord_Click()
ControlOverForm.SaveRecord
End Sub

Private Sub btn_DeleteRecord_Click()
ControlOverForm.DeleteRecord
End Sub

Private Sub btn_CloseForm_Click()
ControlOverForm.CloseForm
End Sub


In Hoffnung darauf, einen hilfreichen Artikel verfaßt zu haben

Andre Gräser, 27.08.2001

andre.graeser@web.de</body></html>