Hallo, habe mal noch eine Frage, ich habe ein Formular mit mehrern Textfeldern, nun drücke ich auf den Speicherbutton und möchte aber vorher überprüfen lassen ob alle textfelder ausgefüllt sind, wenn nicht dann soll das speichern abgebrochen werden. Ich lasse dann den Text zum Textfeld rot einfärben, das funktioniert aber schon nur wie unterbreche ich den speichervorgang so das die restlichen textfelder dann noch eingegeben werden können???
Mfg Thomas
Hallo,
Zitatnun drücke ich auf den Speicherbutton
... dadurch gehe ich davon aus, dass es sich um ein ungebundenes Formular handelt.
Nun, wenn du brav mit Suffixen arbeitest dann sollten Textfelder das Suffix 'txt' im Feldnamen tragen - also in der Form 'txtDeinTextfeld'
Du KÖNNTEST in dem Fall alle Textfelder am Formular mit folgendem Code durchlaufen und überprüfen
Dim ctl As Control
Dim check as boolean
check = true
For Each ctl In Me.Controls
If Left(ctl.Name, 3) = "txt" Then
If IsNull(ctl) Then
MsgBox "nicht befüllt"
check = false
End If
End If
Next
'Prüfen auf Vollständigkeit und Reaktion
If check = False Then
MsgBox "Es wurden nicht alle benötigten Informationen erfasst ....", vbExclamation,"Datenspeicherung"
Exit Sub
Else
'Code fürs Speichern ausführen
End If
HTH
Peter
Hallo Peter, danke für die schnelle Antwort, habs doch noch gelöst , aber ich hatte die If Schleife falsch gesetzt, kam ich erst nach deinem code drauf. Meine Lösung ist so. Sie funktioniert schön wenn ein feld nicht ausgefüllt ist wird das dazugehörige Bezeichnungsfeld rot und im ereigniss nach Aktualisierung steht der code das Bezeichnungfeld fürs Textfeld wieder mit nem schwarzen text zu füllen
Private Sub Befehl250_Click()
If Len(Trim$(Nz(Me!A1, vbNullString))) = 0 Then
Me!A1.Controls(0).ForeColor = vbRed
rotFärben
Cancel = True
Else
With CurrentDb.OpenRecordset("Health_49", dbOpenDynaset)
.FindFirst "ID =" & ID
If .NoMatch Then
.AddNew
!ID = Me!ID
Else
.Edit
End If
!Nachname = Me!Nachname
!Vorname = Me!Vorname
!von = Me!von
!bis = Me!bis
!DatumHealth_49Prä = Me!Datum
!Bezugstherapeut = Me!Bezugstherapeut
!A1Health_49Prä = Me!A1
!A2Health_49Prä = Me!A2
!A3Health_49Prä = Me!A3
.Update
End With
DoCmd.Close acForm, "Health_49Prä"
End If
End Sub
Private Sub rotFärben()
If IsNull(Me!A1) Then
MsgBox "Achtung noch nicht alles ausgefüllt"
End If
End Sub
Private Sub A1_AfterUpdate()
If Len(Trim$(Nz(Me!A1, vbNullString))) > 0 Then
Me!A1.Controls(0).ForeColor = vbBlack
End If
End Sub
Danke schön und ein schönes Wochenende Thomas
Hi,
wenn ich mich nicht verlesen habe überprüfst du mit deinem Monstercode aber nur
ein Feld!?
Zitatich habe ein Formular mit mehrern Textfeldern
Wenn du das für jedes Feld machst wirds mehr als unübersichtlich!
Peter
p.s. IF ist KEINE Schleife, IF prüft eine Bedingung auf Wahrheit / Erfüllungsgrad ;)
Hallo Peter, hast recht merke ich auch grad war dann wohl doch noch nicht die optimale Lösung
Thomas
Hallo Peter, habe jetzt nochmal mit deinem Code rumprobiert, leider habe ich keinen Erfolg gehabt.
Also auf irgendeine Kennzeichnung der textfelder kann ich verzichten. Das Formular ist ungebunden und hat Textfelder als Eingabefelder die aber keinen Text sonder als Zahl deklariert sind. Die Felder besitzen weiterhin eine Formatierung so das nur eine Zahl zwischen 1 und 4 eingegeben werden kann.
kannst du mir da irgenwie weiterhelfen??
Gruß Thomas
Hallo,
ohne VBA kommst Du aus, wenn Du in der Tabelle bei den gewünschten Feldern die Eigenschaft "leere Zeichenfolge" auf "nein" setzst.
Harald
Hallo, wie gesagt Formular is ungebunden daher keine Tabelle daten werden nur angefügt.
VBA kann ruhig sein.
Thomas
Hi
neuer Versuch ohne VBA :-)
im Formular bei der Steuerelementeigenschaft die Gültigkeitsregel auf "Ist Nicht Null" setzen.
Hilft das?
Harald
Hallo, nützt mir nichts, hab es folgendermaßen gelöst, Code:
Private Sub Befehl250_Click()
If bClose = False Then Cancel = True
Dim Felder As Variant
Dim x As Variant
Dim Feldbezeichnung As Variant
Dim Ausgabe As String
Felder = Array(A1, A2, A3)
Feldbezeichnung = Array("A1", "A2", "A3", "Ende")
Ausgabe = ""
Do Until Feldbezeichnung(x) = "Ende"
If IsNull(Felder(x)) Then Ausgabe = Ausgabe & Chr(13) & Feldbezeichnung(x)
x = x + 1
Loop
If Ausgabe = "" Then
bClose = True
With CurrentDb.OpenRecordset("Health_49", dbOpenDynaset)
.FindFirst "ID =" & ID
If .NoMatch Then
.AddNew
!ID = Me!ID
Else
.Edit
End If
!Nachname = Me!Nachname
!Vorname = Me!Vorname
!von = Me!von
!bis = Me!bis
!DatumHealth_49Prä = Me!Datum
!Bezugstherapeut = Me!Bezugstherapeut
!A1Health_49Prä = Me!A1
!A2Health_49Prä = Me!A2
!A3Health_49Prä = Me!A3
.Update
End With
MsgBox "alles fertig eingetragen?"
DoCmd.Close acForm, "Health_49Prä"
DoCmd.Close acForm, "Health"
DoCmd.OpenForm "Health"
Else
MsgBox ("Folgende Felder wurden vergessen!" & Chr(13) & Ausgabe)
End If
End Sub
Private Sub Form_Load()
bClose = False
End Sub
Auf diese weise werden alle noch nicht aufgelisteten Felder angezeigt und nach dem Ausfüllen kann man dann alles Speichern.
Gruß Thomas
Hallo,
also man kann so ziemlich alles komplizieren, soviel hab' ich bemerkt :)
Warum bleibst du nicht bei meinem Vorschlag? ???
ZitatAlso auf irgendeine Kennzeichnung der textfelder kann ich verzichten
Schön - wenn du der Meinung bist, dass es dann einfacher wird ... ? :-\
ZitatDas Formular ist ungebunden und hat Textfelder als Eingabefelder die aber keinen Text sonder als Zahl deklariert sind
...was ja nichts, aber auch schon mal gar nichts mit einem Präfix zu tun hat - es sind und bleiben TEXTFELDER mit dem Präfix txt, egal was drin steht! :'(
Die Notation ist keine Erfindung meiner Wenigkeit, das haben schon weit aus klügere Köpfe lange vor meiner Zeit gemacht.
Wenn die Felder eine Kennzeichnung haben, die sie von allen anderen unterscheiden KANN man auch diese zur Unterscheideung beim Durchlaufen der Steuerelementauflistung verwenden.
Somit kannst du statt nach dem von dir so verschmähtem 'txt' am Anfang des Feldnamens auch nach der numerischen Kennzeichnung am Ende des Feldnamens selektieren!
Dim ctl As Control
Dim check as boolean
Dim mangelhaft as String
check = true
For Each ctl In Me.Controls
If IsNumeric(Right(ctl.Name,1)) Then
If IsNull(ctl) Then
MsgBox "nicht befüllt"
check = false
mangelhaft = mangelhaft & ctl.name & " "
End If
End If
Next
'Prüfen auf Vollständigkeit und Reaktion
If check = False Then
MsgBox "Es wurden nicht alle benötigten Informationen erfasst." & vbCrLf & _
"In " & mangelhaft & " fehlen Eintragung(en)!", vbExclamation,"Datenspeicherung"
Exit Sub
Else
'Code fürs Speichern ausführen
End If
Den Code fürs Speichern KÖNNTEST du OHNE Probleme um EINIGES vereinfachen:
Wie wär's mit einem schönen INSERT-Statement, das du dann per CurrentDB.Execute in die Datenbank schickst?
Dann wird aus deinem Codeblock zum Schreiben in die DB ein 2-Zeiler ;D
Grüße
Peter
Hallo,
oder wie wäre es ganz einfach, mit einem gebundenen Formular. ;D Dann kann sich ganz aufs Prüfen verlegen und um das Schreiben (und lesen) der Daten muss man sich nicht kümmern.
Hallo,
@MzKlMu
Den Vorschlag hat der TO schon mehrmals abgelehnt (auch schon in vorausgegangenen Threads) ... warum auch immer...
Hallo,
ZitatDen Vorschlag hat der TO schon mehrmals abgelehnt
Ich weis, aber steter Tropfen höhlt (vieleicht) den Stein.
Ich frage mich immer wieder, warum man sich das antut und mit ungebunden Formularen arbeitet. Ich bin der Überzeugung man kommt mit gebundenen Formularen mit höchstens der Hälfte das VBA Codes aus ohne Einschränkkung der Funktionalität.
Gebundene Formulare haben nach meiner Auffassung auch einen entscheidenden Vorteil: Viele Dinge gehen automatisch, um die man sich mit ungebundenen Formulare selbst kümmern muss. Z.B. Hafo/Ufo Konstruktionen sind gebunden einfach, ungebunden kompliziert(er).
@thomut
Mich würde wirklich mal der Grund interessieren, warum Du unbedingt mit ungebundenen Formularen arbeiten willst.
Hallo, ganz einfach weil das Formular nur zur eingabe von Zahlen benötigt wird gleichzeitig wird estwas berechnet und das ganze aus 4 Formularen die sehr sehr ähnlich sind und sich nur in einigen Formeln ändern und das ganze dann in alles in einer Tabelle gespeichert werden soll die dann nur zum als gesamt Export ins exel dient, mehr nicht. das ganze geht so viel bequemer weil es auf diesem wege auch einen gewissen grundschutz des überschreibens oder löschens von Daten bietet, und sich das ganze sehr bequem ändern und anpassen lässt ohne ständig die Tabellenstrucktur ändern zu müssen und und und, ansonsten verwende ich auch lieber gebundene Formulare ist aber an dieser stelle so besser gewesen.
Mit freundlichen grüßen Thomas