"Nur Listeneinträge=JA" wird nicht beachtet bei VBA rs![Feld]=3

12/02/2016 - 11:43 von Michael Hessler | Report spam
Hallo,

ich habe zwei Tabellen
* tblA mit 2 Datensàtzen: Felder "ID" und "Bez"
ID Bez
1 1
2 2

* tblB mit Feldern "ID" und "tt"
Für das Feld "tt" ist die Datenherkunft definiert mit
SELECT tblA.Bez FROM tblA;
Nur Listeneintràge steht auf JA.

Öffne ich nun die Tabelle tblB wird erwartungsgemàß ein Eintrag von "9"
in das Feld "tt" verhindert.

Folgender Code schreibt aber beliebige Werte in "tt":
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("tblB")
rs.AddNew
rs![tt] = 9
rs.Update

Was ist hier faul? Wie kann ich das Eintrage nicht zulàssiger Werte
verhindern oder mindestens eine Fehlermeldung ausgeben?

Danke
Michael
 

Lesen sie die antworten

#1 Karl Donaubauer
12/02/2016 - 13:48 | Warnen spam
schrieb Michael Hessler:

ich habe zwei Tabellen
* tblA mit 2 Datensàtzen: Felder "ID" und "Bez"
ID Bez
1 1
2 2

* tblB mit Feldern "ID" und "tt"
Für das Feld "tt" ist die Datenherkunft definiert mit
SELECT tblA.Bez FROM tblA;
Nur Listeneintràge steht auf JA.

Öffne ich nun die Tabelle tblB wird erwartungsgemàß ein Eintrag von "9"
in das Feld "tt" verhindert.

Folgender Code schreibt aber beliebige Werte in "tt":
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("tblB")
rs.AddNew
rs![tt] = 9
rs.Update

Was ist hier faul? Wie kann ich das Eintrage nicht zulàssiger Werte
verhindern oder mindestens eine Fehlermeldung ausgeben?



Deine Einschrànkung bezieht sich nur auf die Eingabe über das
Kombinationsfeld in der Datenansicht der Tabelle (sollte man übrigens
eher nicht verwenden). Sie bezieht sich damit nur auf diese Ansicht =
Bildschirmmaske nicht auf das dahinterliegende Feld bzw. die Tabelle selber.

Die Eingabe von 9 ist daher nicht nur per VBA möglich sondern z.B. auch
über ein Steuerelement in einem Formular, das nicht die Einstellungen
des Kombis wiederholt.

Ich bin nicht ganz sicher, ob man sowas (ab Access 2007) mit einem
Datenmakro auf Tabellenebene einstellen kann, glaube aber, dass die
keinen Bezug auf andere Tabellen zulassen.

Was seit jeher geht, ist ein CHECK-Constraint. Der hat allerdings ein
paar Nachteile:

- man kann ihn nur per VBA und ADO setzen
- er ist an der Benutzeroberflàche nicht erkennbar
- man kann die Fehlermeldung nicht konfigurieren

Wenn dich das nicht abschreckt, dann könnte der Code z.B. so aussehen:

CurrentProject.Connection.Execute _
"ALTER TABLE tblB" & _
" ADD CONSTRAINT Wert_Muss_In_tblA_Sein" & _
" CHECK (tblB.tt IN (SELECT tblA.Bez FROM tblA))"

Wobei ich hier den Contraint-Namen "Wert_Muss_In_tblA_Sein" als
Erlàuterung in der sonst eben nicht konfigurierbaren Fehlermeldung
missbrauche.

Servus
Karl
*********
Access FAQ: http://www.donkarl.com

Ähnliche fragen