Inhaltsverzeichnis

std.edi.transport

Multimodaler Transportauftrag und Sendungsstatus per EDIFACT. Alle 8 Nachrichtentypen teilen denselben Header (EDI_TRN_HDR). IFTMIN beschreibt den vollständigen Transportauftrag mit beliebig vielen Beförderungsabschnitten (Legs). IFTDGN enthält Gefahrgutinformationen (DGD-Struct). IFTSTA übermittelt den Sendungsstatus.

IFTSTA-Statuscodes:

Konstante Wert Bedeutung
EDI_TRN_STA_PICKEDUP 1 Abgeholt
EDI_TRN_STA_INTRANSIT 2 Unterwegs
EDI_TRN_STA_DELAYED 3 Verzögert
EDI_TRN_STA_DELIVERED 4 Zugestellt

Transportmodi (IFTMIN Legs):

Wert Bedeutung
1 See
2 Schiene
3 Straße
4 Luft

import std.edi.transport;

// IFTSTA — Sendungsstatus "Unterwegs"
var hdr: int64 := alloc(EDI_TRN_HDR_SIZE);
poke64(hdr + EDI_TRN_HDR_REF,        "SHP-2026-001" as int64);
poke64(hdr + EDI_TRN_HDR_REFLEN,     12);
poke64(hdr + EDI_TRN_HDR_DATE,       "20261201" as int64);
poke64(hdr + EDI_TRN_HDR_DEPARTURE,  "DEHAM" as int64);  // Hamburg
poke64(hdr + EDI_TRN_HDR_DEPARTLEN,  5);
poke64(hdr + EDI_TRN_HDR_ARRIVAL,    "USLAX" as int64);  // Los Angeles
poke64(hdr + EDI_TRN_HDR_ARRIVALLEN, 5);
poke64(hdr + EDI_TRN_HDR_STATUSCODE, EDI_TRN_STA_INTRANSIT);

// Statuscode vorab prüfen
var rc: int64 := EdiIftstaStatusCheck(EDI_TRN_STA_INTRANSIT);
// rc=0: bekannter Code, rc=1: Warnung (unbekannt)

var out: int64 := alloc(4096);
var n: int64 := EdiIftstaWrite(hdr, out, 4096);

free(hdr, EDI_TRN_HDR_SIZE);
free(out, 4096);


Imports


Structs

EdiTrnHdr (EDI_TRN_HDR_SIZE = 112 Bytes)

Gemeinsamer Header für alle 8 Nachrichtentypen.

Offset-Konstante Inhalt
EDI_TRN_HDR_BGMQUAL BGM-Qualifier (automatisch gesetzt)
EDI_TRN_HDR_REF / EDI_TRN_HDR_REFLEN Auftrags-/Dokumentreferenz
EDI_TRN_HDR_DATE / EDI_TRN_HDR_DATELEN Datum
EDI_TRN_HDR_DEPARTURE / EDI_TRN_HDR_DEPARTLEN Abgangspunkt (LOC+87, z. B. UN/LOCODE)
EDI_TRN_HDR_ARRIVAL / EDI_TRN_HDR_ARRIVALLEN Bestimmungsort (LOC+88)
EDI_TRN_HDR_CARRIER / EDI_TRN_HDR_CARRIERLEN Spediteur/Carrier (NAD+CA)
EDI_TRN_HDR_BOOKINGREF / EDI_TRN_HDR_BOOKINGLEN Buchungsreferenz (RFF+BN) — Pflicht für IFTFCC
EDI_TRN_HDR_STATUSCODE IFTSTA-Statuscode (1–4)

EdiTrnLeg (EDI_TRN_LEG_SIZE = 40 Bytes)

Ein Beförderungsabschnitt innerhalb eines IFTMIN-Auftrags. IFTMIN kann beliebig viele Legs enthalten — z. B. LKW zum Hafen → Schiff → Bahn zu Empfänger.

