====== 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