Mittwoch, 23. August 2017

Java Snipped Checksumme für Barcode NVE / SSCC

Wer gerne seine Paletten bzw. Versandeinheiten international einmalig kennzeichnen möchte und über eine GLN Nummer verfügt, benötigt spätestens dann eine Palettenlabel mit entsprechendem Barcode.

Der Barcode für die NVE (Nummer der Versandeinheit) besteht aus einem UCC-128 bzw EAN-128 Barcode, der neuerdings auch unter GS1-128 geführt wird. Bei diesem Barcode handelt es sich grundsätzlich um einen Code128 der durch ein unsichtbares Sonderzeichen  (FNC1) an der ersten Stelle im Code als GS1-128 von Lesegeräten interpretiert wird. Die GS1-128 Spezifikation kann auch in anderen zweidimensionalen Codes z.B. in Datamatrix- oder QR-Codes abgebildet werden.

GS1-128 Barcodes werden von der Industrie genutzt, um verschiedene Informationen innerhalb eines Barcodes zu kodieren und mittels so genannten Datenbezeichnern von einander zu trennen. Diese Bezeichner können zwei- bis vierstellig sein und werden im lesbaren Text von runten Klammern umrahmt. Diese Steuerzeichen geben Aufschluss darüber, wie die folgenden Daten zu interpretieren sind. Es sei noch erwähnt, dass es Datenfelder mit festen Längen sowie Felder mit variabelen Längen gibt. Wird z.b eine Mengenzahl kodiert mittels des Bezeichners (37) kann die anschließende Feldlänge ein bis 6 stellig sein. Damit die Trennung zum nächsten Bezeichner klar ist, kann mit führenden Nullen auf die maximale Länge aufgefüllt werden. Es empfiehlt sich aber mittels Sonderzeichen FNC1 einfach nach der eigentlichen Mengenzahl das Ende zu definieren.

Damit man sich keine all zu großen Gedanken, vor allem über Sonder FNC1-Codes, machen muss, kann man sich der der Java- und C-Bibliothek "iText 5" oder "iText 7" bedienen. Die kann ohne großen Aufwand einen UCC-128 bzw. EAN-128 Barcode direkt über einen String mit inkl. Klammern und Datenbezeichner erzeugen.

    
Mini Snipped für Java mit iText 5:

Document document = new Document(PageSize.A6, 10,10,10,10);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
document.open();

Barcode128 barcode = new Barcode128();
barcode.setCodeType(Barcode.CODE128_UCC);
barcode.setCode("(02)" + label.gtin + "(37)" + label.anz_ve + "(15)" + label.mhd_code + "(10)" + label.lot);
barcode.setBarHeight(mmToPoints(27));

Image code = barcode.createImageWithBarcode(writer.getDirectContent(), BaseColor.BLACK, BaseColor.BLACK);

code.setAbsolutePosition(mmToPoints(5), mmToPoints(50));
code.scalePercent(125);
document.add(code);

Hier wird im Code die EAN bzw GTIN mittels Bezeichner (02), die Anzahl der EAN mittels Zeichen (37), das Mindesthaltbarkeitsdatum (15) sowie der Chargencode mittels (10) kodiert. Die FNC1 Sonderzeichen werden automatisch gesetzt.

Möchte man nun die NVE / SSCC Nummer als Barcode darstellen, wird einfach mittels Bezeichner (00) + Reservenr + GLN-Nummer + Laufendenummer (frei wählbar) + Prüfziffer (Checksum) mit iText kodiert. Reservenr kann zw. 0-9 liegen. Die maximale Länge der laufenden Nummer ergibt sich aus der GLN Nummer. Ist diese z.B. 9-stellig bleiben 7 Stellen für die laufende Nummer. Insgesamt kommt man dann auf 17 Stellen (ohne (00)), mit Prüfziffer (Checksum) auf 18 Stellen.

Die Prüfziffer berechnet sich wie folgt:

Die einzelnen Zahlen der GLN+laufenden Nummer werden rückwärts abwechselnd mit 3 und 1 multipliziert. Begonnen wird immer mit 3. Die Summe der einzelnen Ergebnisse wird aufgerundet auf die nächste 10er Stelle (48 => 50). Die Prüfziffer ergibt sich aus der Differenz von Ergebnis und Gesamtsumme.

Beispiel:
Res.Nr. = 3
GLN = 123456789
Lfnd.Nr = 12345678
NVE ohne Prüfziffer = 31234567891234567
Gesamtsumme =  7*1 + 6*3 + 5*1 + 4*3 + 3*1 + 2*3 + 1*1 + 9*3 + 8*1 + 7*3 + 6*1 + 5*3 + 4*1 + 3*3 + 2*1 + 1*3 + 3*1 = 154
Aufgerundet = 160
Prüfziffer (Checksum) = 154 - 160 = 6
NVE = 31234567891234567 6