Offset-Konstante Inhalt
EDI_TRN_LEG_DEPARTURE / EDI_TRN_LEG_DEPARTLEN Abgangsort des Abschnitts (LOC+9)
EDI_TRN_LEG_ARRIVAL / EDI_TRN_LEG_ARRIVALLEN Ankunftsort des Abschnitts (LOC+11)
EDI_TRN_LEG_MODE Transportmodus: 1=See, 2=Schiene, 3=Straße, 4=Luft

Wire pro Leg: TDT+20+modeLOC+9+departureLOC+11+arrival.

EdiDgd (EDI_DGD_SIZE = 64 Bytes)

Gefahrgutinformation für IFTDGN. Pro Sendung können mehrere DGD-Strukturen vorkommen.

Offset-Konstante Inhalt
EDI_DGD_UNNUMBER / EDI_DGD_UNNUMLEN UN-Nummer (genau 4 Stellen, z. B. „1203“ für Benzin)
EDI_DGD_IMDGCLASS / EDI_DGD_IMDGLEN IMDG-Klasse (z. B. „3“, „8“, „6.1“)
EDI_DGD_PACKINGGROUP Verpackungsgruppe 1–3 (I=höchste, III=niedrigste Gefahr)
EDI_DGD_EMSCODE / EDI_DGD_EMSLEN EMS-Code (Emergency Schedule, z. B. „F-E,S-E“)
EDI_DGD_QTY Menge in der Sendung

Wire: DGS+ADR+unNum+imdgClass+packingGroup+emsCode.


Validierungsfunktionen

Signatur Beschreibung
EdiUnNumberCheck(ptr: int64, len: int64): int64 Prüft UN-Nummer: genau 4 Ziffern (0000–9999). Gibt 1=gültig, 0=ungültig.
EdiIftstaStatusCheck(code: int64): int64 Prüft IFTSTA-Statuscode: 1–4 bekannt → 0; sonst 1 (Warnung, nicht Fehler).
EdiIftfccCheck(hdr: int64): int64 Gibt 2 (Fehler) wenn keine Buchungsreferenz (RFF+BN) vorhanden — Pflichtfeld in IFTFCC.

Funktionen

Einfache Transport-Nachrichten

Write-Funktion Read-Funktion Beschreibung
EdiIftmbcWrite(hdr, out, outMax) EdiIftmbcRead(buf, bufLen, hdr) IFTMIN-Antwort
EdiIftmcsWrite(hdr, out, outMax) EdiIftmcsRead(buf, bufLen, hdr) Vertragsstatus
EdiIftmanWrite(hdr, out, outMax) EdiIftmanRead(buf, bufLen, hdr) Ankunftsankündigung
EdiIfcsumWrite(hdr, out, outMax) EdiIfcsumRead(buf, bufLen, hdr) Frachtabrechnung
EdiIftstaWrite(hdr, out, outMax) EdiIftstaRead(buf, bufLen, hdr) Sendungsstatus
EdiIftfccWrite(hdr, out, outMax) EdiIftfccRead(buf, bufLen, hdr) Frachtkosten

Nachrichten mit Leg-Array (IFTMIN)

Signatur Beschreibung
EdiIftminWrite(hdr: int64, legs: int64, legCount: int64, out: int64, outMax: int64): int64 Schreibt Transportauftrag mit N Beförderungsabschnitten.
EdiIftminRead(buf: int64, bufLen: int64, hdr: int64, legs: int64, maxLegs: int64): int64 Parst IFTMIN; gibt Anzahl der Legs zurück.

Gefahrgutmeldung (IFTDGN)

Signatur Beschreibung
EdiIftdgnWrite(hdr: int64, dgds: int64, dgdCount: int64, out: int64, outMax: int64): int64 Schreibt Gefahrgutmeldung mit N DGD-Einträgen.
EdiIftdgnRead(buf: int64, bufLen: int64, hdr: int64, dgds: int64, maxDgds: int64): int64 Parst IFTDGN; gibt DGD-Anzahl zurück.

Codebeispiel — IFTMIN Multimodaler Transportauftrag

import std.edi.transport;

