====== 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'' = 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