Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: jagger am November 19, 2018, 21:27:46

Titel: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 19, 2018, 21:27:46
Hallo,

kann man mit VBA verhindern, dass der Inhalt (Wert) eines Textfeldes
(in diesem Fall: Datum) durch Markieren und Taste "Entf"
oder durch Markieren und Taste "Backspace" gelöscht wird?

Vielen Dank im Voraus
LG
jagger
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: Lachtaube am November 20, 2018, 00:58:17
Wenn man neue Datensätze von dem Vorhaben ausschließen will, geht z.B. Folgendes:
Private Sub Form_Current()
   With Me.DasDatumssteuerelement
      .Enabled = Me.NewRecord
      .Locked = Not .Enabled
   End With
End Sub
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 20, 2018, 12:04:43
Hallo Lachtaube,
wenn ich das Formular, in dem das Ufo mit dem Datumssteuerelement liegt, öffne, ist alles okay.
Allerdings kann ich weiterhin ein Datum markieren und löschen.
Wenn ich aber die Datenherkunft von dem Ufo wechsle und dann die Datenherkunft wieder auf das (Unter)Formular (im UFO) mit dem Datumssteuerelement stelle, dann kommt "Laufzeitfehler" und er mault
Me![tDate].Locked = Not .Enabled an.
Oder habe ich Deinen Code falsch umgesetzt?
Private Sub Form_Load()
With Me![tDate].Enabled = Me.NewRecord
Me![tDate].Locked = Not .Enabled
End With
End Sub

Der Hintergrund ist:
Ich rufe mit Private Sub tDate_Enter()
Call ShowDatePicker
End Sub

den Datapicker auf und damit das Datum gleich in einem
Schritt gespeichert wird, nutze ich dann noch Private Sub tDate_Change()
Me.sprungfeld.SetFocus
End Sub

Wird nun das Datum gelöscht, löst das einen Fehler
"Der Fokus kann von Microsoft Access nicht auf das Steuerelement |1 verschoben werden." aus.
Natürlich will er dann auch debuggen.

Oder kann man das Ergebnis des Löschens abfangen?
Private Sub tDate_Change()
If Me![tDate]  ...  :-\
End if
End sub

Ich habe schon alles alles mögliche probiert:
Is Null; ""; <"0"; ...

Was hat das Datumssteuerelement für einen Wert, wenn man den Inhalt markiert und dann löscht?
Hat jemand noch einen Tipp?

Mit bestem Dank im Voraus
jagger
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: Lachtaube am November 20, 2018, 12:28:13
Entschuldige Jagger, dass beim ersten Senden die Zeilenumbrüche in die Knie gingen. Ich habe das weiter oben korrigiert.

Das Beim Anzeigen Ereignis (Current) sollte vollkommen genügen, um in alten Datensätzen das Datumsfeld zu sperren. Du musst nur DasDatumssteuerelement gegen tDate austauschen.
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 20, 2018, 13:03:43
Hallo Lachtaube,
das funktioniert jetzt.
Leider kann man die alten Daten nicht mehr verändern bzw.
bearbeiten.

Ich werde mal weiter probieren.

Danke Dir!
LG
jagger
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: Lachtaube am November 20, 2018, 13:12:15
Wer alte Daten bearbeiten muss, hat entweder falsche Eingaben gemacht oder ein schlechtes Datenmodell vorliegen. :)

Aber per Knopfdruck oder Tastatur-Shortcut könnte man das Steuerelement auch temporär wieder entsperren und aktivieren, indem die Locked-Eigenschaft auf False und die Enabled-Eigenschaft auf True gesetzt wird und nach verrichteter Arbeit wieder zurücksetzen.
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 20, 2018, 13:31:24
Hallo Lachtaube,
ZitatWer alte Daten bearbeiten muss, hat entweder falsche Eingaben gemacht oder ein schlechtes Datenmodell vorliegen. :)
:) :) :)
Das sind Termine (siehe Anhang). Da kann es schon mal vorkommen, dass ein Kunden anruft und seinen Termin verschieben will.

An das Entsperren mittels Doppelklick habe ich auch schon überlegt. Aber dann kann man das Datum ja auch wieder "ausversehen" löschen. ... und da sind wir wieder bei der Fehlermeldung (siehe oben).

Also, weiter nach dem Zustand nach dem Löschen forschen.

Trotzdem ersmal vielen Dank!
LG
jagger
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: Beaker s.a. am November 20, 2018, 13:42:30
@jagger
Du willst also nur verhindern, dass da nichts drinsteht. Dazu würde ich das
Ereignis "Vor Aktualisierung" (_BeforeUpdate) des Datumsfeldes verwenden.
Private Sub DeinFeld_BeforeUpdate(Cancel As Integer)
    If Len(Me.DeinFeld) = 0 Then
        MsgBox "Das Datum darf nicht leer sein!"
        Cancel = True
    Else
        'hier könntest du noch auf ein gültiges Datum prüfen
    End If
End Sub


gruss ekkehard
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: MzKlMu am November 20, 2018, 13:56:42
Hallo,
Private Sub Form_Current()
    Me.Datumsfeld.Locked = Not IsNull(Me.Datumsfeld)
End Sub
erlaubt einmalig die Eingabe eines Datums. Danach ist das Feld gesperrt. Auch löschen funktioniert nicht.
So lange der DS nicht verlassen wird, kann das Feld auch noch geändert werden.