var hdr: int64 := alloc(EDI_TRN_HDR_SIZE);
poke64(hdr + EDI_TRN_HDR_REF,        "IFTMIN-2026-888" as int64);
poke64(hdr + EDI_TRN_HDR_REFLEN,     15);
poke64(hdr + EDI_TRN_HDR_DATE,       "20261201" as int64);
poke64(hdr + EDI_TRN_HDR_DEPARTURE,  "CNSHA" as int64);  // Shanghai
poke64(hdr + EDI_TRN_HDR_DEPARTLEN,  5);
poke64(hdr + EDI_TRN_HDR_ARRIVAL,    "DEHAM" as int64);  // Hamburg
poke64(hdr + EDI_TRN_HDR_ARRIVALLEN, 5);
poke64(hdr + EDI_TRN_HDR_CARRIER,    "EVER GIVEN SHIPPING" as int64);
poke64(hdr + EDI_TRN_HDR_CARRIERLEN, 19);
poke64(hdr + EDI_TRN_HDR_BOOKINGREF, "BK-2026-004212" as int64);
poke64(hdr + EDI_TRN_HDR_BOOKINGLEN, 14);

// 2 Legs: See Shanghai→Rotterdam, dann Schiene Rotterdam→Hamburg
var legs: int64 := alloc(2 * EDI_TRN_LEG_SIZE);

poke64(legs + 0 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_DEPARTURE, "CNSHA" as int64);
poke64(legs + 0 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_DEPARTLEN, 5);
poke64(legs + 0 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_ARRIVAL,   "NLRTM" as int64);
poke64(legs + 0 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_ARRIVALLEN,5);
poke64(legs + 0 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_MODE,      1);  // See

poke64(legs + 1 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_DEPARTURE, "NLRTM" as int64);
poke64(legs + 1 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_DEPARTLEN, 5);
poke64(legs + 1 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_ARRIVAL,   "DEHAM" as int64);
poke64(legs + 1 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_ARRIVALLEN,5);
poke64(legs + 1 * EDI_TRN_LEG_SIZE + EDI_TRN_LEG_MODE,      2);  // Schiene

var out: int64 := alloc(8192);
var n: int64 := EdiIftminWrite(hdr, legs, 2, out, 8192);

free(legs, 2 * EDI_TRN_LEG_SIZE);
free(hdr, EDI_TRN_HDR_SIZE);
free(out, 8192);


Codebeispiel — IFTDGN Gefahrgutmeldung

import std.edi.transport;

var hdr: int64 := alloc(EDI_TRN_HDR_SIZE);
poke64(hdr + EDI_TRN_HDR_REF,        "DGN-2026-042" as int64);
poke64(hdr + EDI_TRN_HDR_REFLEN,     12);
poke64(hdr + EDI_TRN_HDR_DATE,       "20261201" as int64);

var dgds: int64 := alloc(EDI_DGD_SIZE);

// UN 1203 = Benzin (Klasse 3, Verpackungsgruppe II)
var unNum: pchar := "1203";
if (EdiUnNumberCheck(unNum as int64, 4) == 0) {
    PrintLn("Ungültige UN-Nummer");
}

poke64(dgds + EDI_DGD_UNNUMBER,    unNum as int64);
poke64(dgds + EDI_DGD_UNNUMLEN,    4);
poke64(dgds + EDI_DGD_IMDGCLASS,  "3" as int64);
poke64(dgds + EDI_DGD_IMDGLEN,    1);
poke64(dgds + EDI_DGD_PACKINGGROUP,2);  // Gruppe II
poke64(dgds + EDI_DGD_EMSCODE,    "F-E,S-E" as int64);
poke64(dgds + EDI_DGD_EMSLEN,     7);
poke64(dgds + EDI_DGD_QTY,        200);

var out: int64 := alloc(4096);
var n: int64 := EdiIftdgnWrite(hdr, dgds, 1, out, 4096);

free(dgds, EDI_DGD_SIZE);
free(hdr, EDI_TRN_HDR_SIZE);
free(out, 4096);


Hinweise


Quelldatei

Unit Datei
std.edi.transport std/edi/transport.lyx

Letzte Aktualisierung: 2026-06-16