std.edi

EDI/EDIFACT-Bibliothek für den elektronischen Datenaustausch im Handel, Logistik, Seefrachtverkehr und Finanzwesen. Die Bibliothek deckt den vollständigen B2B-Nachrichtenfluss ab — von der Preisanfrage bis zur Zollanmeldung. Alle 14 Units basieren auf std.edi.core und setzen Zero-External-Dependencies um: kein EDIFACT-Framework, kein externer Parser.

UN/EDIFACT (United Nations / Electronic Data Interchange for Administration, Commerce and Transport) ist der internationale Standard für den elektronischen Datenaustausch zwischen Unternehmen. Eine EDIFACT-Nachricht besteht aus Segmenten (3-Buchstaben-Codes wie UNB, LIN, MOA), die durch Trennzeichen abgegrenzt werden. Die Lyx-Bibliothek implementiert den UNOA-Zeichensatz als Standard.

Standard-Trennzeichen (UNOA):

Komponente Trennzeichen ':, Code 58
Datenelement Trennzeichen '+', Code 43
Dezimalzeichen . (Punkt), Code 46
Escape-Zeichen ?, Code 63
Segment-Ende (Apostroph), Code 39 | ^ Unit ^ BGM / Funktion ^ Beschreibung ^ | std.edi.core | — | EDIFACT-Kern: Parsing, UNA/UNB/UNZ, Segment-/Element-Iteration, Duplikatserkennung | | std.edi.messages | CONTRL, APERAK, GENRAL | Infrastruktur-Nachrichten: Quittung, Fehlermeldung, allgemeine Nachricht | | std.edi.catalog | PRICAT, PARTIN, PROACT | Stammdaten: Preiskatalog, Partnerinfo, Aktionen | | std.edi.partner | AS2/SFTP-Profile | Partner-Registry: AS2/SFTP-Verbindungsparameter, Nachrichtentypen-Bitmask | | std.edi.rfq | REQOTE (311), QUOTES (315) | Anfrage-/Angebotsprozess: Preisanfrage und Angebotsrückmeldung | | std.edi.orders | ORDERS (220), ORDRSP (231), ORDCHG (230) | Bestellprozess: Bestellung, Auftragsbestätigung, Bestelländerung | | std.edi.invoice | INVOIC (380/381/383/386), INVCON (44), COMDIS (34), COACSU (36) | Rechnungsstellung, Disputmeldung, Saldenabstimmung | | std.edi.shipping | DESADV (351), RECADV (632) | Lieferschein mit SSCC-Hierarchie, Wareneingangsbestätigung | | std.edi.payment | REMADV, PAYMUL, PAYORD, DIRDEB u. a. (13 Typen) | Zahlungsverkehr: Avis, Sammelaufträge, Lastschrift, Akkreditiv | | std.edi.inventory | INVRPT (35), SLSRPT (843), SLSFCT (844) | Lagermeldung, Absatzbericht, Absatzprognose | | std.edi.delfor | DELFOR (241), DELJIT (251) | Lieferabruf (bis 52 Wochen), JIT-Abruf (minutengenau) | | std.edi.customs | CUSCAR (85), CUSDEC (960), CUSEXP (962), CUSRSP (961) | Zollmeldungen: Frachtanmeldung, Zollanmeldung, Behördenantwort | | std.edi.seafreight | BAPLIE, MOVINS, COPARN, CODECO, COARRI, COPINO, COPRAR, VERMAS, HANMOV (9 Typen) | Seefracht: Stauplan, Containermeldungen, VGM-Gewicht (SOLAS) | | std.edi.transport | IFTMIN (310), IFTMBC, IFTMCS, IFTMAN, IFCSUM, IFTSTA (214), IFTDGN (350), IFTFCC (8 Typen) | Multimodaler Transport: Auftrag, Status, Gefahrgutmeldung | —- ===== Designprinzipien ===== * Zero-Copy-Parsing — alle Read-Funktionen setzen Zeiger in den Originalpuffer; kein Kopieren von Strings * Caller-allocates — jede Struct-Größe ist als EDI_*_SIZE-Konstante exportiert; der Aufrufer allokiert, die Bibliothek schreibt * Festkomma-Geldbeträge — alle Beträge werden als int64 × 100 gespeichert (1999 = 19,99 €) * GS1-Validierung integriert — GTIN (Mod-10, 8/12/13/14-stellig), GLN (Mod-10, 13-stellig), SSCC-18, IBAN (MOD-97), BIC (8/11 Zeichen), ISO-6346-Container, UN-Nummer (4-stellig exakt) * Keine Netzwerkschicht — EDI-Nachrichten werden als Puffer übergeben; Transport (AS2, SFTP) erfolgt über separate Units —- ===== Schnellstart — Eingehende EDIFACT-Nachricht parsen =====
import std.edi.core;

// 1. Kontext initialisieren
var ctx: int64 := alloc(EDI_CTX_SIZE);
var seg: int64 := alloc(EDI_SEGCTX_SIZE);
var una: int64 := alloc(EDI_UNA_SIZE);
EdiCtxInit(ctx);

// 2. UNA lesen (setzt Trennzeichen im Kontext)
var rc: int64 := EdiUnaRead(una, inBuf, inBufLen, ctx);

// 3. Segmente iterieren
EdiSegCtxInit(seg, inBuf, inBufLen, ctx);
var s: int64 := alloc(EDI_SEG_SIZE);

while (EdiSegmentNext(seg, s) == 1) {
    // Segmentname via EdiElementSplit / EdiComponentSplit auslesen
    var elem: int64 := alloc(EDI_ELEM_SIZE);
    EdiElementSplit(s, 0, elem);
    // elem zeigt jetzt auf den Segmentnamen im Originalpuffer
    free(elem, EDI_ELEM_SIZE);
}

free(s, EDI_SEG_SIZE);
free(seg, EDI_SEGCTX_SIZE);
free(una, EDI_UNA_SIZE);
free(ctx, EDI_CTX_SIZE);
—- ===== Typische Nachrichtenflüsse ===== Bestellprozess (Beschaffung)
Lieferant                          Käufer
                 ← REQOTE (RFQ)
QUOTES →
                 ← ORDERS
ORDRSP →
                 ← (ORDCHG bei Änderungen)
DESADV →
                 ← RECADV
INVOIC →
                 ← REMADV (Zahlungsavis)
Seefrachtcontainer
Terminal/Carrier    Reefer/Verlader
COPARN →            (Anmeldung Einlauf)
← CODECO            (Gate-In)
← BAPLIE            (Stauplan)
← VERMAS            (VGM-Gewicht, SOLAS)
← COARRI            (Ankunft)
← COPINO            (Pick-up-Freigabe)
—- ===== Quelldateien ===== Alle Units liegen in
std/edi/: ^ Unit ^ Datei ^ | std.edi.core | std/edi/core.lyx | | std.edi.messages | std/edi/messages.lyx | | std.edi.catalog | std/edi/catalog.lyx | | std.edi.partner | std/edi/partner.lyx | | std.edi.rfq | std/edi/rfq.lyx | | std.edi.orders | std/edi/orders.lyx | | std.edi.invoice | std/edi/invoice.lyx | | std.edi.shipping | std/edi/shipping.lyx | | std.edi.payment | std/edi/payment.lyx | | std.edi.inventory | std/edi/inventory.lyx | | std.edi.delfor | std/edi/delfor.lyx | | std.edi.customs | std/edi/customs.lyx | | std.edi.seafreight | std/edi/seafreight.lyx | | std.edi.transport | std/edi/transport.lyx''

Letzte Aktualisierung: 2026-06-16