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
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 = ORU | R01, 2 = OUL | R22 |
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 ORU | R01; 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 OUL | R22 (Proben-orientierter Befund); identisches Layout; setzt MSGTYPE=2 |
Nachrichten schreiben
| Signatur | Beschreibung | |
Hl7OruWrite(report: int64, obx: int64, out: int64, outMax: int64): int64 | Schreibt ORU | R01 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