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