Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Barcode in Variale speichern, zerlegen und an Textfeld übergeben

Begonnen von omron2003, Dezember 01, 2016, 11:58:17

⏪ vorheriges - nächstes ⏩

Beaker s.a.

Hallo,
Zitatwird der Laufzeitfehler 5 erzeugt
Bei mir nicht
Zitats="(91) RX089123 (10) 0131234567 (3100) 000180"
?Format(Mid(s, 3, 8), "@@@@-@@@@")
1) R-X089
?Mid(s, 13, InStr(s, "3100") - 13)
3 (10) 0131234567 (
Allerdings halte ich die Ergebnisstrings nicht für richtig im Sinne von "wie gewünscht".
gruss ekkehard

Korrektur:
Zitat?Mid(s, 13, InStr(s, "(3100)") - 13)
3 (10) 0131234567
könnte schon eher sinnvoll sein
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Man könnte auch mit einem Regulären Ausdruck den Scan zerpflücken.Sub Test()
   Const CLSID_RegExp = "{3F4DACA4-160D-11D2-A8E9-00104B365C9F}"

   Const Scan1$ = "(91)RX089123(10)0131234567(3100)000180"
   ' die Leerzeichen sind vermutlich eher Artefakte aus dem Forum
   Const SCAN2$ = "(91) RX089123 (10) 0131234567(3100) 000180"
   
   Const MUSTER$ = "\(\w*\) *(\w*) *\(\w*\) *(\w*) *\(\w*\) *(\w*)"

   Dim sm

   With CreateObject("new:" & CLSID_RegExp)
Scan1:
      Debug.Print "SCAN1:"
      .Pattern = MUSTER
      If .Test(Scan1) Then
         For Each sm In .Execute(Scan1)(0).SubMatches
            Debug.Print sm
         Next
      End If
      Debug.Print

Test2:
      Debug.Print "SCAN2:"
      If .Test(SCAN2) Then
         For Each sm In .Execute(SCAN2)(0).SubMatches
            Debug.Print sm
         Next
      End If
   End With
End Sub
Was dann zu dieser Ausgabe im Direktbereich führt:SCAN1:
RX089123
0131234567
000180

SCAN2:
RX089123
0131234567
000180
Grüße von der (⌒▽⌒)

omron2003

Hallo,
leider komme ich hier nicht weiter.
Deshalb habe ich mal eine Demo .accdb im Anhang
Die mein Problem mit dem Barcode veranschaulichen sollte?

Besten Dank im Voraus
Gruß
Omron2003

Beaker s.a.

Hallo,
Warum prüfst du die Werte nicht mal selber im Einzelschrittmodus?
91RX0891231001315638793100000180 enthält den Suchstring (3100)
zweimal. Da ergibt InStr den Wert 10 (1. Vorkommen), und somit -13
wieder einen negativen Wert.
Hier: 91RX0891231011315638793100000180 taucht der Begriff das
1. Mal an Stelle 23 auf (-13 = 10).
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Josef P.

Hallo!

Zerlege deinen Code etwas, dann kannst du besser prüfen.
Ausgangscode:
Private Sub Barcode_BeforeUpdate(Cancel As Integer)
If Not Me!Barcode Like "91RX0*" Then
     MsgBox "Die MaterialNr ist ungültig!" & vbCrLf & "prüfen ob die Umschalt Schaltfläche an der Tastatur aktiviert ist!" & vbCrLf & "ansonsten falsches Material gescannt...", vbInformation, "ACHTUNG"
     Me.Undo
  Else
   Me.Charge = Mid([Barcode], 13, InStr([Barcode], "3100") - 13)
  End If
End Sub


Etwas aufgeteilt:
Private Sub Barcode_BeforeUpdate(Cancel As Integer)

  If Not Me!Barcode Like "91RX0*" Then
     MsgBox "Die MaterialNr ist ungültig!" & vbCrLf & "prüfen ob die Umschalt Schaltfläche an der Tastatur aktiviert ist!" & vbCrLf & "ansonsten falsches Material gescannt...", vbInformation, "ACHTUNG"
     Me.Undo
     Exit Sub
  End If
 
  Dim Pos3100 As Long
  Pos3100 = InStr([Barcode], "3100")
 
  If Pos3100 < 13 Then
     MsgBox "3100 steht an Posistion " & Pos3100 & " das ist kleiner als 13 ... und was nun?"
     Exit Sub
  End If
 
  Me.Charge = Mid([Barcode], 13, Pos3100 - 13)
  'Was sagt die magische 13 eigentlich aus?
 
End Sub



BTW: Das sieht für mich nach einem GS1-Code aus. Wäre es dann nicht besser, den Code nach den Regeln der Application Identifier zu zerlegen?

mfg
Josef

omron2003

Ja korregt, es ist ein EAN 128 Code der aus SAP stammt und sich auf Etiketen befindet die ich in Access einscanne um das Material und die Charge zu speichern.

Gruß
Omron2003

Lachtaube

So könnte man das mit dem Regulären Ausdruck gestalten.
Grüße von der (⌒▽⌒)

omron2003

Hallo Josef,

ZitatBTW: Das sieht für mich nach einem GS1-Code aus. Wäre es dann nicht besser, den Code nach den Regeln der Application Identifier zu zerlegen?
Kannst du mir hierzu mehr Infos geben?
Da der Code auf dem Etikett so dargestellt wird (91)RX089123(10)1131563879(3100)000180
und nach dem scannen im Textfeld Barcode so aussieht 91RX0891231011315638793100000180
kann ich mir nicht vorstellen wie da eine Regel zum zerlegen aussehen könnte.

Besten Dank im Voraus
Omron2003


omron2003

Hallo Lachtaube,

sorry da hat sich der Post wohl überschnitten,
ich schaue mir die Demo an..

So wie das aussieht handelt es sich hierbei um
den Code nach Regeln der Application Identifier zu zerlegen
was Josef meinte...

Besten Dank
Omron2003


Josef P.

#24
Hallo!

ZitatDa der Code auf dem Etikett so dargestellt wird (91)RX089123(10)1131563879(3100)000180
und nach dem scannen im Textfeld Barcode so aussieht 91RX0891231011315638793100000180
Das ist durchaus üblich. ;)

