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