std.hl7.results

Result Reporting — parst und erzeugt ORU^R01- (Unsolicited Observation Result) und OUL^R22-Nachrichten (Unsolicited Specimen Oriented Observation Result). Dekodiert einzelne OBX-Beobachtungen und NTE-Kommentare sowie den übergeordneten Befundkopf (OBR/PID) in klare Structs.

import std.hl7.results;
import std.alloc;

// ORU^R01 parsen
var report: int64 := alloc(HL7_RPT_SIZE);
Hl7OruParse(msgBuf, msgLen, report);

// Erste OBX-Beobachtung parsen (manuell Segment suchen)
var obxSeg: int64 := // ... OBX-Segment-Zeiger
var obx: int64 := alloc(HL7_OBX_SIZE);
Hl7ObxParse(obxSeg, obxSegLen, obx);

// Kritischen Wert prüfen
if (peek64(obx + HL7_OBX_ISCRIT) == 1) {
    // Sofortmeldung an Arzt (Panikwert: HH/LL/AA/CC)
}

// Korrigierten Befund erkennen
if (peek64(obx + HL7_OBX_ISCORR) == 1) {
    // Vorherigen Befund im Archiv ersetzen
}

free(obx, HL7_OBX_SIZE);
free(report, HL7_RPT_SIZE);


Imports

  • std.hl7.core
  • std.alloc

Structs

Hl7ObxResult — Einzelbeobachtung (HL7_OBX_SIZE = 144 Bytes)

Ein OBX-Segment entspricht einer Laborbeobachtung (Messwert, Text, Bild-Referenz …). Alle Felder zeigen in den Originalpuffer (Zero-Copy).

Offset-Konstante Offset OBX-Feld Inhalt
HL7_OBX_SETID / _LEN 0 / 8 OBX-1 Set-ID (Sequenznummer innerhalb der Nachricht)
HL7_OBX_VALTYPE / _LEN 16 / 24 OBX-2 Wertetyp (NM=Zahl, ST=Text, TX=Langer Text, CWE=kodierter Begriff, SN=Struktur-Zahl, FT=Formatted Text, RP=Referenz-Zeiger)
HL7_OBX_OBSID / _LEN 32 / 40 OBX-3 Beobachtungs-ID (LOINC-Code und Name)
HL7_OBX_VALUE / _LEN 48 / 56 OBX-5 Messwert / Ergebnis
HL7_OBX_UNIT / _LEN 64 / 72 OBX-6 Einheit (UCUM-Code, z. B. mg/dL, 10*3/uL)
HL7_OBX_REFRANGE / _LEN 80 / 88 OBX-7 Referenzbereich (z. B. 3.5-5.5)
HL7_OBX_ABNFLAG / _LEN 96 / 104 OBX-8 Abnormal-Flag (N/A/H/L/HH/LL/AA/CC)
HL7_OBX_STATUS / _LEN 112 / 120 OBX-11 Beobachtungsstatus (F/P/C/W/X/D)
HL7_OBX_ISCRIT 128 1 wenn OBX-8 = AA, LL, HH oder CC (Panikwert)
HL7_OBX_ISCORR 136 1 wenn OBX-11 = C (Corrected) oder W (Wrong)

Abnormal-Flags (OBX-8):

Flag Bedeutung
N Normal
A Abnormal
H High
L Low
HH Critical High (Panikwert)
LL Critical Low (Panikwert)
AA Critical Abnormal (Panikwert)
CC Critical Abnormal — bestätigt (Panikwert)

Beobachtungsstatus (OBX-11):

Status Bedeutung
F Final — endgültig freigegeben
P Preliminary — vorläufig
C Corrected — korrigierter Befund
W Wrong — fehlerhafter Befund (wurde storniert)
X Storniert — kein Ergebnis vorhanden
D Gelöscht

Hl7NteNote — Kommentar (HL7_NTE_SIZE = 16 Bytes)

Offset-Konstante Offset NTE-Feld Inhalt
HL7_NTE_TEXT / _LEN 0 / 8 NTE-3 Kommentartext (freetext)

Hl7Report — Befundkopf (HL7_RPT_SIZE = 104 Bytes)

Enthält die übergeordneten Informationen einer ORU/OUL-Nachricht — nicht die einzelnen Beobachtungen (die stehen in OBX und müssen separat über Hl7ObxParse geparst werden).

Offset-Konstante Offset Quelle Inhalt
HL7_RPT_EVENT / _LEN 0 / 8 MSH-9.2 Trigger-Event (R01 / R22)
HL7_RPT_PAT_ID / _LEN 16 / 24 PID-3.1 Patienten-ID
HL7_RPT_PLACER / _LEN 32 / 40 OBR-2 Auftraggeber-Nummer
HL7_RPT_FILLER / _LEN 48 / 56 OBR-3 Auftragnehmer-Nummer
HL7_RPT_SERVICE / _LEN 64 / 72 OBR-4 Universal Service ID (Leistungsschlüssel)
HL7_RPT_OBS_DT / _LEN 80 / 88 OBR-7 Beobachtungszeitpunkt
HL7_RPT_MSGTYPE 96 1 = ORUR01, 2 = OULR22