Ggf. braucht es ein Hintertürchen, wenn man später sieht dass der Eintrag falsch ist.
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 20, 2018, 15:20:48
@ekkehard,

Danke für den Tipp, aber da ist
Private Sub tDate_Change()
Me.sprungfeld.SetFocus
End Sub

schneller zur Stelle und das Problem ist wieder da.

LG
jagger

Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: Beaker s.a. am November 20, 2018, 15:35:28
@Jagger
Dann entferne das und setze den Focus _AfterUpdate.
Gespeichert wird bei dieser Aktion aber nur, wenn dabei der Fokus vom
UFo zum HFo wandert, wonach es allerdings nicht aussieht. Ansonsten
Private Sub DeinFeld_AfterUpdate()
    Me.Dirty = False
    Me.sprungfeld.SetFocus
'Was ist denn das überhaupt für ein Feld? Oder habe ich da was überlesen?
End Sub


gruss ekkehard
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: MzKlMu am November 20, 2018, 17:17:12
@Jagger
Mein Vorschlag aus #8 erfüllt doch genau Deine Vorgaben aus Deinem Eröffnungsbeitrag. Schon probiert ?
Und wenn Du per Doppelklick entperrst, ksnnst Du das Feld natürlich bearbeiten und somit auch löschen. Aber das ist dann ja auch Sinn der Sache.
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 20, 2018, 18:08:16
@MzKlMu,
ich will ja gerade verhindern, dass man das Datum löschen kann, da sonst die Fehlermeldung kommt.

LG
jagger
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 20, 2018, 18:12:51
@ekkehard,
Zitat'Was ist denn das überhaupt für ein Feld? Oder habe ich da was überlesen?
es ist ein gebundenes Texfeld, Datumsfeld.
Siehe Hintergrung #3

Mit Deinem letzten Vorschlag klappt es nicht.
Der Cursor springt nicht in das Sprungfeld.
Nach dem "Loslassen" des gewählten Datums im DatePicker
wird ja noch nicht gespeichert.

LG
jagger
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: MzKlMu am November 20, 2018, 19:31:26
Hallo,
irgendwie habe ich da Verständnisprobleme.
Wenn das Feld gesperrt ist, kannst Du auch nichts löschen. Und wenn es frei ist, kannst Du ändern, also auch löschen.
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 20, 2018, 20:09:39
@MzKlMu,
man soll es ändern können. Löschen aber nicht.
Wenn in dem Feld ein Wert steht, der kein Datumswert ist
(12.01 oder 09. oder "") kommt die Fehlermeldung:
"Der Fokus kann von Microsoft Access nicht auf das Steuerelement |1 verschoben werden."
Die Meldung kommt, wenn man das entsprechende Datum, oder einen Teil davon, markiert und dann "Entf" oder "Backspace" drückt.
Weil:Private Sub tDate_Change()
Me.sprungfeld.SetFocus
End Sub

Kurios ist, dass wenn ich mit Dim Test As String
Test = Nz(Me![tDate])
If Len(Test) = 10 Then
MsgBox Test

der Wert von [tDate] abfrage, da immer noch das komplette Datum steht (siehe Bild), er aber dann (durch .SetFocus) die Fehlermeldung kommt.  :-\
Weil ja durch das ".SetFocus" das "schlechte" Datum gespeichert wird. Das müsste man abfangen.
Nur hab ich weder die richtige Stelle, noch das entsprechende "wenn" gefunden.

LG
jagger


Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: MzKlMu am November 20, 2018, 20:15:44
Hallo,
unter diesen Bedingungen würde ich für das Datumsfeld nur zulässige Zeichen (0-9 und .) zulassen. Dann kann markiert und die Zahlen benutzt werden. Aber Entf und BS geht nicht.
Die Zeichenauswahl wir im Ereignis "Bei Taste" des Feldes gemacht, indem der ASCII Code ausgewertet wird.
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 21, 2018, 11:56:14
Hallo MzKlMu,

Dein letzter Tipp ist die Lösung!!!
Private Sub tDate_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
      Case 48 To 57  ' 0-9 zulassen
      Case 46        ' . zulassen
      Case Else      ' alles andere ablehnen
         KeyAscii = 0
   End Select
End Sub


Mit Private Sub tDate_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
         Case Else      ' alles andere ablehnen
         KeyAscii = 0
   End Select
End Sub

kann man jetzt nur noch mit DatePicker arbeiten.
Falsche Eingaben (ungültige Formate) sind jetzt ausgeschlossen  ;D


Vielen Dank!
LG
jagger
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: Beaker s.a. am November 21, 2018, 13:59:51
@jagger
Im zweiten Code brauchst du kein Select Case mehr, -
Private Sub tDate_KeyPress(KeyAscii As Integer)
         KeyAscii = 0
End Sub

reicht da.
Titel: Re: Löschen von Wert in Textfeld unterbinden
Beitrag von: jagger am November 21, 2018, 15:15:41
@Beaker,
Zitat von: Beaker s.a. am November 21, 2018, 13:59:51
@jagger
Im zweiten Code brauchst du kein Select Case mehr, -
Private Sub tDate_KeyPress(KeyAscii As Integer)
         KeyAscii = 0
End Sub

reicht da.

Okay, Danke.
Ich habe es geändert.
LG
jagger