Jim,
This code has two section. This snippet it placed into the KeyDown event of
the form. The scanner (Wasp) is set to send F5 as a preamble Character, so
that it is recognized in the KeyDown event sends the focus to a Textbox,
[SacnInput] on the main form. This is also placed in subforms so that
control always goes to the textbox. An [Enter] is also forced by the
Scanner. In the AfterUpdate event of [ScanInput] handles all of the
funtionality for the barcode. Set KeyPreview of the form to True.
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = vbKeyF5 Then
[ScanInput].SetFocus
End If
End Sub
Here is the Code for the AfterUPdate event of [ScanInput]. I set up the the
Barcoding with special prefiz characters which are parsed and handled in the
code. This is a Method to handle inputting of times for tasks in a shop.
It was never implemented but works in the dev copy. Let me know if you have
questons. I developed this during the summer and went on to other tasks and
haven't looked it since, but should be able ti figure out whats happening.
Private Sub ScanInput_AfterUpdate()
'NOTE that Preamble Characters "F5" are programmed into the scanner and will
be returned
'as the first characters in a scan
'Close form if Exit is Scanned
If [ScanInput] = "Exit" Then
DoCmd.Close
Exit Sub
End If
'Check for User
If Left([ScanInput], 1) = 2 Then
[User] = Mid([ScanInput], 3)
ElseIf [ScanInput] = "9999" Then
[User] = "9999"
End If
If IsNull([User]) Or [User] = 0 Then
MsgBox "You must Scan an Employee Number!"
Exit Sub
End If
'Check for Order Number
If IsNull([Order]) Or [Order] = "" Then
MsgBox "You must scan (or Enter) an Order Number"
Exit Sub
End If
'Check if Renumbering selection was scanned. This mumbers/ renumbers the
lines on the task form
If [ScanInput] = "Ren" Then
Call [Tasks].Form.Renum_Click
[ScanInput] = Null
Exit Sub
End If
'Go to a product or task line number
'If Value is P or T store in Variable strFind
'or is an Integer preceeded by "L" then store in lngFind
If [ScanInput] = "P" Or [ScanInput] = "T" Then
'Set box around Product or Task
[ProdBox].Visible = [ScanInput] = "P"
[TaskBox].Visible = [ScanInput] = "T"
Exit Sub
End If
If Left([ScanInput], 1) = "L" Then
lngFind = Mid([ScanInput], 2)
[ScanInput] = "Finding"
[ScanInput].SelStart = 0
Dim rs As DAO.Recordset
Set rs = [Products].Form.RecordsetClone
If [ProdBox].Visible = True Then '<<<<
Set rs = [Products].Form.RecordsetClone
rs.FindFirst "[detItem] = " & lngFind & " And [ordID] = " & [ordID]
'[ordID] used in find to make it quicker, otherwise it lags
If Not rs.NoMatch Then
[Products].Form.Bookmark = rs.Bookmark
End If
ElseIf [TaskBox].Visible = True Then '<<<<
'Check the DetItem field for a value. If it is Null or Empty then
renumber the lines
'THis is a temporary procedure what can be done way with. The DetItem
field was added when
'THis screen was develped so that the values for the existing records
will be Null.
If IsNull([Tasks].Form![detItem]) Then
Call [Tasks].Form.Renum_Click
End If
Set rs = [Tasks].Form.RecordsetClone
rs.FindFirst "[detItem] = " & lngFind & " And [ordDetID] = " &
Nz([ordDetID], 0)
If Not rs.NoMatch Then
[Tasks].Form.Bookmark = rs.Bookmark
End If
End If
'End Select
Set rs = Nothing
[ScanInput] = Null
' strFind = Null
lngFind = 0
DoCmd.Beep
Exit Sub
End If '<<<<
'Exit if Product, Task or a line number was scanned so that requery isn't
executed
If Left([ScanInput], 1) = "P" Or Left([ScanInput], 1) = "T" Or
Left([ScanInput], 1) = "L" Then
Exit Sub
End If
'^^^^^^^^^^^^^^^^^^^^^^^
'On Error GoTo error_Section
On Error Resume Next
Dim ctl As Control
For Each ctl In Me.Controls
If (ctl.ControlType = 109 Or ctl.ControlType = 111) And [ScanInput] =
"Clear" And ctl.Name <> "ScanInput" And Parse(ctl.Tag, 2, ";") = "Clear"
Then
ctl = Null
ElseIf [ScanInput] = "Start" Then
[StartTime] = Format(Time(), "short time")
If Not IsNull([StopTime]) Then
[calcTime] = Nz(DateDiff("s", [StartTime], Time) / 3600, 0)
End If
Exit For
ElseIf [ScanInput] = "Stop" Then
[StopTime] = Format(Time(), "short time")
If Not IsNull([StartTime]) Then
[calcTime] = Nz(DateDiff("s", [StartTime], Time) / 3600, 0)
End If
ElseIf [ScanInput] = "Cmp" Then
[Completed] = Not [Completed]
Exit For
ElseIf (ctl.ControlType = 109) And [ScanInput] = "Save" Then
If (IsNull(ctl) Or ctl = "") Then
MsgBox "You must enter a " & ctl.Name
Exit Sub
End If
ElseIf Parse(ctl.Tag, 1, ";") = Left([ScanInput], 1) Then
ctl = Mid([ScanInput], 3)
Exit For
End If
Next ctl
'Reset Order [OrdID]
If Not IsNull([Order]) And [Order] <> "" Then
[ordID] = DLookup("[ordID]", "BarcodeDataLookups", "[ordJob] = " &
[Order])
End If
'Reset Product [OtdDetId]
If Not IsNull([Product]) And [Product] <> "" Then
[ordDetID] = DLookup("[ordDetID]", "BarcodeDataLookups", "[detProdCode] =
'" & [Product] & "' And [OrdId] = " & [ordID])
'syncrhonize current product with Scanned Product
Dim rst As Recordset
Set rst = [Products].Form.RecordsetClone
rst.FindFirst "[ordDetID] = " & Nz([ordDetID], 0)
If Not rst.NoMatch Then
[Products].Form.Bookmark = rst.Bookmark
End If
Set rst = Nothing
[Tasks].SetFocus
End If
If [ScanInput] = "Save" Then
[ScanInput] = "Saved"
'Do save process
DoCmd.Beep
Else
[ScanInput] = Null
End If
exit_Section:
'[Tasks].Requery
'[Products].Requery
DoCmd.Beep
Exit Sub
error_Section:
If Err = 2335 Then
Resume Next
Else
MsgBox Err.Description
Resume Next
End If
End Sub