hallo zusammen,
kann man die Eingabe von Währungsbeträgen irgendwie formatieren? Das Ergebnis sollte das eingeben von Buchstaben und bei mir auch das vorzeichen "-" verhindern. Also nur positive Zahlen mit 2 Nachkommastellen sollten möglich sein. Bei einer dreistelligen Zahl gebe ich zum Beispiel bei Eingabeformat "999;;_" ein. Ich hoffe ihr habt verstanden was ich meine.
Danke und Gruß Dieter
Hallo Dieter,
genügt dir nicht einfach >=0 als Gültigkeitsregel für das Währungsfeld in der Tabelle und die Einstellung auf 2 Kommastellen im Bearbeitungsformular?
Gruß Oma
Hallo Oma,
dann hätte ich nur den Minusbereich abgefangen, Komischerweise kann man bei Währung Buchstaben in Access eingeben. Gibt es denn kein Eingabeformat das man verwenden könnte? Es werden hier ja keine Milionenbeträge eingegeben, ich müsste eigentlich nur den Bereich von 0-10000 abdecken.
Dieter
Hallo,
ein Feld Währung ist ein Zahlenfeld und wenn man da Buchstaben eingibt kommt eine entsprechende Meldung.
Also reicht das was Oma geschrieben hat.
Wenn du umbedingt willst kannst du ja das Eingabeformat 99990,00;;_ nehmen.
Ich halte das für aber für mehr als umständlich das hier immer fünf Stellen Vorkomma und zwei Stellen Nachkomma erfast
werden müssen.
Gruß
Johann
Hallo,
du KÖNNTEST aber auch als Gültigkeitsregel >=0 und <=10000 nehmen oder prüfst überhaupt gleich komplett auf Formularebene - was ICH bevorzugen würde
Gruß
Hallo,
kein Beitrag ohne ein Database Kommentar, egal ob zusätzlich oder überflüssig...
Gruß
@Jonny
danke für den Tip, aber mir persönlich gehen diese Meldungen von Access auf die Nerven, da ich dann keine Möglichkeit beim Verlassen des Feldes darauf zu reagieren, Zum Beispiel wenn eine Falsche Eingabe erfolgt, dass dann einfach 0,00€ wieder ins feld geschrieben wird. Oder kennst du eine Möglichkeit diese Meldungen zu unterdrücken und statt dessen einfach das Feld mit einem neuen Wert zu besetzen, deshalb die Frage nach der Eingabeformatierung.
@database
wenn die Eingabe korrekt war kann man natürlich auf Formularebene den Wert abfragen und entsprechend reagieren. Aber so weit kommt es ja nicht, ich kann das Feld bei Falscher Eingabe nicht verlassen.
Ich stelle mir folgendes vor
Falsche eingabe -> Meldung von mir -> zurücksetzen des wertes auf 0,00€
geht sowas in Access ? kann man diese Access Meldungen abfangen und durch eigene ersetzen?
Gruß Dieter
Hallo Dieter,
du kannst doch alle Felder in Formular prüfen u. gegebenfalls auch immer eine 0,00 schreiben.
so in etwa:
Private Sub DeinFeld_AfterUpdate()
If Me!DeinFeld<= 0 Then
msgBox "Wert falsch"
Me!DeinFeld = 0
Me!DeinFeld.SetFocus
End If
End Sub
Gruß Oma
Hallo,
Database hat zwar vom Gast (Feigling ist bestimmt jemand sich einloggen könnte) einen drübergekriegt aber ich wage
auch noch eine Ergänzung.
Da hast geschrieben das auch Buchstaben eingeben werden können, als das ein wirkliches Textfeld ist.
Dann die Routine noch etwas ergänzen:
Private Sub DeinFeld_AfterUpdate()
If not isnumeric(me!DeinFeld) or Me!DeinFeld<= 0 Then
msgBox "Wert falsch"
Me!DeinFeld = 0
Me!DeinFeld.SetFocus
End If
End Sub
mit not isnumeric fängst du auch Buchstaben bzw Null Wert ab.
Gruß
Johann
Drücke ich mich so unverständlich aus?
dass ich nach der Eingabe und unter Einhaltung des Währungsformates auf Formularebene reagieren kann ist mir schon klar. Ich komme aber erst gar nicht in den Genuß etwas ändern zu können, weil bei dem Datentyp Währung immer zuerst die Access Fehlermeldung kommt und diese mich in dem Feld solange festhält, bis das Währungsformat eingehalten wurde. Ich möchte genau das tun was ihr mir schon die ganze Zeit vorschlagt, nämlich selbst auf eine Falscheingabe zu reagieren, nur muss ich diese Accessfehlermeldung dazu irgendwie unterdrücken oder auschalten da sonst alle Ereignisse im Formular erst gar nicht erreicht werden.
Gruß Dieter
Hallo,
um das vernüftig abzufangen, braucht man sowieso Code. Also würde ich Prozedur erstellen, die in einem Formularfeld erst gar keine Buchstaben zulässt.
Eingabe beschränken auf Zahlen, Komma und Rücktaste. Und alle Spatzen sind gefangen.
Falls Interesse an einer solchen Lösung, mache ich Dir gern einen Vorschlag.
Brauchst Du das Komma?
Hallo Dieter,
ZitatDrücke ich mich so unverständlich aus?
also nun verstehe ich dich nicht! Mit dem Code von mir bzw. der Ergänzung von Johann (oder evt. noch mehr Erweiterungen) kommt es doch zu keiner Access-Meldung?
Zitatweil bei dem Datentyp Währung immer zuerst die Access Fehlermeldung kommt und diese mich in dem Feld solange festhält
Bei mir kommt bei "Fehleingaben" immer die Meldung aus dem Code. Eine zusätzliche Access-Meldung kommt bei mir in keinen Eingabefall im Formular.
Gruß Oma
Hallo Oma, Hallo MzKlMu,
Oma ich weis nicht was für eine Version du hast, (ich habe A2003) bei mir kommt immer eine Fehlermeldung (falsches Format) ich habe bereits probiert in dem Ereignis OnChance während der Eingabe zu reagieren, aber entweder habe ich was falsch gemacht oder aber das Ereignis wird während ich Eingebe nicht aufgerufen.
MzKlMu gerne nehme ich dein Angebot an mir einen Vorschlag zu unterbreiten wie ich dem Problen begegnen kann.
Gruß Dieter
Hallo,
anbei ein Vorschlag:
Private Sub DeinFeldName_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 48 To 57, 8, 44, 188, 27, 13
'48-57=Zahlen, 8=Rück, 44 und 188=Komma, 13=Enter, 27=ESC
'es wird nichts gemacht bzw. normale Tastenfunktion bleibt erhalten
Case Else
MsgBox "Ätsch, geht nicht" 'MsgBox nicht unbedingt notwendig
KeyCode = 0
End Select
End Sub
Es funktionieren nur die genannten Tasten.
Auf ein Eingabeformat sollte verzichtet werden. Die Msgbox ist nicht notwendig, bei einer falschen Taste passiert dann einfach gar nichts.
Hallo MzKlMu,
das klappt hervorragend, großes Lob an dich. Was mir jetzt noch Fehlt sind die Keycodes für die Numertastatur 0-9 und Komma im Nummernblock oder noch besser gibt es irgendwo eine Liste mit diesen KeyCodes. So eine Liste wäre bestimmt auch eine feine Sache für die Tips Und Tricks Abteilung hier im Forum.
Auf jeden Fall hast du mir sehr geholfen
Danke und Gruß Dieter
Hallo,
noch ein Vorschlag ;D
das Verhindern von negativen Werten und evt Buchstaben-Eingabe kann auch mit 2 Ereignissen verhindert werden:
1. das verhindern von negativen Werten:
Private Sub Währungsfeld_AfterUpdate()
If Me!Währungsfeld < 0 Then
Me!Währungsfeld.SetFocus
Me!Währungsfeld = 0
End If
End Sub
2. und das Verhindern von beliebigen Zeichen außer Zahlen kann mit einer Formularfehlerbehandlung erreicht werden:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 2113 Then 'Wert eingegeben, der für Feld nicht zulässig ist
Me.Währungsfeld .Undo
Response = acDataErrContinue
End If
End Sub
Gruß Oma
Die KeyCodes der NumPadtasten könntest du ganz leicht selbst rausbekommen,
Code erweitern
....
Case Else
MsgBox "Ätsch, geht nicht. KeyCode: " & KeyCode 'MsgBox nicht unbedingt notwendig
KeyCode = 0
....
dann wild rumtippen.
Hier eine Liste (http://msdn.microsoft.com/en-us/library/0z084th3%28VS.90%29.aspx)
Fürs Numpad.
Select Case KeyCode
Case 48 To 57, 8, 44, 188, 27, 13, &H60 To &H69, &H6E
Hallo Oma ,Hallo lumbumba
@Oma
Das funktioniert jetzt ebenfalls, vielleicht wieder eine doofe Frage ,woher hast du die Fehlernummer um die Falscheingabe abzufangen?
Ansonsten ist das ebenfalls OK.
@lumbumba
Du hast recht darauf hätte ich selbst kommen können, aber wie das so ist auf das einfachste kommt man nicht. (Sorry) Die Liste aus deinem Link ist aber nicht vollständig. Sind das nicht die ACSII Codes oder ist das wieder eine andere Liste?
Gruß
Dieter
Richtig das sind nicht die AsciiCodes, das sind die Tastencodes, und diese unterscheiden sich ein wenig von den Ascii-Codes, denn z.B. a und A gibt es bei der Tastatur nicht wirklich, d.h. wenn du a oder Shift a auf der tastatur drückst kommt immer der Rückgabewert 65 ( = A) bei den Key-Ereignissen.
Asciiliste (http://www.torsten-horn.de/techdocs/ascii.htm)
Alternativ die Charmap.exe starten, einen Buchstaben anklicken, und in der Statuszeile den Wert ablesen (Wert ist in Hex, und alle Werte bis &HFF sind Ascii).
Hallo Dieter,
die Fehlernummer erhalte ich einfach mit:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
msgBox "Fehlernummer: " & DataErr
End Sub
und dann eine unzulässigen Wert (also z.B. einen Buchstaben) eingeben, ergibt dann Fehlernummer 2113
Diese angeführte Formularfehlerbehandlung kann dann die Standardfehlermeldung von Access ersetzen oder verhindern!
Ist das nicht besser, als auf eine Reihe von Tastuturen zu reagieren?
Gruß Oma
gelöscht
Hallo Oma, Hallo Lumbumba
Beides sind sehr interessante Vorgehensweisen, wobei ich zugeben muß, dass Omas Vorgehensweise sehr kurz und knapp ist und man muss nicht nach diesen Tataturcodes suchen.
@Oma
Ich gehe mal davon aus dass, nach "Response = acDataErrContinue" Access zur normalen Feherbehandlung zurückgeht und mir nicht alle Fehler danach unterdrückt sondern mir diese noch anzeigt.
@Lumbumba
Die Version von MzKlMu hat mit gezeigt wie man gezielt Tasten abfragen kann, Schade dass es scheinbar niergends eine vollständige Liste dafür gibt.
Wahrscheinlich werde ich für die Währungseingabe den Code von Oma verwenden und mir den Code von MzKlMu für ganz spezielle Sachen aufheben, sowas kann man immer gebrauchen.
@database
Lass uns doch bitte die Sachen ausdiskutieren ich werde das Häkchen schon noch setzen keine Angst.
Gruß Dieter
@Optiplex
Die erstgenannte Liste ( zur msdn-Seite ) ist so ziemlich vollständig, was man für den normalen täglichen Gebrauch der tastatur benötigt. Was fehlt sind die Media/Browsertasten, OEM-Codes, sowie einige Herstellerspezifische KeyCodes. Andere Liste (http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx)
Aber wenn es kurz und knackig sein soll nehmen sich eigentlich beide Varianten nix, aber du hast recht wenn man die Keycodes nicht kennt ist die Oma-Variante die die bessere Wahl.
Hallo Dieter,
natürlich ist da Abfangen von Tatatureingaben, wie von Klaus - MzKlMu angeführt, ein probates Mittel um ungewünschte Tasten- bzw. Tastenkombinationen für die DB abzuwenden.
Die Fehlerbehandlung für Formulare mit dem Ereignis Bei Fehler reagiert nur auf FormularFehler, nicht auf Laufzeitfehler aus VBA-Code!
Mit Hilfe von Response (2 Parameter) kannst du festlegen wie Access nach der Fehlerprozedur reagieren soll:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 2113 Then 'Wert eingegeben, der für Feld nicht zulässig ist
msgBox "Nicht möglich" 'Fehlerbehandlungsprozedur
Me.Gehalt.Undo 'Fehlerbehandlungsprozedur
Response = acDataErrContinue '---> führt Programm fort u. zeigt Standardfehler nicht an
'Response = acDataErrDisplay '---> Nach Abschluss der Error-Prozedur wird Standardfehler angezeigt
End If
End Sub
Gruß Oma
Hallo,
wobei sich die Keycodes relativ leicht ermitteln lassen.
Und speziell bei Zahlen ist ja nur eine relativ kleine Anzahl von Keycodes erforderlich.
Hallo,
@Diete, zu deine Frage: Ich gehe mal davon aus dass, nach "Response = acDataErrContinue" Access zur normalen Feherbehandlung zurückgeht
Nein tut es nicht, dann müsstest du so schreiben:
Private Sub Form_Error(DataErr As Integer, Response As Integer)
Selecct Case DataErr
Case 3201
'Behandlung bei Verletzung der referentiellen Integrität
....
Case 2113
'Behandlung bei unzulässiger Werteeingabe
....
Response = acDataErrContinue
End Select
Response = acDataErrDisplay
End Sub
D.h. du behandelst bekannte Fehler u. unterdrückst dabei die Standardfehler von Access u. lässt für weitere Fehlermöglichkeiten die Standardmeldung zu!
Hoffe, dir hiermit geholfen zu haben
Gruß Oma
Hallo zusammen,
mal sehen ob ich das richtig verstanden habe, also mit dem unten eingegebenen Code würde der Fehler für die Währungseingabe abgefangen werden und Access würde nachdem es den Code durchlaufen hat wieder, wie vorher, alle Fehlermeldungen ausgeben außer dieser einen für den unzulässigen Wert. Richtig?
Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 2113 Then 'Wert eingegeben, der für Feld nicht zulässig ist
msgBox "Nicht möglich" 'Fehlerbehandlungsprozedur
Me.Gehalt.Undo 'Fehlerbehandlungsprozedur
Response = acDataErrContinue '---> führt Programm fort u. zeigt Standardfehler nicht an
End If
Response = acDataErrDisplay '---> Nach Abschluss der Error-Prozedur wird Standardfehler angezeigt
End Sub
@ MzKlMu
Deine Version steht der von Oma in nichts nach. Beide funktionieren einwandfrei. Ich weiß auch nicht ob es die richtige Lösung ist, die Fehlermeldung auszuschalten, wenn man sie auch mit anderen Mitteln in den Griff bekommen kann. Nun so einfach ist das mit den Tastencodes nun auch wieder nicht, du gibst z.B. für das Komma zwei Werte an 44 und 188, wenn ich nun teste ist 188 OK, 44 bekomme ich nicht angezeigt. Laut msnliste ist 44 für vbKeySnapshot. Auch bekomme ich mit Shift und Alt zusammen mit einer anderen Taste die selben Werte, also so einfach ist das mit den Tastencodes nun auch wieder nicht.
@lumbumba
Diese Liste sieht mir schon ein bißchen vollständiger aus, man findet hier auch das Komma mit 188 Hex BC was in der ersten Liste nicht der Fall war.
Ich hoffe ich gehe euch mit meiner Fragerei nicht auf den Geist, aber wie soll man es sonst lernen?
Gruß Dieter
Hi Dieter,
Jup da haste recht, die erste Liste ist nicht vollständig, ich hatte darauf jetzt nicht geachtet, weil für solche Konstanten schaue ich eher in meine Win32Api.inc. Aber die Liste hättest du dir auch leicht ergoogeln können.
Das Abfangen der Wertes 44 im Code von MzKlMu ist eigentlich nicht notwendig, da dies der Ascicode des Komma's ist ( nicht der KeyCode) und beim Tippen auch nicht erzeugt wird ( zumindest wenn Deutsch eingestellt ist). Wenn du jetzt hingegen einen String auf ein Komma hin analysieren willst, dann verwendest du 44 aber nicht 188.
Ascii(String)Codes <> KeyCodes, aber mit einer Schnittmenge
Gruß Daniel
Hi, ich noch mal,
ich hatte das falsche Ereignis verwendet. Das Ereignis "Bei Taste" ist dazu besser geeignet.
Dann sieht der Code so aus:
Private Sub DeinFeldName_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57, 8, 44, 27, 13
'48-57=Zahlen, 8=Rück, 44=Komma, 13=Enter, 27=ESC
'es wird nichts gemacht
Case Else
MsgBox "Ätsch, geht nicht" 'MsgBox nicht unbedingt notwendig
KeyAscii = 0
End Select
End Sub
Hier werden die ASCII Codes verwendet, Da spielt es auch keine Rolle ob der Zahlenblock oder oder das normale Zahlenfeld verwendet wird. Auch das Komma hat nur einen Wert (44).
Daher war ich auch der Meinung, an die Codes kommt man leicht. In diesem Ereignis wird nur der ASCII Code verwendet, wie der Name des Parameters schon sagt.
Hallo Dieter,
Zitatalso mit dem unten eingegebenen Code würde der Fehler für die Währungseingabe abgefangen werden und Access würde nachdem es den Code durchlaufen hat wieder, wie vorher, alle Fehlermeldungen ausgeben außer dieser einen für den unzulässigen Wert. Richtig?
Richtig
ZitatIch weiß auch nicht ob es die richtige Lösung ist, die Fehlermeldung auszuschalten, wenn man sie auch mit anderen Mitteln in den Griff bekommen kann.
du kannst doch nur die Fehlermeldung für bekannte Fehler durch eine eigene Medung ersetzen (oder es lassen) und den Fehler beseitigen. So wird im dargestellten Code für die Eingabe eines unzulässigen Wertes die Fehlerbehaldlung mit der tollen Medung: "Nicht möglich" sowie die Rückname der Eingabe mit Me.Währungsfeld.Undo durchgeführt. Die Standardmeldung: "Sie haben einen Wert eingegeben...." erscheint nicht. Dafür sorgt in der IF - Schleife für diesen Fehler: Response = acDataErrContinue
Für weitere möglicheFehler wird durch Response = acDataErrDisplay die normale Stansdardmeldung ausgegeben!
Gruß Oma
Hallo zusammen,
Danke nochmals für eure Antworten.
@MzKlMu
Danke für deine Berichtigung des Ereignisses aber das andere Ereignis hat ebenfalls geklappt scheinbar durch die von Daniel erwähnte Schnittmenge von ASCII und Keycodes.
@Oma
Also gut du hast mich überzeugt, ich werde es mit deiner Version mal probieren.
Ich hoffe,dass MzKlMu mir jetzt nicht böse ist, aber seine Version ist für andere Aufgaben ein sehr probates Mittel um eine Eingabe auf die Anzahl von Tasten zu beschränken die dann auch nur zugelassen werden sollen. Was mich an dieser Version ein bischen stört ist, dass man auch bestimmte Aktionen von Windows unterbindet (z.b. das Kontexmenü usw.),was bei Omas version nicht der fall ist. Natürlich gibt es auch dafür wieder Tastencodes, aber wo fängt man an und wo hört man auf mit den Keycodes.
Danke auch an Lumbumba für seiner ErKlärungen mit ASCII und Keycodes.
Bis dann Dieter