PDA

Vollständige Version anzeigen : Methode automatisch in gewissen Zeitabständen aufrufen.


Donald2
03.05.2011, 10:40
Hallo,
ich lese über einen Handscanner einen Barcode ein und der landet in ein Textfeld. Das Textfeld befindet sich selber in einem Access-Formular.
Ich möchte dass wann immer ein Barcode eingelesen wird, diesen in eine Tabelle speichern.
Das Change-Ergeigniss reicht nicht aus, da das Ereignis schon ausgelöst wird, bevor der komplette Code eingelesen wurden ist.
Ich habe mir Gedacht dass ich in kurzen Zeitabständen eine Mehothe aufrufe, wo ich dann immer den Inhalt des Textfeldes überprüfe. Was bräuchte ich dafür?
Ich weiß dass ich so was ähnliches Mal vor Jahren in vb6 gemacht habe, timer-Steuerelemt oder so was.

gpswanderer
03.05.2011, 10:42
Hallo,
wenn Du ein gebundenes Formular verwendest, brauchst Du gar nichts.
Der Scanner sendet im Regelfall noch ein Enter, und schon ist der Datensatz (bzw. das Feld) in der Tabelle gespeichert.
Alles ohne einen einzigen Buchstaben programmieren zu müssen.

Donald2
03.05.2011, 10:48
Hallo,
der Scanner sendet kein Enter.

-Edit-
Vielleicht kann ich ihn so konfigurieren dass er es kann... Ich muss da mal gucken.

gpswanderer
03.05.2011, 10:55
Hallo,
der Scanner sendet kein Enter.das lässt sich aber bestimmt einstellen.
Aber:
Das Schließen des Formulars oder der DB speichert in jedem Fall. Auch wenn Du den Datensatz wechselst für den nächsten Scan wird autoamtisch gespeichert.

Du brauchst daher sowieso nichts zu programmieren.

Donald2
10.05.2011, 15:37
Hallo,
jetzt habe ich ein anderes Problem. Das mit dem Return klappt, aber ich will von den eingelesenen Code nur einen bestimmten Teil abspeichern. Ich habe versucht mit dem Ereigniss "BeforeUpdate" den Inhalt des Text-Steuerelement zu ändern, aber gibt es eine Fehlermeldung:

"Das Makro oder die Funktion, das bzw. die für dieses Feld einer der Eigenschaften VorAktualisierung oder Gültigkeitsregel zugeordnet ist, hindert Microsoft Office Access daran, die Daten in dem Feld zu speichern."

Thomas Möller
10.05.2011, 17:31
Hallo Donald,

Ich habe versucht mit dem Ereigniss "BeforeUpdate" den Inhalt des Text-Steuerelement zu ändern, aber gibt es eine Fehlermeldung:

dann lass uns doch mal den Code aus der entsprechenden Ergeignisprozedur sehen.

CU

Donald2
10.05.2011, 17:51
Hallo,
hier ist er:

Private Sub txt_code_BeforeUpdate(Cancel As Integer)
Me.txt_code.Value = Right(Left(Me.txt_code.Value, 50), 6)
End Sub

gpswanderer
10.05.2011, 18:26
Hallo,
nimm das Ereignis "Nach Aktualisierung".

Private Sub FeldA_AfterUpdate()
Me.txt_code = Mid(Me.txt_code, 45, 6)
End Sub
Statt Right und Left nimm Mid. Die 45 prüfen.
Auf Value kannst Du ganz verzichten.

Donald2
11.05.2011, 15:18
Danke es funktioniert! Hätte nicht gedacht dass man "Nach Aktualisierung" nehmen kann, da ich annahm dass es dann schon zu spät wäre. :confused:

Thomas Möller
11.05.2011, 17:25
Hallo!

Hätte nicht gedacht dass man "Nach Aktualisierung" nehmen kann, da ich annahm dass es dann schon zu spät wäre.

Das Ereignis findet zwar "Nach Aktualisierung" des Steuerelements statt. An dieser Stelle ist der Datensatz an sich aber noch nicht gespeichert. Das erfolgt erst später.

CU

Donald2
18.05.2011, 12:18
Jetzt habe ich doch mal wieder eine Frage.
Wie kann ich denn innerhalb des Ereigniss verhindern dass der eingelesene String nicht in die Tabelle abgespeichert wird, wenn eine Bedingung nicht erfüllt worden ist?

achtelpetit
18.05.2011, 12:39
Ungefähr so:

Private Sub FeldA_AfterUpdate()
Dim wert as string
wert = Mid(Me!txt_code, 45, 6)

If wert = DeineBedingung then
Me!txt_code = wert
Else
Me!txt_code = NULL
End if

End Sub

Donald2
18.05.2011, 12:53
Wenn ich das hier mache: Me!txt_code = NULL
dann werden trotzdem Datensätze angelegt die alle leer sind.
Das war noch nicht die Lösung.

Thomas Möller
18.05.2011, 14:41
Hallo!

Wie kann ich denn innerhalb des Ereigniss verhindern dass der eingelesene String nicht in die Tabelle abgespeichert wird, wenn eine Bedingung nicht erfüllt worden ist?

Doppelte Verneinung - Immer wieder schön. :)

Dafür kannst Du das Ereignis Before-Update des Formulars verwenden. Wenn die Prüfung nicht erfolgreich ist, setzt Du den Parameter Cancel auf True und der Datensatz wird nicht gespeichert.

HTH

Donald2
18.05.2011, 15:36
Danke für die Antwort, werde ich mal ausprobieren, habe in der Zwischenzeit einen anderen Weg genommen.

Donald2
18.05.2011, 16:48
Hallo!
Dafür kannst Du das Ereignis Before-Update des Formulars verwenden. Wenn die Prüfung nicht erfolgreich ist, setzt Du den Parameter Cancel auf True und der Datensatz wird nicht gespeichert.

HTH
Hallo,

das Problem ist wenn ich Cancel auf True setze, dann verschwindet der Text in der Textbox nicht und wenn ich das hier mache: Me.txt_code = "" bekomme ich wieder meine alte Fehlermeldung:

"Das Makro oder die Funktion, das bzw. die für dieses Feld einer der Eigenschaften VorAktualisierung oder Gültigkeitsregel zugeordnet ist, hindert Microsoft Office Access daran, die Daten in dem Feld zu speichern."

Thomas Möller
19.05.2011, 18:40
Hallo,

das Problem ist wenn ich Cancel auf True setze, dann verschwindet der Text in der Textbox nicht

nimm mal diesen Code:

Private Sub Form_BeforeUpdate(Cancel As Integer)

If DeineBedingung = False Then
Me.Undo
Cancel = True
End If

End Sub

Mit Cancel brichst Du das Speichern ab und das Undo sorgt dafür, dass die gemachten Eingaben verworfen werden.

HTH