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