====== std.edi.inventory ====== Lagerbestand und Absatzdaten per EDIFACT. Alle drei Nachrichtentypen bauen auf einfachen Positionsstrukturen auf. Umsätze werden als ''int64 × 100'' (Festkomma) gespeichert. * **INVRPT** (BGM 35) — Inventory Report: Lagerbestand pro Artikel und Lagerort * **SLSRPT** (BGM 843) — Sales Report: Absatzdaten pro Artikel und Verkaufsstelle * **SLSFCT** (BGM 844) — Sales Forecast: Absatzprognose mit optionaler Konfidenzangabe (0–100) pro Position Bestandstypen (INVRPT): ^ Konstante ^ QTY-Qualifier ^ Bedeutung ^ | 1 | 1 | On-hand (verfügbar) | | 2 | 2 | On-order (bestellt, noch nicht geliefert) | | 3 | 3 | In-transit (unterwegs) | Periodenqualifikatoren (SLSRPT/SLSFCT): ^ Wert ^ Bedeutung ^ | 617 | Woche | | 610 | Monat | | 102 | Tag | import std.edi.inventory; import std.alloc; import std.string; fn Feld(p: int64, l: int64): pchar { var b: int64 := alloc(l + 1); var i: int64 := 0; while (i < l) { poke8(b + i, peek8(p + i)); i := i + 1; } poke8(b + l, 0); return b as pchar; } fn main(): int64 { // INVRPT: Bestand und Zulauf je Artikel var lines: int64 := alloc(2 * EDI_INV_LINE_SIZE); var i: int64 := 0; while (i < 2 * EDI_INV_LINE_SIZE) { poke8(lines + i, 0); i := i + 1; } poke64(lines + EDI_INV_LINE_GTIN, "04012345678901"c as int64); poke64(lines + EDI_INV_LINE_GTINLEN, 14); poke64(lines + EDI_INV_LINE_WAREHOUSE, "4012345000009"c as int64); poke64(lines + EDI_INV_LINE_WHLEN, 13); poke64(lines + EDI_INV_LINE_QTY, 480); poke64(lines + EDI_INV_LINE_TYPE, 1); // 1 = verfuegbarer Bestand var l1: int64 := lines + EDI_INV_LINE_SIZE; poke64(l1 + EDI_INV_LINE_GTIN, "04012345678901"c as int64); poke64(l1 + EDI_INV_LINE_GTINLEN, 14); poke64(l1 + EDI_INV_LINE_WAREHOUSE, "4012345000009"c as int64); poke64(l1 + EDI_INV_LINE_WHLEN, 13); poke64(l1 + EDI_INV_LINE_QTY, 120); poke64(l1 + EDI_INV_LINE_TYPE, 3); // 3 = unterwegs var out: int64 := alloc(4096); var n: int64 := EdiInvrptWrite("BST-MELD-09"c, "20260813"c, lines, 2, out, 4096); PrintLn(Feld(out, n)); var l2: int64 := alloc(8 * EDI_INV_LINE_SIZE); var cnt: int64 := EdiInvrptRead(out, n, l2, 8); PrintLn(StrConcat("Bestandszeilen: ", IntToStr(cnt))); // SLSRPT: Abverkauf einer Woche var sl: int64 := alloc(EDI_SLS_LINE_SIZE); i := 0; while (i < EDI_SLS_LINE_SIZE) { poke8(sl + i, 0); i := i + 1; } poke64(sl + EDI_SLS_LINE_GTIN, "04012345678901"c as int64); poke64(sl + EDI_SLS_LINE_GTINLEN, 14); poke64(sl + EDI_SLS_LINE_POSGLN, "4012345000016"c as int64); poke64(sl + EDI_SLS_LINE_POSGLNLEN, 13); poke64(sl + EDI_SLS_LINE_PERIOD, 617); // 617 = Woche poke64(sl + EDI_SLS_LINE_DATE, "20260803"c as int64); poke64(sl + EDI_SLS_LINE_DATELEN, 8); poke64(sl + EDI_SLS_LINE_QTY, 312); poke64(sl + EDI_SLS_LINE_REVENUE, 623688); // 6236,88 EUR poke64(sl + EDI_SLS_LINE_CURRENCY, "EUR"c as int64); poke64(sl + EDI_SLS_LINE_CURRENCYLEN, 3); n := EdiSlsrptWrite("ABV-2026-32"c, "20260810"c, sl, 1, out, 4096); PrintLn(Feld(out, n)); // SLSFCT: Prognose mit Konfidenz poke64(sl + EDI_SLS_LINE_QTY, 340); poke64(sl + EDI_SLS_LINE_CONFIDENCE, 85); n := EdiSlsfctWrite("PROG-2026-33"c, "20260810"c, sl, 1, out, 4096); PrintLn(Feld(out, n)); return 0; } BGM+35+BST-MELD-09+9'DTM+137:20260813:102'LIN+1++04012345678901:SRV'LOC+9:4012345000009'QTY+1:480'LIN+2++04012345678901:SRV'LOC+9:4012345000009'QTY+3:120'CNT+2:2' Bestandszeilen: 2 BGM+843+ABV-2026-32+9'DTM+137:20260810:102'LIN+1++04012345678901:SRV'LOC+9:4012345000016'DTM+2:20260803:617'QTY+12:312'MOA+9:6236.88:EUR'CNT+2:1' BGM+844+PROG-2026-33+9'DTM+137:20260810:102'LIN+1++04012345678901:SRV'LOC+9:4012345000016'DTM+2:20260803:617'QTY+12:340'MOA+9:6236.88:EUR'FTX+ACB+++85'CNT+2:1' Der Bestandstyp steht im Qualifier des QTY-Segments: ''QTY+1'' verfügbarer Bestand, ''QTY+2'' bestellt, ''QTY+3'' unterwegs. Je Artikel **und** Bestandsart wird eine eigene LIN-Zeile geschrieben — derselbe Artikel taucht also mehrfach auf. ---- ===== Imports ===== * ''std.edi.core'' * ''std.alloc'' ---- ===== Structs ===== ==== EdiInventoryLine (EDI_INV_LINE_SIZE = 64 Bytes) ==== ^ Offset-Konstante ^ Inhalt ^ | ''EDI_INV_LINE_GTIN / EDI_INV_LINE_GTINLEN'' | GTIN-Zeiger und -Länge | | ''EDI_INV_LINE_WAREHOUSE / EDI_INV_LINE_WHLEN'' | GLN des Lagerorts | | ''EDI_INV_LINE_QTY'' | Bestandsmenge | | ''EDI_INV_LINE_UNIT / EDI_INV_LINE_UNITLEN'' | Mengeneinheit (optional) | | ''EDI_INV_LINE_TYPE'' | Bestandstyp: 1=on-hand, 2=on-order, 3=in-transit | ==== EdiSalesLine (EDI_SLS_LINE_SIZE = 96 Bytes) ==== ^ Offset-Konstante ^ Inhalt ^ | ''EDI_SLS_LINE_GTIN / EDI_SLS_LINE_GTINLEN'' | GTIN-Zeiger und -Länge | | ''EDI_SLS_LINE_POSGLN / EDI_SLS_LINE_POSGLNLEN'' | GLN Verkaufsstelle (POS) | | ''EDI_SLS_LINE_PERIOD'' | Periodenqualifikator: 617=Woche, 610=Monat, 102=Tag | | ''EDI_SLS_LINE_DATE / EDI_SLS_LINE_DATELEN'' | Periodenanfangsdatum | | ''EDI_SLS_LINE_QTY'' | Verkaufte/prognostizierte Menge | | ''EDI_SLS_LINE_REVENUE'' | Umsatz × 100 (Festkomma) | | ''EDI_SLS_LINE_CURRENCY / EDI_SLS_LINE_CURRENCYLEN'' | Währungscode | | ''EDI_SLS_LINE_CONFIDENCE'' | Konfidenz 0–100 (nur SLSFCT, sonst 0) | ---- ===== Funktionen ===== ^ Write-Funktion ^ Read-Funktion ^ Beschreibung ^ | ''EdiInvrptWrite(refNum, date, lines, lineCount, out, outMax)'' | ''EdiInvrptRead(buf, bufLen, lines, maxLines)'' | Lagerbestand | | ''EdiSlsrptWrite(refNum, date, lines, lineCount, out, outMax)'' | ''EdiSlsrptRead(buf, bufLen, lines, maxLines)'' | Absatzbericht | | ''EdiSlsfctWrite(refNum, date, lines, lineCount, out, outMax)'' | ''EdiSlsfctRead(buf, bufLen, lines, maxLines)'' | Absatzprognose | Alle Write-Funktionen setzen automatisch den BGM-Qualifier. Alle Read-Funktionen geben die Anzahl der gelesenen Zeilen zurück. Zero-Copy: Zeiger in ''lines'' zeigen in ''buf''. ---- ===== Hinweise ===== * **Eine LIN-Zeile je Bestandsart**: Wer für einen Artikel Bestand, Zulauf und Unterwegsmenge melden will, legt drei Zeilen mit demselben GTIN und unterschiedlichem ''EDI_INV_LINE_TYPE'' an. * **Periodenqualifier bei SLSRPT/SLSFCT**: ''617'' = Woche, ''610'' = Monat, ''102'' = Tag. Er landet als drittes Element im ''DTM+2''-Segment. * **Umsatz ist ×100**: ''623688'' wird zu ''MOA+9:6236.88''. Die Währung steht als drittes Element im selben Segment. * **Konfidenz nur bei SLSFCT**: ''EDI_SLS_LINE_CONFIDENCE'' (0–100) schreibt ''EdiSlsfctWrite'' als ''FTX+ACB''. Bei ''EdiSlsrptWrite'' wird das Feld ignoriert — beide teilen sich dieselbe Zeilen-Struct. * **Gleiche Struct, drei Nachrichten**: SLSRPT (BGM 843) und SLSFCT (BGM 844) unterscheiden sich nur im BGM-Qualifier und im Konfidenzfeld. ---- ===== Quelldatei ===== ^ Unit ^ Datei ^ | ''std.edi.inventory'' | ''std/edi/inventory.lyx'' | Letzte Aktualisierung: 2026-08-13 — ein durchgehendes, lauffähiges Beispiel für INVRPT, SLSRPT und SLSFCT mit echter Ausgabe (lyxc 1.0.21A); Hinweise zu Bestandsarten, Periodenqualifier und Konfidenzfeld ergänzt Codebeispiele geprüft: gegen **lyxc 1.2.5C** übersetzt (Prüflauf 2026-09-08 über die gesamte Doku: 574 Vollprogramme, 0 echte Fehler; zusätzlich 5159 Aufrufe gegen die ''pub fn''-Signaturen in ''aurum/std'' gehalten, 0 Abweichungen).