Gelöst GS1-128-Barcode/FNC1/Druckvorlagen-Etikett

  • JTL-Connect 2022: Ihr habt noch kein Ticket? Jetzt schnell sichern! Die PreConnect ist bereits ausgebucht, auch für die After-Show-Party auf der Ocean Diva sind nur noch wenige Plätze verfügbar! HIER geht es zum Ticketverkauf

  • Das Stable Release von JTL-Wawi 1.6 ist startklar: HIER gehts zum Forenbeitrag

dt-depot

Mitglied
19. August 2020
43
7
Hallo,

ich habe ein Problem, bei dem ich mir nicht sicher bin, wo in diesem Forum ich das richtig platziere - hier oder im Bereich Wawi> Druckvorlage. Weil ich mein Problem erstmal eben im Bereich Druckvorlagen verortet hatte, habe ich es entsprechend dort schon mal geschildert, leider bisher ohne Reaktion: https://forum.jtl-software.de/threads/gs1-128-barcode-mit-fnc1-terminierung-erstellen.129674/. Weil ich also nicht weiterkomme, starte ich hier mal einen Versuch, in der Hoffnung, dass sich nun jemand findet, der/die mir auf die Sprünge helfen kann. Soweit die Vorrede.

Worum geht es? Wir möchten unsere Artikel nach einem Wareneingang mit Etiketten belabeln. Hierzu haben wir in der Wawi passende Vorlagen erstellt. Zu den Daten, die auf das Etikett sollen, gehört unter anderem ein Barcode, der dem GS1-128-Standard entsprechende bestimmte Artikeldaten abbildet. Dazu zählen EAN/GTIN und Menge sowie - abhängig vom jeweiligen Artikel - MHD (bzw. in unserem Fall genau genommen das Verfalldatum) und Charge, wobei die Chargenbezeichnung von variabler Länge ist (das ist wichtig zu wissen). In der Druckvorlage erstelle ich den Barcode über folgende Formel:

Barcode(
/* GTIN/EAN */
"01"+
Artikel.EAN+
/* Verfalldatum */
Cond(Artikel.IstMHDArtikel,chr$(12),"")+
Cond(Artikel.IstMHDArtikel,"17","")+
Cond(Artikel.IstMHDArtikel,Date$(Date(JTL_DirectQuery ("SELECT TOP 1 dMHD FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC")),"%y%02m%02d"),"")+
/* Charge/LOT */
Cond(Artikel.IstChargenArtikel,chr$(12),"")+
Cond(Artikel.IstChargenArtikel,"10","")+
Cond(Artikel.IstChargenArtikel,JTL_DirectQuery ("SELECT TOP 1 cChargenNr FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"")+
/* Anzahl */
chr$(12)+
"30"+
Fstr$(JTL_DirectQuery ("SELECT TOP 1 fAnzahl FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"?&"),
"QRCode")
Der Barcode wird auf dem Etikett auch dargestellt. Das Problem entsteht beim Auslesen des Barcodes. Beispiel: 010404494101687010220009892301. Hier haben wir einen Artikel, dessen zu dem der Barcode die GTIN (AI: 01), Charge (AI: 10) und die Menge pro Einheit (AI: 30) enthält. Scanne ich nun den Barcode, der in den Wawi-Druckvorlagen mit der oben genannten Formel erstellt wurde, vom entsprechenden Etikett ab, erhalte ich im Notepad-Editor folgendes Ergebnis:
Screenshot_Barcode_Scan_Notepad.png
Der Barcode-Tester des JTL-Packtisches interpretiert denselben Code jedoch wie folgt:
Screenshot_Barcode_Scan_JTL-Packtisch.png
Da ist zu sehen, dass die Trennung zwischen Charge und Menge nicht erkannt wird, und der Identifier der Menge (30) samt dahinter genannter Anzahl (=1) als Teil der Charge gelesen wird...

Frage: Wo liegt der Fehler? In meiner Barcode-Formel in der Druckvorlage, konkret an der dort verwendeten FNC1-Terminierung, die mit chr$(12) möglicherweise falsch ist? Oder am Packtisch? Wo kann ich ansetzen, um mein Problem gelöst zu bekommen. Ich würde mich über Lösungsvorschläge wirklich freuen, da wir an diesem Thema nun schon seit einer Weile erfolglos herumoperieren. Vielen Dank vorab!

Unsere Wawi-Version: 1.6.39
 
Zuletzt von einem Moderator bearbeitet:

Stephan Handke

Projektmanager
Mitarbeiter
2. Juli 2009
4.784
549
Essen
Du bist der Lösung schon selbst ganz gut auf die Schlichte gekommen denke ich.

Ich bin mir jetzt auch nicht 1.000% sicher, aber ich denke der Fehler ist, dass du die FNC-Steuerzeichen VOR Charge und VOR Menge hast.

Zudem sind GTIN (EAN) und Verfallsdatum in der Länge fix. Das FNC-Steuerzeichen wird dann nicht benötigt.

Tausche bzw. lösche die Zeilen und probiere es nochmal:

Code:
Barcode(
/* GTIN/EAN */
"01"+
Artikel.EAN+
/* Verfalldatum */
Cond(Artikel.IstMHDArtikel,"17","")+
Cond(Artikel.IstMHDArtikel,Date$(Date(JTL_DirectQuery ("SELECT TOP 1 dMHD FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC")),"%y%02m%02d"),"")+
/* Charge/LOT */
Cond(Artikel.IstChargenArtikel,"10","")+
Cond(Artikel.IstChargenArtikel,JTL_DirectQuery ("SELECT TOP 1 cChargenNr FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"")+
Cond(Artikel.IstChargenArtikel,chr$(12),"")+
/* Anzahl */
"30"+
Fstr$(JTL_DirectQuery ("SELECT TOP 1 fAnzahl FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"?&")+
chr$(12), /* die Zeile könnte auch entfallen */
"QRCode")

Zusätzlich scheinst du noch eine alte Artikeletikettdruckvorlage zu verwenden (deutsche Variablen). Wenn du eine neue Druckvorlage anlegst (englische Variablen) kannst du ohne SQL-Abfragen direkt auf neue Variablen wie MHD, Charge u.ä. zugreifen.
 
Zuletzt bearbeitet:

dt-depot

Mitglied
19. August 2020
43
7
Hallo Stephan,

vielen Dank für Deine Rückmeldung und den Input.

Mit der Reihenfolge hatte ich zuvor auch schon herumgespielt, was aber auch nicht zu einem zufriedenstellenden Ergebnis geführt hat, da ich mit der Menge eine zweite Angabe habe, die von variabler Länge ist. Insofern verschiebt sich durch einen Tausch die Problemstellung nur, wird aber leider nicht behoben.

Ich habe es trotzdem mal mit Deiner Variante versucht, und dabei direkt die SQL-Abfragen durch die entsprechenden Variablen ersetzt (die aber bei mir in der Wawi nicht englisch sondern weiterhin deutsch sind, und zwar auch bei neu angelegten Vorlagen, btw):

Barcode(
/* GTIN/EAN */
"01"+
Artikel.EAN+
/* Verfalldatum */
Cond(Artikel.IstMHDArtikel,"17","")+
Cond(Artikel.IstMHDArtikel,Date$(Artikel.Lagerinformation.Mhd,"%y%02m%02d"),"")+
/* Anzahl */
"30"+
str$(Artikel.Lagerinformation.Menge,0,2)+
/* Charge/LOT */
Cond(Artikel.IstChargenArtikel,"10","")+
Cond(Artikel.IstChargenArtikel,Artikel.Lagerinformation.Chargennummer,"")+
Cond(Artikel.IstChargenArtikel,chr$(12),"")+
chr$(12),
"QRCode")
(Das "QRCode")+chr$(12)" am Ende führte direkt zu einer Fehlermeldung in der Ergebnisvorschau, deswegen habe ich das am Ende weggenommen.)

Damit ist es aber so, dass das Etikett nun ganz ohne Barcode ausgegeben wird. Woran mag das liegen?
 

Stephan Handke

Projektmanager
Mitarbeiter
2. Juli 2009
4.784
549
Essen
Hallo Stephan,

vielen Dank für Deine Rückmeldung und den Input.

Mit der Reihenfolge hatte ich zuvor auch schon herumgespielt, was aber auch nicht zu einem zufriedenstellenden Ergebnis geführt hat, da ich mit der Menge eine zweite Angabe habe, die von variabler Länge ist. Insofern verschiebt sich durch einen Tausch die Problemstellung nur, wird aber leider nicht behoben.

Ich habe es trotzdem mal mit Deiner Variante versucht, und dabei direkt die SQL-Abfragen durch die entsprechenden Variablen ersetzt (die aber bei mir in der Wawi nicht englisch sondern weiterhin deutsch sind, und zwar auch bei neu angelegten Vorlagen, btw):


(Das "QRCode")+chr$(12)" am Ende führte direkt zu einer Fehlermeldung in der Ergebnisvorschau, deswegen habe ich das am Ende weggenommen.)

Damit ist es aber so, dass das Etikett nun ganz ohne Barcode ausgegeben wird. Woran mag das liegen?
Du hast am Ende zwei Steuerzeichen hintereinander. Dürfte für die Erstellung des QR-Code aber eig irrelevant sein.

Barcode(
/* GTIN/EAN */
"01"+
Artikel.EAN+
/* Verfalldatum */
Cond(Artikel.IstMHDArtikel,"17","")+
Cond(Artikel.IstMHDArtikel,Date$(Artikel.Lagerinformation.Mhd,"%y%02m%02d"),"")+
/* Anzahl */
"30"+
str$(Artikel.Lagerinformation.Menge,0,2)+
chr$(12),
/* Charge/LOT */
Cond(Artikel.IstChargenArtikel,"10","")+
Cond(Artikel.IstChargenArtikel,Artikel.Lagerinformation.Chargennummer,"")+
Cond(Artikel.IstChargenArtikel,chr$(12),""),
"QRCode")

So sieht das spontan gut für mich aus. In meiner Lösung war das chr$(12), unter "QRCode") gerutscht. Das gehört natürlich darüber. Habe ich angepasst
 

dt-depot

Mitglied
19. August 2020
43
7
Wenn ich die Daten via SQL abfrage, dann wird der Barcode erstellt, nicht aber mit den Variablen, die die Wawi anbietet (bei mir sind das Artikel.Lagerinformation.Mhd, Artikel.Lagerinformation.Menge, Artikel.Lagerinformation.Menge; lediglich Bedingungen lassen sich abfragen, z.B. mit Artikel.IstMHDArtikel). Damit sich überhaupt Etiketten erstellen lassen, mit denen ich testen kann, bin ich also erstmal wieder zurück zu den SQL-Abfragen. Außerdem habe ich nun die Datenreihenfolge erneut verändert, so dass dass der Code nun die Folge GTIN-Verfalldatum-Menge-Charge darstellt. Die Zahlenfolge lautet an meinem Beispiel also 0104044941000299172023100130110220007243. Ein GS1-128-Test im Packtisch führt zu folgendem Resultat:
Screenshot_Barcode_Scan_JTL-Packtisch_2.png
Es werden nun also gar keine Datenfelder mehr erkannt.

Der Vollständigkeit halber hier nochmal die Formel, mit der ich in den Druckvorlagen den Barcode erstellt habe:

Barcode(
/* GTIN/EAN */
"01"+
Artikel.EAN+
/* Verfalldatum */
Cond(Artikel.IstMHDArtikel,"17","")+
Cond(Artikel.IstMHDArtikel,Date$(Date(JTL_DirectQuery ("SELECT TOP 1 dMHD FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC")),"%y%02m%02d"),"")+
/* Anzahl */
"30"+
Fstr$(JTL_DirectQuery ("SELECT TOP 1 fAnzahl FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"?&")+
/* Charge/LOT */
Cond(Artikel.IstChargenArtikel,chr$(12),"")+
Cond(Artikel.IstChargenArtikel,"10","")+
Cond(Artikel.IstChargenArtikel,JTL_DirectQuery ("SELECT TOP 1 cChargenNr FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"")
,"QRCode")

Ist denn das Steuerzeichen chr$(12) überhaupt das richtige, um eine FNC1-Terminierung in der Formel zu setzen? Ich hatte das aus der Beschreibung von @Marc Völker unter https://forum.jtl-software.de/threa...cklung-fuer-dieses-feature-wawi-10752.112488/ (dort der 3. Post im Thread mit Datum vom 30.07.2018) übernommen. Da der Hinweis aber schon etwas älter ist, wäre ja zumindest denkbar, dass es da eine Änderung gegeben hat und inzwischen ein anderes Steuerzeichen für die FNC1-Terminierung genutzt wird. Aus dem einführenden Beitrag von @Hellum unter https://forum.jtl-software.de/threa...nc1-befehls-funktioniert-nicht-sauber.177451/, konkret aus seinem/ihrem Notepad-Screenshot ist z.B. ersichtlich, dass dort die Trennung aus dem Code mit "GS" übertragen wurde, was darauf hindeutet, dass dort das Steuerzeichen chr$(29) verwendet wurde. Das von mir verwendete chr$(12) führt zu "FF". Und ja, ich habe es in meiner Formel auch schon mal mit chr$(29) versucht, was aber leider auch nicht dazu geführt hat, das meine Barcodes, bzw. die einzelnen Datenbezeichner sauber voneinander getrennt ausgelesen wurden.
 

Stephan Handke

Projektmanager
Mitarbeiter
2. Juli 2009
4.784
549
Essen

dt-depot

Mitglied
19. August 2020
43
7
Hallo Stephan,

das Datumsformat habe ich korrigiert - vielen Dank für diesen Hinweis! Meine Barcodeformel sieht nun wie folgt aus:

Barcode(
/* GTIN/EAN */
"01"+
Artikel.EAN+
/* Verfalldatum */
Cond(Artikel.IstMHDArtikel,chr$(29),"")+
Cond(Artikel.IstMHDArtikel,"17","")+
Cond(Artikel.IstMHDArtikel,Date$(Date(JTL_DirectQuery ("SELECT TOP 1 dMHD FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC")),"%02y%02m%02d"),"")+
/* Anzahl */
chr$(29)+
"30"+
Fstr$(JTL_DirectQuery ("SELECT TOP 1 fAnzahl FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"?&")+
chr$(29)+
/* Charge/LOT */
Cond(Artikel.IstChargenArtikel,"10","")+
Cond(Artikel.IstChargenArtikel,JTL_DirectQuery ("SELECT TOP 1 cChargenNr FROM tWarenLagerEingang WHERE kArtikel = "+FStr$(Artikel.InterneArtikelnummer,'?&')+" ORDER BY kWarenLagerEingang DESC"),"")
,"QRCode")
Das Steuerzeichen zwischen Mengenangabe und Charge ist gesetzt. Resultat des Tests am Packtisch ist:
Screenshot_Barcode_Scan_JTL-Packtisch_3.png
GTIN und Verfalldatum werden nun richtig ausgelesen. Aber leider wird die Chargennummer als Teil der Menge interpretiert nicht nicht als eigener Datenbezeichner erkannt, und das trotz Steuerzeichen zwischen Menge und Charge. Dasselbe passiert übrigens umgekehrt genauso, wenn ich Menge und Charge in meiner Barcodeformel tausche. Dann wird der Datenbezeichner (30) samt angehängter Mengenangabe (im Beispiel: 1) als Teil der Charge interpretiert...
Wir sind mit dem falschen Datumsformat insofern zwar einen Schritt weiter, und ich hatte tatsächlich die Hoffnung, damit wäre das Problem gelöst. Aber dem ist leider doch noch nicht ganz so.

Trotzdem erstmal danke bis hierhin und an dieser Stelle ein schönes Wochenende. Ich werde auch nochmal bis Montag (und wenn's sein muss noch länger) weitergrübeln, ob mir nicht doch noch etwas einfällt, das mich zur abschließenden Lösung führen kann.
 
Zuletzt von einem Moderator bearbeitet:

Stephan Handke

Projektmanager
Mitarbeiter
2. Juli 2009
4.784
549
Essen
Diesmal hast du ein Steuerzeichen zuviel. Das MHD hat eine fixe Länge. Da gehört kein Steuerzeichen hin. Falls das für die Menge sein soll -

Die Steuerzeichen stehen immer hinter dem Wert.

AI: 01
GTIN: 14 Stellen
ohne Steuerzeichen
AI: 17
MHD: 6 Stellen
ohne Steuerzeichen
AI: 30
Menge: 1 / flexibel
Steuerzeichen
AI: 10
Charge / flexibel
Steuerzeichen

In meinem Screenshot oben, siehst du ja, dass es funktioniert :)

Mit deinem Beispiel oben:
010404494100029917231001301<Steuerzeichen|GS|FNC1>10220007243

Hat es bei mir korrekt funktioniert
 

Marc Völker

Moderator
Mitarbeiter
15. April 2014
1.795
152
Hürth
Hallo,
die Informationen Lagerinformationen, werden nur von einigen Prozessen im Bezug auf WMS gefüllt, die können also auch gelegentlich (je nach dem von wo du guckst) leer sein.

Wenn die im WMS irgendwo leer sind, wo vom Datensatz alle Infos bekannt sind, Ticket öffnen. Bzw hier mal posten, wo es nicht ging, dann werden dort die Infos nicht gesetzt.

Ich werde aber als Ticket aufnehmen, dass wir hier mal eine Funktion für List&Label brauchen.
 
  • Ich liebe es
Reaktionen: Stephan Handke

dt-depot

Mitglied
19. August 2020
43
7
Diesmal hast du ein Steuerzeichen zuviel. Das MHD hat eine fixe Länge. Da gehört kein Steuerzeichen hin. Falls das für die Menge sein soll -

Die Steuerzeichen stehen immer hinter dem Wert.

AI: 01
GTIN: 14 Stellen
ohne Steuerzeichen
AI: 17
MHD: 6 Stellen
ohne Steuerzeichen
AI: 30
Menge: 1 / flexibel
Steuerzeichen
AI: 10
Charge / flexibel
Steuerzeichen

In meinem Screenshot oben, siehst du ja, dass es funktioniert :)

Mit deinem Beispiel oben:
010404494100029917231001301<Steuerzeichen|GS|FNC1>10220007243

Hat es bei mir korrekt funktioniert
Hallo @Stephan Handke,

danke für die Hilfe bis hierhin. Das Problem konnte zwischenzeitlich behoben werden. Es lag am Ende gar nicht mehr - wie von mir fälschlich vermutet - an der Formel bzw. am Barcode, sondern an der Hardware, sprich am Scanner.

Für alle, die mit dem Scanner DS2278 der Marke Zebra arbeiten und möglicherweise vor demselben Thema stehen: Versucht es einmal damit, die Spracheinstellung des Scanners von "German" auf "Swiss German" zu wechseln. Ich zitiere im Folgenden eine Anleitung von @Hellum, mit dessen Hilfestellung ich schließlich doch noch das Problem lösen konnte:

1: DS2278 Handbuch herunterladen
2. Auf Seite 5-5 "Set Factory Defaults" scannen. Achtung dabei werden alle zuvor getätigten Einstellungen im Scanner zurückgesetzt.
3. Scanner wieder auf das Cradle welches am PC angeschlossen ist setzen (falls vorhanden) um den Scanner mit dem Cradle zu verbinden.
4. Auf Seite 8-13 "Disable Keypad Emulation" scannen.
5. Auf Seite B-15 "Swiss German" scannen wenn man möchte, dass die meisten Zeichen gemäß der Deutschen Tastaur zurückgegeben werden.

Problem ist also gelöst, Thread kann somit geschlossen werden. Danke sehr!
 
  • Ich liebe es
Reaktionen: Stephan Handke