Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Eingabeformat für Währung

Begonnen von Optiplex, Dezember 10, 2010, 11:46:00

⏪ vorheriges - nächstes ⏩

oma

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
nichts ist fertig!

lumbumba

#16
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
Fürs Numpad.
Select Case KeyCode
    Case 48 To 57, 8, 44, 188, 27, 13, &H60 To &H69, &H6E


---

Optiplex

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

lumbumba

#18
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

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).


---

oma

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
nichts ist fertig!

database

#20
gelöscht

Optiplex

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

lumbumba

@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
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.
---

oma

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
nichts ist fertig!

MzKlMu

Hallo,
wobei sich die Keycodes relativ leicht ermitteln lassen.
Und speziell bei Zahlen ist ja nur eine relativ kleine Anzahl von Keycodes erforderlich.
Gruß Klaus

oma

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
nichts ist fertig!

Optiplex

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

lumbumba

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
---

MzKlMu

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.
Gruß Klaus

oma

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
nichts ist fertig!