PDA

Vollständige Version anzeigen : Laufzeitfehler 438


Pittchen
14.08.2001, 11:51
Hey ihr alle,

ich möchte vor dem Datensatzwechsel prüfen, ob alle Felder in einem Formular ausgefüllt sind. Falls das nicht der Fall ist, sollen teilweise eingegebene Daten verworfen werden und der Anwender soll wechseln können; dazu folgender Code:

Private Sub Form_Current()
Dim ctl As Control
Dim frm As Form

'die Objektvariable frm wird auf das aktuelle Formular gesetzt
Set frm = Me


' Controls-Auflistung durchlaufen.
For Each ctl In frm.Controls
' Prüfen, ob das Steuerelement ein Textfeld ist.
If ctl.ControlType = acTextBox And IsNull(ctl.Value) Then
Me.Undo
End If
Next ctl

End Sub

Als Ergebnis erhalte ich die Fehlermeldung "Laufzeitfehler 438; Das Objekt unterstützt diese Eigenschaft oder Methode nicht; markiert im Testmodus ist die if-Zeile; so, what's to do?

Gruß Pittchen

Stema
14.08.2001, 11:56
Hallo Pittchen,

nicht jedem Control kann man den Wert NULL zuweisen. Versuch es mal mit einer geschachtelten If-Anweisung:
If ctl.ControlType = acTextBox then
if IsNull(ctl.Value) Then
Me.Undo
End If
end if

sekoe
14.08.2001, 11:57
So sollte es klappen:
Dim ctl As Control
Dim frm As Form

'die Objektvariable frm wird auf das aktuelle Formular gesetzt
Set frm = Me


' Controls-Auflistung durchlaufen.
For Each ctl In frm.Controls
' Prüfen, ob das Steuerelement ein Textfeld ist.
If ctl.ControlType = acTextBox Then
If IsNull(ctl.Value) Then
Me.Undo
Exit For
End If
End If
Next ctl

Pittchen
14.08.2001, 13:24
Hey stema, hey sekoe,
danke für eure Vorschläge; jetzt bekomme ich zwar keinen Laufzeitfehler mehr, aber der unvollständige Datensatz wird gespeichert. Beide Varianten habe ich ausprobiert.
Gruß Pittchen

Stema
14.08.2001, 14:38
Hallo Pittchen,

hier ein kurzer Auszug aus der Hilfe.
Remarks

If the Undo method is applied to a form, all changes to the current record are lost. If the Undo method is applied to a control, only the control itself is affected.
This method must be applied before the form or control is updated. You may want to include this method in a form's BeforeUpdate event or in a control's Change event.
The Undo method offers an alternative to using the SendKeys statement to send the value of the ESC key in an event procedure.

Demnach ist das Ereignis Form_OnCurrent zu spät. Setze das mal ins Ereignis BeforeUpdate.

Pittchen
15.08.2001, 06:55
Dank dir Stema,
werd ich mal probieren und wenn's funkt oder auch nicht, meld ich mich hier wieder.

Gruß Pittchen

Pittchen
15.08.2001, 12:00
Hey Stema,
Der Dank aller zukünftigen Access-Programmierer wird dir nachlaufen; genau das Wars; hier der komplette Code:

Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim ctl As Control
Dim frm As Form

'die Objektvariable frm wird auf das aktuelle Formular gesetzt
Set frm = Me

' Controls-Auflistung durchlaufen.
For Each ctl In frm.Controls
' Prüfen, ob das Steuerelement ein Textfeld ist.
If ctl.ControlType = acTextBox Then
If IsNull(ctl.Value) Then
Me.Undo
Exit For
End If
End If
Next ctl

End Sub
Tausend und zwei Danke
Gruß Pittchen