I'm continuing to update this thread for posterities sake; maybe someone will come looking for some messy barcode parsing code.
I've managed to handle both 2 dimensional and 1 dimensional scans with this module. The fact that I'm handling two different fields and also checking if the scan is 1d or 2d makes this a little confusingly recursive, but it does work. It doesn't account for every possible way a user could break the input yet, but hopefully it'll get there. Here's how I did it:
Code:
Option Compare Database
Private Sub btnToggleScanning_Click()
newLineFocus
End Sub
Private Sub cboPartNumber_AfterUpdate()
'Scanning turned ON?
If btnToggleScanning = True Then
Dim barStr As String
barStr = cboPartNumber
If InStr(barStr, "31P") = 0 Then
linearScan barStr
Else
QRScan barStr
End If
End If
End Sub
Private Sub QRScan(barStr As String)
Dim partStr As String
Dim dateStr As String
partStr = Mid(barStr, InStr(barStr, "31P") + 3, InStr(barStr, "+S") - InStr(barStr, "31P") - 3)
dateStr = Right(barStr, (Len(barStr) - InStr(barStr, "+S")) - 1)
Me!cboPartNumber = partStr
Me!dateCode = dateStr
newLineFocus
End Sub
Private Sub linearScan(barStr As String)
Dim partStr As String
Dim dateStr As String
If InStr(barStr, "1P") = 0 Then
'If not part number, then date
dateStr = Mid(barStr, 2, 10) 'Set date variable
Me!dateCode = dateStr 'Write data
Me!cboPartNumber = ""
Me!cboPartNumber.SetFocus
Else
partStr = Mid(barStr, 3, 20)
Me!cboPartNumber = partStr
If Len(dateStr) = 0 Then
Me!dateCode.SetFocus
Else
newLineFocus
End If
End If
End Sub
Private Sub dateCode_AfterUpdate()
If btnToggleScanning = True Then
Dim dateStr As String
Dim barStr As String
barStr = dateCode
If InStr(barStr, "S") = 1 Then
dateStr = Mid(barStr, 2, 10) 'Set date variable
Me!dateCode = dateStr 'Write data
newLineFocus
Else
Me!dateCode = "" 'Write data
Me!dateCode.SetFocus
End If
End If
End Sub
Private Sub newLineFocus()
If btnToggleScanning = True Then
DoCmd.GoToRecord , , acNewRec
Me!cboPartNumber.SetFocus
End If
End Sub