Funktionen

Segmente parsen

Signatur Beschreibung
Hl7ObxParse(seg: int64, segLen: int64, obx: int64): void Parst OBX-Segment; setzt automatisch ISCRIT=1 bei Panikwert-Flags (AA/LL/HH/CC); setzt ISCORR=1 bei Status C oder W
Hl7NteParse(seg: int64, segLen: int64, note: int64): void Parst NTE-Segment; extrahiert NTE-3 (Kommentartext)

Vollständige Nachrichten parsen

Signatur Beschreibung
Hl7OruParse(msg: int64, len: int64, report: int64): void Parst ORUR01; füllt Befundkopf (Patient-ID, Placer/Filler, Service, OBS-Datum) aus MSH, PID und OBR; einzelne OBX-Segmente müssen separat via Hl7ObxParse geparst werden; setzt MSGTYPE=1
Hl7OulParse(msg: int64, len: int64, report: int64): void Parst OULR22 (Proben-orientierter Befund); identisches Layout; setzt MSGTYPE=2

Nachrichten schreiben

Signatur Beschreibung
Hl7OruWrite(report: int64, obx: int64, out: int64, outMax: int64): int64 Schreibt ORUR01 mit MSH+OBR+einem OBX-Segment; gibt Bytes zurück. Für mehrere OBX-Segmente: mehrfach aufrufen und Ausgaben konkatenieren (oder manuell weitere OBX anhängen)

Codebeispiel — Laborbefund verarbeiten

import std.hl7.results;
import std.alloc;

fn processLabResult(msgBuf: int64, msgLen: int64): void {
    // Befundkopf parsen
    var report: int64 := alloc(HL7_RPT_SIZE);
    Hl7OruParse(msgBuf, msgLen, report);

    var patId:   int64 := peek64(report + HL7_RPT_PAT_ID);
    var service: int64 := peek64(report + HL7_RPT_SERVICE);
    var obsDt:   int64 := peek64(report + HL7_RPT_OBS_DT);

    // OBX-Segmente manuell aus Nachricht extrahieren und parsen
    // (OBX-Segmente beginnen mit CR+'OBX|')
    var obx: int64 := alloc(HL7_OBX_SIZE);

    // ... OBX-Segment-Zeiger und Länge ermitteln (z. B. per Segment-Scanner) ...
    // Hl7ObxParse(obxSegPtr, obxSegLen, obx);

    // Panikwert-Behandlung
    if (peek64(obx + HL7_OBX_ISCRIT) == 1) {
        var val:  int64 := peek64(obx + HL7_OBX_VALUE);
        var flag: int64 := peek64(obx + HL7_OBX_ABNFLAG);
        // Arzt sofort benachrichtigen ...
    }

    // Korrektur-Befund
    if (peek64(obx + HL7_OBX_ISCORR) == 1) {
        // Vorherigen Befund im KIS überschreiben ...
    }

    // Gegenbefund als ORU schreiben
    var outBuf: int64 := alloc(4096);
    var outLen: int64 := Hl7OruWrite(report, obx, outBuf, 4096);
    // Weiterleiten ...

    free(outBuf, 4096);
    free(obx, HL7_OBX_SIZE);
    free(report, HL7_RPT_SIZE);
}


Hinweise

  • ORU vs. OUL: ORU^R01 ist der verbreitete allgemeine Befundtyp (Laborbefunde, Mikrobiologie, Pathologie). OUL^R22 ist probenorientiert — es gibt ein Ergebnis pro Probe statt pro Auftrag.
  • Mehrere OBX-Segmente: Eine ORU-Nachricht enthält typischerweise viele OBX-Segmente (eines pro Laborparameter). Hl7OruParse füllt nur den Kopf — alle OBX müssen über Hl7ObxParse in Schleife geparst werden.
  • Panikwerte: Kritische Abnormal-Flags (HH/LL/AA/CC in OBX-8) lösen ISCRIT=1 aus. Das Krankenhausinformationssystem (KIS) muss diese sofort an den zuständigen Arzt melden.
  • Korrektur-Befunde: OBX-11 = 'C' (Corrected) oder 'W' (Wrong) setzt ISCORR=1. Ein korrigierter Befund muss vorherige vorläufige Befunde im Archiv ersetzen.
  • LOINC und UCUM: OBX-3 enthält typischerweise einen LOINC-Code (Untersuchungsidentifikation); OBX-6 enthält UCUM-Einheiten. Die Unit speichert diese als rohe Zeichenketten ohne Lookup.
  • NTE-Kommentare: NTE-Segmente folgen direkt nach dem OBX, dem sie zugeordnet sind. Hl7NteParse extrahiert nur NTE-3 (Freitext); andere NTE-Felder werden ignoriert.

Quelldatei

Unit Datei
std.hl7.results std/hl7/results.lyx

Letzte Aktualisierung: 2026-06-16