Liste der Application Identifier: https://www.activebarcode.de/codes/ean128_ucc128_ai.html
oder von gs1.org: http://www.gs1.org/docs/barcodes/GS1_General_Specifications.pdf

Damit:
91 => Für firmeninterne Nutzung, alphanumerisch bis zu 30-stellig, inkl. FNC1
(91)RX089123  + CHR-Code von FNC1
=> du weißt, wann (91) endet und kannst dann den nächsten Ziffernblock auslesen.

Anm. zu FNC1 zw. 3 und der 1 müsste noch ein Zeichen sein (das wird als Text aber nicht sichtbar sein, sollte aber mit Asc(xxx) auswertbar sein.)

10 => Losnummer bzw. Chargennummer, alphanumerisch bis zu 20-stellig, inkl FNC1
(10)1131563870

bleibt noch
3100 => Nettogewicht in Kilogramm, numerisch 6-stellig

Wenn der Barcode bei dir immer in der Reihenfolge (91)..(10)...(3100) vorkommt, kannst du den relativ einfach zerlegen.
Wenn du den Text mit dem FNC1-Zeichen splittest, hast du bereits nach den AI unterteilt, da 91 und 10 einen FNC1 erfordern (falls es ein GS1-Code128 ist).
Hättest du noch AI mit fixen Längen (also ohne FNC1) müsstest du diese noch extra behandeln.

/edit: unter http://www.aidecoder.com/ oder https://online-barcode-reader.inliteresearch.com/ kannst du ein Bild des Barcodes auswerten lassen.

mfg
Josef

omron2003

Hallo zusammen,

ich möchte mich nochmals recht Herzlichst für die Unterstützung bedanken.
Ich werde mich nochmals näher mit der Thematik Barcode und Access befassen,
da warscheinlich im laufer der Zeit noch weitere Fragen auftreten werden.

@Lachtaube
Ich hätte da noch eine Frage zu dem Beitrag "mit regulären Ausdruck gestallten"
Den Code habe ich nun in meine Anwendung übernommen und er funktioniert einwandfrei wenn die Charge 10 Stellen hat.
Allerdings habe ich ein Material bei dem die Charge nur 8 Stellen hat, wenn ich hier den Code anwende bekomme ich die Meldung "Keine Übereinstimmung".  Ich dacht nun wenn ich den Wert in der folgender Codezeile von 10 auf 8 ändere müsste es gehen. Tut es aber nicht.
ZitatCinst MUSTER$ = "91" (\w{8})10[\w{10})3100(\w{6})"
habe ich hier etwas übersehen? Oder liegt es an der Charge (LL6-08VB) weil diese nicht nur aus Zahlen besteht?

Besten Dank im Voraus
Omron2003

Lachtaube

Wenn 8 bis 10 Stellen möglich sind, sollte das Muster 91(\w{8})10(\w{8,10})3100(\w{6}) lauten.

Übersetz: der Scan muss mit 91 beginnen. Das erste Klammerpaar fängt den ersten Submatch ein, welcher aus exakt 8 Zeichen (alphanumerisch nebst Unterstrich) bestehen muss. Danach muss zwingend die 10 vorhanden sein. Jetzt kommt der zweite Submatch innerhalb der Klammern, der in der modifizierten Form 8 bis 10 alphanumerische Zeichen erwartet. Es folgt die 3100, der den letzte Submatch mit zwingend 6 alphanumerischen Zeichen folgt.

Reguläre Ausdrücke können recht praktisch beim Parsen und Testen von Gültigkeiten sein, wenn exakte(n) Regel(n) bekannt sind.

Ich will aber nicht verschweigen, dass sie je nach Textumfang und Komplexität des Musters auch viel Rechenkapazität beanspruchen.
Grüße von der (⌒▽⌒)

Josef P.

Hallo!

Falls das ein GS1-Code ist, müsste der AI 10 mit einem FNC1 abgeschlossen sein. Damit fällt dann jede annähernde Ermittlung weg, da die Text-Blöcke exakt definiert sind.
Ob ein FNC1 enthalten ist, kann man prüfen, wenn man den echten Barcode über einen Scanner erhält. In diesem Text würde ich nachsehen, welche Zeichen (Byte-weise) vom Scanner geliefert werden. Es könnten nämlich mehr sein, als man im Textfeld sieht.

mfg
Josef

omron2003

dann hab ich schon das erste Problem,
die Chargen enthalten nicht nur alphanumerische Zeichen.
Es können sich auch - und _ in der Charge befinden..

Gruß
Omron2003

omron2003

Hallo Josef P.
ich habe das Bild des Barcodes mal auswerten lassen,
dabei kam folgendes Ergebnis heraus (siehe Bild im Anhang)

mfg
Omron 2003