Hier ein kleines Java Snippet dafür:


private String generateChecksum(String palnr) {
int checksum = 0;
char[] c = palnr.toCharArray();
int summe = 0;
int multiplikator = 3; //Startwert ist immer 3

for(int i = c.length - 1; i >= 0; i-- ){

summe += c[i] * multiplikator;

//Multiplikator wird ständig gewechselt
if(multiplikator == 1) {
multiplikator = 3;
} else {
multiplikator = 1;
}
}
    checksum = (10 - summe % 10) % 10; // 10 wird zu 0
    return checksum + ""; //Rückgabewert in String umwandeln
}








Donnerstag, 18. September 2014

iOS8 auf dem iPhone 4S - Traust du dich?

Vorfreude und Installation

Wie ein kleines Kind auf das Christkind wartend, hing ich gestern Abend vor iTunes und hämmerte auf den Update Knopf. "Es konnte keine Verbindung zum Server hergestellt werden"! Verdammter Mist. "May be THIS time, May be THIS time, May be THIS time, May be THIS time, ..."  NOT!

Dann fiel mir auf, dass ich, im Gegensatz zur iOS7 Umstellung, das Update "over the air" also direkt per Wlan auf's Telefon laden konnte. Zumindest in der Theorie. Denn iOS8 fordert auf meinem Telefon 4,6GB freien Speicher. Na toll! ich will aber nicht meine Fotos runterschmeißen, das ist nur wirder Ärgern. Nun ja, ich sicherte meine Daten dann mal per iTunes-Backup-Funktion und kopierte meine Fotos manuell auf meine externe Platte.

iOS8, ich sehe dich deutlich vor mir! "Update angefordert" hieß es dann erstmal und waaaarten. Gnarf. Ich hasse warten vor, allem auf das Christkind!

Heute Morgen war es dann soweit. Ich konnte updaten. KLICK! - Update läuft...
Um mir die Zeit etwas zu vertreiben googelte ich (Okay Google, schreibt man eigentlich googElte oder googlete?) nach "iOS8 iPhone4S" und laß erschreckende Berichte - "Bloß nicht installieren!" schrieb Jens, "iPhone 4S Nutzer nicht auf iOS8 updaten, Finger weg, alles wird lahm!", schrieb Lena. "Warum lässt Apple die Installation auf dem 4S zu wenn es nichts bringt!", meckert Detlef
- Die Fortschrittsanzeige meines Handys zeigte mir mit 25% den Stinkefinger - "Na gut..", dachte ich, was soll's, lass die mal alle labern.

Beurteilung


Neustart und iMessage

Mein iPhone 4S startet neu und läuft hervorragend, okay teilweise. Erst einmal sieht alles so aus wie vorher. Als erstes fällt mir auf, dass ich per iMessage nun auch Voice-Nachrichten versenden. Gesagt, gesendet... FRAGEZEICHEN [?] das ist alles was bei meinem Gesprächspartner ankam. Umgekehrt genauso. So ein Mist, haben die den Kram nicht vorher getestet? Ein Neustart von iMessage hat das Problem dann gelöst. Sehr geil ist, dass die Audiofiles sich quasi nach dem Abhören in Luft auflösen bzw. sich selbst terminieren! Push2Talk nur weniger nervig.

Beim hin und her senden von Screenshots sprang mir auch gleich ins Auge, dass ich direkt bei der Bildauswahl die letzten 4 Fotos, die ich gemacht habe, angezeigt bekommen und auswählen kann. Klasse, nur dass das Bild von gerade noch fehlt! Wo ist es denn nur? Nochmal probiert, dann kam es. Komisch. Ist mein Phone vielleicht zu langsam?

Geschwindigkeit

Zum Thema Geschwindigkeit ist mir nicht viel Negatives aufgefallen. Es hakelt ab und an, aber nicht doll. Das Gerät reagiert promt, wenn ich es per Touch steuere. Nur gelegentlich dauert es eine Sekunde bis sich was tut.

Quick-Fazit

Sind es die kleinen Ruckler, die die Kritiker bemängeln? Damit kann ich leben, denn auf die Neuerungen, wie die verbesserte Texteingabe mit brauchbaren Vorschlägen usw. sind unverzichtbar und eine wahre Erlösung. iOS8 auf dem iPhone 4S: kein Problem sag ich! Drauf damit.

...so liebes iPad installier mal... Klick .... 5,8GB Platz????? WTF