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