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

  • std.edi.core
  • std.alloc

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