Textfeld-Eigenschaften
Hallo,
wie kann man die Eingenschaften von einem Textfeld so verändern, dass dieses Textfeld nie leer ist. Anstatt nichts soll eine "0" stehen.
Vielen Dank im Voraus
Antwort schreiben
Antwort 1 von lorf55 vom 12.08.2020, 18:31 Options
Hallo,
in MS Access:
Eigenschaften - Daten - Standardwert -> 0
Gruß
lorf
Antwort 2 von maxim66 vom 13.08.2020, 09:02 Options
Hallo lorf,
Danke für die Antwort. Ich wollte das Problem so lösen, dass im Textfeld immer irgendetwas steht (Das Eingabefeld darf nicht leer sein). Wenn der Anwender die Eingaben löscht, dann soll eine "0" angezeigt werden und bei der Eingabe einer anderen Zahl die "0" wider verschwindet. Mit Hilfe vom Standardwert wird beim Anlegen des neuen Datensatzes zwar eine "0" angezeigt, kann aber gelöscht werden.
Ich könnte es mit Prozeduren "AfterUpdate" und "BeforeUpdate" lösen, ich habe aber sehr viele Textfelder und der VBA-Code wird sonst sehr lang (keine schöne Lösung). Deswegen suche ich nach einer Eigenschaft, die ich für alle Felder übernehmen kann.
Gruß
maxim66
Antwort 3 von lorf55 vom 14.08.2020, 17:49 Options
Hallo maxim66,
versuch mal das:
Sub TextNullen(frm As Form)
Dim ctl As Control
For Each ctl In frm.Controls
If ctl.ControlType = acTextBox Then
If (ctl.Value = "") Or IsNull(ctl.Value) Then
ctl.Value = "0"
End If
End If
Next ctl
End Sub
Aufruf in der [Ereignisprozedur] in Eigenschaften - Formular - Ereignis - Bei Zeitgeber mit:
TextNullen Me
In Eigenschaften - Formular - Ereignis - Zeitgeberintervall z.B. 1000 eintragen (jede Sekunde alle leeren Felder mit 0 füllen).
Andere Ereignisse(Formular, Detailbereich) haben bei mir nicht funktioniert (O2k).
Antwort 4 von maxim66 vom 15.08.2020, 09:19 Options
Danke lorf,
ich habe Dein VBA-Code eingebaut und er funktioniert einwandfrei.
Ich habe nur eine Frage: Wird meine Datenbank nicht langsamer, wenn jede Sekunde alle meine Textfelder (ca. 200 auf mehreren Formularen verteilt) überprüft werden?
Gruß
maxim66
Antwort 5 von maxim66 vom 15.08.2020, 12:53 Options
Danke lorf,
ich habe Dein VBA-Code eingebaut und er funktioniert einwandfrei.
Ich habe nur eine Frage: Wird meine Datenbank nicht langsamer, wenn jede Sekunde alle meine Textfelder (ca. 200 auf mehreren Formularen verteilt) überprüft werden?
Gruß
maxim66
Antwort 6 von lorf vom 15.08.2020, 16:03 Options
Hallo Maxim66,
die Funktion wird ja in jedem Formular extra aufgerufen, d.h. nur wenn alle Formulare gleichzeitig offen sind, werden auch 200 Felder je Sekunde überprüft (und alle Controls aller Formulare durchgegangen).
Evtl. hilfts 2000 statt 1000 zu nehmen. ;)
Schöner wäre natürlich, ein passendes Formularereignis dafür zu finden. Dafür brauchst du nur bei den Formularereignissen den Code der Reihe nach einfügen bzw. von einem Ereignis zum anderen weiterverschieben und denn probieren.
Eine andere Optimierungsmöglichkeit wäre, nur die Textfelder durchzugehen: Dim ctl As Textbox, aber über Controls kriegte ich das nicht hin und eine Textboxes-Auflistung kenne ich nicht.
Am Schönsten wäre es ein neues Objekt von Textbox abzuleiten, das bei jeder Wertänderung den Wert auf 0 setzt, wenn der gelöscht wurde.
Denn würde man nur noch das für die Formularfelder benutzen und es gäbe diesen Zauber nicht.
Wenn du dazu was Passendes hingekriegt hast, melde dich bitte,
Gruß
lorf
Antwort 7 von maxim66 vom 20.08.2020, 14:27 Options
Hallo,
habe mir wieder Zeit genommen und das Problem gelöst:
Code für ein Modul:
Public Function TextNullen(OnOff As Integer)
Dim frmCurrentForm As Form
'wenn das Hauptformular den Fokus hat, wird die Funktion nicht durchgeführt
On Error GoTo TextNullen_Exit
'das aktive Ufo ermitteln
Set frmCurrentForm = Screen.ActiveForm.ActiveControl.Form
'mit aktivem Textfeld im aktiven Ufo arbeiten
With frmCurrentForm.ActiveControl
If (OnOff = 0) Then 'Beim Verlassen
If (.Text = "") Then
.Text = 0
End If
ElseIf (OnOff = 1) Then 'Beim Hingehen
If (.Text = 0) Then
.Text = ""
End If
End If
End With
TextNullen_Exit:
End Function
Dann wird für jedes Textfeld, das die o.g. Eigenschaft besitzen soll, Makros erstellt (man kann sofort alle Felder markieren und Ereignis erstellen):
Beim Hingehen - „AusführenCode“ und TextNullen(1)
Beim Verlassen - „AusführenCode“ und TextNullen(0)
Damit die "0" auch nach dem Verlassen des Unterformulars angezeigt wird, soll dieser Code für jedes Unterformular in das HAUPTFORMULAR eingebaut werden:
Private Sub UFo1_Exit(Cancel As Integer)
TextNullen 0
End Sub
Ich benutze diese Funktion ausschließlich für Unterformulare. Wenn sie für das Hauptformular gebraucht wird, soll die Zeile:
Set frmCurrentForm = Screen.ActiveForm.ActiveControl.Form
gegen
Set frmCurrentForm = Screen.ActiveForm
ausgetauscht werden.
Oder hat jemand eine bessere Lösung?
Funktioniert's bei Dir, lorf?
Gruß
maxim66