std.edi.orders
Bestellprozess per EDIFACT: Bestellung, Auftragsbestätigung und Änderungsauftrag. Alle vier NAD-Rollen (Käufer, Lieferant, Lieferadresse, Rechnungsempfänger) werden beim Lesen automatisch extrahiert.
ORDERS (BGM 220) — Bestellung (Purchase Order)
ORDRSP (BGM 231) — Auftragsbestätigung mit positionsgenauen Status-Codes
ORDCHG (BGM 230) — Änderungsauftrag mit laufender Änderungsnummer
import std.edi.orders;
// Bestellung mit 2 Positionen aufbauen
var hdr: int64 := alloc(EDI_ORDER_HDR_SIZE);
var lines: int64 := alloc(2 * EDI_ORDER_LINE_SIZE);
// Kopf: Bestellnummer, Datum, GLN Käufer
poke64(hdr + EDI_ORDER_HDR_NUM, "PO-2026-0042" as int64);
poke64(hdr + EDI_ORDER_HDR_NUMLEN, 12);
poke64(hdr + EDI_ORDER_HDR_DATE, "20261201" as int64);
poke64(hdr + EDI_ORDER_HDR_BUYER_GLN, "4012345000009" as int64);
poke64(hdr + EDI_ORDER_HDR_BUYER_GLNL,13);
// Position 1
poke64(lines + EDI_ORDER_LINE_GTIN, "04012345678901" as int64);
poke64(lines + EDI_ORDER_LINE_GTINLEN, 14);
poke64(lines + EDI_ORDER_LINE_QTY, 100);
poke64(lines + EDI_ORDER_LINE_PRICE, 1599); // 15,99 €
// Gesamtbetrag für Validierung
poke64(hdr + EDI_ORDER_HDR_TOTAL, 159900); // 1599,00 €
var out: int64 := alloc(16384);
var n: int64 := EdiOrdersWrite(hdr, lines, 2, out, 16384);
free(lines, 2 * EDI_ORDER_LINE_SIZE);
free(hdr, EDI_ORDER_HDR_SIZE);
free(out, 16384);
Imports
Structs
EdiOrderLine (EDI_ORDER_LINE_SIZE = 80 Bytes)
| Offset-Konstante | Inhalt |
EDI_ORDER_LINE_GTIN / EDI_ORDER_LINE_GTINLEN | GTIN-Zeiger und -Länge |
EDI_ORDER_LINE_QTY | Bestellmenge |
EDI_ORDER_LINE_UNIT / EDI_ORDER_LINE_UNITLEN | Mengeneinheit (optional) |
EDI_ORDER_LINE_PRICE | Einzelpreis × 100 (Festkomma) |
EDI_ORDER_LINE_TAXRATE | Steuersatz × 100 (z. B. 1900 = 19,00 %) |
EDI_ORDER_LINE_DATE | Zeiger auf Lieferdatum „YYYYMMDD“ (0 = kein Wunschtermin) |
EDI_ORDER_LINE_STATUS | Position-Status: 0=normal, 1=bestätigt, 5=geändert, 7=abgelehnt |
EDI_ORDER_LINE_LINENO | Zeilennummer (1-basiert) |
EdiOrderHdr (EDI_ORDER_HDR_SIZE = 112 Bytes)
| Offset-Konstante | Inhalt |
EDI_ORDER_HDR_NUM / EDI_ORDER_HDR_NUMLEN | Bestellnummer |
EDI_ORDER_HDR_DATE / EDI_ORDER_HDR_DATELEN | Bestelldatum |
EDI_ORDER_HDR_BUYER_GLN / EDI_ORDER_HDR_BUYER_GLNL | GLN Käufer (NAD+BY) |
EDI_ORDER_HDR_SUP_GLN / EDI_ORDER_HDR_SUP_GLNL | GLN Lieferant (NAD+SU) |
EDI_ORDER_HDR_DELIV_GLN / EDI_ORDER_HDR_DELIV_GLNL | GLN Lieferadresse (NAD+DP) |
EDI_ORDER_HDR_INV_GLN / EDI_ORDER_HDR_INV_GLNL | GLN Rechnungsempfänger (NAD+IV) |
EDI_ORDER_HDR_TOTAL | Gesamtbetrag × 100 (MOA+77) |
EDI_ORDER_HDR_CHANGENO | Änderungsnummer (ORDCHG: muss pro Änderung erhöht werden) |
Funktionen
ORDERS
| Signatur | Beschreibung |
EdiOrdersWrite(hdr: int64, lines: int64, lineCount: int64, out: int64, outMax: int64): int64 | Schreibt ORDERS. Gibt -1 wenn Bestellnummer fehlt. |
EdiOrdersRead(buf: int64, bufLen: int64, hdr: int64, lines: int64, maxLines: int64): int64 | Parst ORDERS; befüllt hdr und lines. Gibt Zeilenanzahl zurück. Alle 4 NAD-Rollen werden extrahiert. |
EdiOrdersValidate(hdr: int64, lines: int64, lineCount: int64): int64 | Prüft ob Summe aller Positionen (qty×price) dem Kopf-Gesamtbetrag entspricht. Toleranz: 1 Cent. Gibt 0=ok, 1=Abweichung. |
ORDRSP — Auftragsbestätigung
| Signatur | Beschreibung |
EdiOrdrspWrite(orderRef: int64, confirmNum: int64, lines: int64, lineCount: int64, out: int64, outMax: int64): int64 | Schreibt ORDRSP mit Positionsstatus (STATUS-Feld der Zeilen: 1=bestätigt, 5=geändert, 7=abgelehnt) |
EdiOrdrspRead(buf: int64, bufLen: int64, hdr: int64, lines: int64, maxLines: int64): int64 | Parst ORDRSP; gibt Zeilenanzahl zurück |
ORDCHG — Änderungsauftrag
| Signatur | Beschreibung |
EdiOrdchgWrite(orderRef: int64, changeNo: int64, lines: int64, lineCount: int64, out: int64, outMax: int64): int64 | Schreibt ORDCHG. changeNo muss mit jeder Änderung erhöht werden (EDIFACT-Pflicht). |
EdiOrdchgRead(buf: int64, bufLen: int64, hdr: int64, lines: int64, maxLines: int64): int64 | Parst ORDCHG; befüllt hdr.EDI_ORDER_HDR_CHANGENO |
Codebeispiel — Auftragsbestätigung lesen
import std.edi.orders;
var hdr: int64 := alloc(EDI_ORDER_HDR_SIZE);
var lines: int64 := alloc(100 * EDI_ORDER_LINE_SIZE);
var count: int64 := EdiOrdrspRead(inBuf, inBufLen, hdr, lines, 100);
var i: int64 := 0;
while (i < count) {
var line: int64 := lines + i * EDI_ORDER_LINE_SIZE;
var status: int64 := peek64(line + EDI_ORDER_LINE_STATUS);
if (status == 7) {
PrintLn("Position abgelehnt: " + IntToStr(i + 1));
}
i := i + 1;
}
free(lines, 100 * EDI_ORDER_LINE_SIZE);
free(hdr, EDI_ORDER_HDR_SIZE);
Hinweise
Änderungsnummer ORDCHG: EDI_ORDER_HDR_CHANGENO muss mit jeder neuen ORDCHG inkrementiert werden. Die Gegenseite erkennt damit, ob sie die aktuellste Änderung sieht.
NAD-Rollen: EdiOrdersRead extrahiert alle vier Rollen. Nicht vorhandene Rollen haben Zeiger 0 und Länge 0.
Gesamtbetrag-Validierung: EdiOrdersValidate erlaubt 1 Cent Rundungsabweichung — das entspricht dem üblichen EDIFACT-Standard.
Quelldatei
| Unit | Datei |
std.edi.orders | std/edi/orders.lyx |
Letzte Aktualisierung: 2026-06-16