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.

  • IFTMIN (BGM 310) — Instruction for the Movement of Goods: Transportauftrag mit Legs
  • IFTMBC (BGM 311) — Response to IFTMIN: Auftragsbestätigung/-ablehnung
  • IFTMCS (BGM 312) — Instruction Contract Status: Vertragsstatus
  • IFTMAN (BGM 313) — Arrival Notice: Ankündigungsmeldung
  • IFCSUM (BGM 319) — Freight Invoice: Frachtabrechnung
  • IFTSTA (BGM 214) — Status: Sendungsstatus
  • IFTDGN (BGM 350) — Dangerous Goods Notification: Gefahrgutmeldung
  • IFTFCC (BGM 315) — Freight Costs and other Charges: Frachtkosten (Buchungsreferenz Pflicht)

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

  • std.edi.core
  • std.alloc

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

  • IFTFCC Buchungsreferenz Pflicht: EdiIftfccCheck gibt Fehler (2) zurück wenn keine Buchungsreferenz (RFF+BN) gesetzt ist. Vor EdiIftfccWrite immer prüfen.
  • UN-Nummer immer 4-stellig: EdiUnNumberCheck verlangt genau 4 Ziffern — also „0012“ statt „12“. Führende Nullen sind Teil der Nummer (z. B. 0004 = Ammoniumnitrat in Lösung).
  • Unbekannte IFTSTA-Codes: EdiIftstaStatusCheck warnt (1) bei unbekannten Codes, gibt aber keinen Fehler — ermöglicht eigene Erweiterungen.
  • Legs nur in IFTMIN: Nur EdiIftminWrite/Read akzeptiert ein Leg-Array. Alle anderen Nachrichten haben genau einen Abgangspunkt und einen Bestimmungsort im Header.

Quelldatei

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

Letzte Aktualisierung: 2026-06-16