====== std.edi.shipping ======
Lieferschein und Wareneingangsbestätigung per EDIFACT. DESADV bildet die dreistufige Verpackungshierarchie (Palette → Karton → Artikel) über die EDIFACT-Segmente CPS/PAC/GIN/LIN ab. Jedes Packstück trägt eine SSCC-18-Nummer zur lückenlosen Rückverfolgung.
* **DESADV** (BGM 351) — Dispatch Advice: Lieferschein mit Verpackungsstruktur und SSCC-Nummern
* **RECADV** (BGM 632) — Receiving Advice: Wareneingangsbestätigung mit Soll-/Ist-Mengen und optionalem Abweichungsgrund
SSCC-18-Funktionen:
* ''EdiSsccCheck'' — Prüft Prüfziffer (GS1 Mod-10)
* ''EdiSsccGenerate'' — Berechnet Prüfziffer aus 17-stelliger Basis
import std.edi.shipping;
// SSCC generieren
var base17: pchar := "00400000000000001"; // Erweiterungsziffer + GS1 Prefix + Seriennr.
var sscc: int64 := alloc(19); // 18 Ziffern + NUL
EdiSsccGenerate(base17 as int64, sscc);
PrintLn("SSCC: " + (sscc as pchar));
free(sscc, 19);
----
===== Imports =====
* ''std.edi.core''
* ''std.alloc''
----
===== Konstanten — Pakettypen =====
^ Konstante ^ Wert ^ Bedeutung ^
| ''EDI_PKG_PALLET'' | 1 | Palette (CPS+PAC mit Code 201) |
| ''EDI_PKG_CARTON'' | 2 | Karton (CPS+PAC mit Code CT) |
| ''EDI_PKG_ITEM'' | 3 | Artikel-Ebene (CPS+LIN+QTY) |
----
===== Structs =====
==== EdiPackage (EDI_PACKAGE_SIZE = 56 Bytes) ====
^ Offset-Konstante ^ Inhalt ^
| ''EDI_PACKAGE_SSCC / EDI_PACKAGE_SSCCLEN'' | SSCC-Zeiger (18 Zeichen) und -Länge |
| ''EDI_PACKAGE_TYPE'' | Pakettyp: ''EDI_PKG_PALLET'' / ''EDI_PKG_CARTON'' / ''EDI_PKG_ITEM'' |
| ''EDI_PACKAGE_PARENT'' | Index des übergeordneten Packstücks (0-basiert); ''-1'' wenn keins |
| ''EDI_PACKAGE_GTIN / EDI_PACKAGE_GTINLEN'' | GTIN (nur bei Items) |
| ''EDI_PACKAGE_QTY'' | Menge (nur bei Items) |
**Reihenfolge beim Schreiben**: Erst alle Paletten, dann Kartons, dann Artikel. Der Parent-Index verweist auf den 0-basierten Index im Array.
==== EdiRecadvLine (EDI_RECADV_LINE_SIZE = 56 Bytes) ====
^ Offset-Konstante ^ Inhalt ^
| ''EDI_RECADV_LINE_GTIN / EDI_RECADV_LINE_GTINLEN'' | GTIN-Zeiger und -Länge |
| ''EDI_RECADV_LINE_ORDERED'' | Bestellte Menge (QTY+21) |
| ''EDI_RECADV_LINE_DELIVERED'' | Gelieferte Menge (QTY+12) |
| ''EDI_RECADV_LINE_ACCEPTED'' | Akzeptierte Menge (QTY+192) |
| ''EDI_RECADV_LINE_REASON / EDI_RECADV_LINE_REASONLEN'' | Abweichungsgrund als Freitext (FTX+AAI, optional; 0 wenn keiner) |
----
===== Funktionen =====
==== SSCC-18-Validierung & -Generierung ====
^ Signatur ^ Beschreibung ^
| ''EdiSsccCheck(ptr: int64, len: int64): int64'' | Prüft SSCC-18-Prüfziffer (GS1 Mod-10). Gibt 1=gültig, 0=ungültig. Erwartet exakt 18 Stellen. |
| ''EdiSsccGenerate(base17: int64, out: int64): void'' | Berechnet Prüfziffer aus 17-stelliger Basis-SSCC. Schreibt 18 Stellen + NUL in ''out'' (mind. 19 Bytes). |
==== DESADV ====
^ Signatur ^ Beschreibung ^
| ''EdiDesadvWrite(refNum: int64, date: int64, packages: int64, packCount: int64, out: int64, outMax: int64): int64'' | Schreibt DESADV. Pakete müssen in Hierarchie-Reihenfolge vorliegen (Paletten → Kartons → Items). |
| ''EdiDesadvRead(buf: int64, bufLen: int64, packages: int64, maxPacks: int64): int64'' | Parst DESADV; gibt Paketanzahl zurück oder ''-1'' bei doppelter SSCC. |
==== RECADV ====
^ Signatur ^ Beschreibung ^
| ''EdiRecadvWrite(orderRef: int64, date: int64, lines: int64, lineCount: int64, out: int64, outMax: int64): int64'' | Schreibt RECADV mit Kreuzreferenz auf Bestellnummer (''RFF+ON''). |
| ''EdiRecadvRead(buf: int64, bufLen: int64, lines: int64, maxLines: int64): int64'' | Parst RECADV; gibt Zeilenanzahl zurück. |
----
===== Codebeispiel — DESADV mit Palettenstruktur =====
import std.edi.shipping;
// 1 Palette → 1 Karton → 2 Artikel
var packs: int64 := alloc(4 * EDI_PACKAGE_SIZE);
// Palette (Index 0, kein Parent)
poke64(packs + 0 * EDI_PACKAGE_SIZE + EDI_PACKAGE_SSCC, "004000000000000011" as int64);
poke64(packs + 0 * EDI_PACKAGE_SIZE + EDI_PACKAGE_SSCCLEN, 18);
poke64(packs + 0 * EDI_PACKAGE_SIZE + EDI_PACKAGE_TYPE, EDI_PKG_PALLET);
poke64(packs + 0 * EDI_PACKAGE_SIZE + EDI_PACKAGE_PARENT, 0 - 1);
// Karton (Index 1, Parent=0)
poke64(packs + 1 * EDI_PACKAGE_SIZE + EDI_PACKAGE_SSCC, "004000000000000028" as int64);
poke64(packs + 1 * EDI_PACKAGE_SIZE + EDI_PACKAGE_SSCCLEN, 18);
poke64(packs + 1 * EDI_PACKAGE_SIZE + EDI_PACKAGE_TYPE, EDI_PKG_CARTON);
poke64(packs + 1 * EDI_PACKAGE_SIZE + EDI_PACKAGE_PARENT, 0);
// Artikel 1 (Index 2, Parent=1)
poke64(packs + 2 * EDI_PACKAGE_SIZE + EDI_PACKAGE_GTIN, "04012345678901" as int64);
poke64(packs + 2 * EDI_PACKAGE_SIZE + EDI_PACKAGE_GTINLEN, 14);
poke64(packs + 2 * EDI_PACKAGE_SIZE + EDI_PACKAGE_QTY, 50);
poke64(packs + 2 * EDI_PACKAGE_SIZE + EDI_PACKAGE_TYPE, EDI_PKG_ITEM);
poke64(packs + 2 * EDI_PACKAGE_SIZE + EDI_PACKAGE_PARENT, 1);
var out: int64 := alloc(16384);
var n: int64 := EdiDesadvWrite(
"LFG-2026-001" as int64,
"20261201" as int64,
packs, 3, out, 16384);
free(packs, 4 * EDI_PACKAGE_SIZE);
free(out, 16384);
----
===== Hinweise =====
* **SSCC-Duplikatserkennung**: ''EdiDesadvRead'' gibt ''-1'' zurück wenn dieselbe SSCC-Nummer bereits im Pakete-Array vorkommt.
* **Hierarchie-Reihenfolge**: Beim Schreiben müssen Paletten (''EDI_PKG_PALLET'') vor Kartons und Artikel kommen. Das entspricht der CPS-Reihenfolge in EDIFACT.
* **RECADV Kreuzreferenz**: ''EdiRecadvWrite'' setzt automatisch ''RFF+ON'' mit dem ''orderRef''-Wert. So kann die Gegenseite Wareneingang und Bestellung zuordnen.
----
===== Quelldatei =====
^ Unit ^ Datei ^
| ''std.edi.shipping'' | ''std/edi/shipping.lyx'' |
Letzte Aktualisierung: 2026-06-16