====== std.hl7.adt ======
Patient Administration (ADT) — parst und erzeugt ADT^Axx-Nachrichten für alle Patientenvorgänge: Aufnahme, Entlassung, Verlegung, Datenänderung und Patientenzusammenführung (Merge). Die Unit dekodiert PID, PV1, MRG und NK1 aus einer einzigen Nachricht in klar strukturierte Structs.
import std.hl7.adt;
import std.alloc;
// ADT^A01 (Aufnahme) parsen
var adt: int64 := alloc(HL7_ADT_SIZE);
Hl7AdtParse(msgBuf, msgLen, adt);
// Patienten-ID auslesen
var pid: int64 := adt + HL7_ADT_PID;
var idPtr: int64 := peek64(pid + HL7_PID_ID1);
var idLen: int64 := peek64(pid + HL7_PID_ID1_LEN);
// Bettbelegung auslesen
var pv1: int64 := adt + HL7_ADT_PV1;
var bed: int64 := peek64(pv1 + HL7_PV1_LBED);
// Merge-Ereignis erkennen
if (peek64(adt + HL7_ADT_ISMERGE) == 1) {
var mrg: int64 := adt + HL7_ADT_MRG;
var oldId: int64 := peek64(mrg + HL7_MRG_PID);
// Zusammenführung durchführen ...
}
free(adt, HL7_ADT_SIZE);
----
===== Imports =====
* ''std.hl7.core''
* ''std.alloc''
----
===== Structs =====
Alle Structs verwenden das Zero-Copy-Prinzip: Zeiger verweisen in den Originalnachrichtenpuffer.
==== Hl7Pid — Patient Identification (HL7_PID_SIZE = 176 Bytes) ====
^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^
| ''HL7_PID_ID1 / _LEN'' | 0 / 8 | PID-3[1] | Erste Patienten-ID (z. B. MPI) |
| ''HL7_PID_ID2 / _LEN'' | 16 / 24 | PID-3[2] | Zweite Patienten-ID (Repeat) |
| ''HL7_PID_ID3 / _LEN'' | 32 / 40 | PID-3[3] | Dritte Patienten-ID (Repeat) |
| ''HL7_PID_NAME / _LEN'' | 48 / 56 | PID-5 | Vollständiges Namensfeld (Rohwert) |
| ''HL7_PID_FAMILY / _LEN'' | 64 / 72 | PID-5.1 | Nachname |
| ''HL7_PID_GIVEN / _LEN'' | 80 / 88 | PID-5.2 | Vorname |
| ''HL7_PID_BIRTH / _LEN'' | 96 / 104 | PID-7 | Geburtsdatum (YYYYMMDD) |
| ''HL7_PID_SEX / _LEN'' | 112 / 120 | PID-8 | Geschlecht (M/F/U) |
| ''HL7_PID_ADDR / _LEN'' | 128 / 136 | PID-11 | Adresse |
| ''HL7_PID_PHONE / _LEN'' | 144 / 152 | PID-13 | Telefonnummer |
| ''HL7_PID_INSID / _LEN'' | 160 / 168 | PID-19 | Versicherten-/Sozialversicherungsnummer |
PID-3 kann bis zu 3 Wiederholungen enthalten (Tilde ''~'' als Trennzeichen). ''Hl7PidParse'' füllt alle drei ID-Slots.
==== Hl7Pv1 — Patient Visit (HL7_PV1_SIZE = 160 Bytes) ====
^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^
| ''HL7_PV1_VISIT / _LEN'' | 0 / 8 | PV1-19 | Besuchsnummer |
| ''HL7_PV1_CLASS / _LEN'' | 16 / 24 | PV1-2 | Patientenklasse (I/O/E) |
| ''HL7_PV1_LOC / _LEN'' | 32 / 40 | PV1-3 | Standort vollständig (Rohwert) |
| ''HL7_PV1_LPOINT / _LEN'' | 48 / 56 | PV1-3.1 | Standort-Punkt |
| ''HL7_PV1_LROOM / _LEN'' | 64 / 72 | PV1-3.2 | Zimmer |
| ''HL7_PV1_LBED / _LEN'' | 80 / 88 | PV1-3.3 | Bett |
| ''HL7_PV1_LFAC / _LEN'' | 96 / 104 | PV1-3.4 | Einrichtung |
| ''HL7_PV1_ATTDOC / _LEN'' | 112 / 120 | PV1-7 | Behandelnder Arzt |
| ''HL7_PV1_ADMIT / _LEN'' | 128 / 136 | PV1-44 | Aufnahmezeit |
| ''HL7_PV1_DISCH / _LEN'' | 144 / 152 | PV1-45 | Entlassungszeit |
Patientenklassen: ''I'' = Inpatient (stationär), ''O'' = Outpatient (ambulant), ''E'' = Emergency (Notfall)
==== Hl7Mrg — Patient Merge (HL7_MRG_SIZE = 48 Bytes) ====
^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^
| ''HL7_MRG_PID / _LEN'' | 0 / 8 | MRG-1 | Alte Patienten-ID (wird aufgelöst) |
| ''HL7_MRG_ACCT / _LEN'' | 16 / 24 | MRG-3 | Alte Kontonummer |
| ''HL7_MRG_VISIT / _LEN'' | 32 / 40 | MRG-5 | Alte Besuchsnummer |
==== Hl7Nk1 — Next of Kin (HL7_NK1_SIZE = 48 Bytes) ====
^ Offset-Konstante ^ Offset ^ HL7-Feld ^ Inhalt ^
| ''HL7_NK1_NAME / _LEN'' | 0 / 8 | NK1-2 | Name des Angehörigen |
| ''HL7_NK1_REL / _LEN'' | 16 / 24 | NK1-3 | Beziehung (z. B. „SPO" für Ehepartner) |
| ''HL7_NK1_PHONE / _LEN'' | 32 / 40 | NK1-5 | Telefonnummer |
==== Hl7Adt — Vollständige ADT-Nachricht (HL7_ADT_SIZE = 544 Bytes) ====
Kombinierter Struct mit direkt eingebetteten Sub-Structs. Zeiger auf die Sub-Structs über Offset-Konstanten:
^ Offset-Konstante ^ Offset ^ Inhalt ^
| ''HL7_ADT_EVENT / _LEN'' | 0 / 8 | Trigger-Event (z. B. „A01") |
| ''HL7_ADT_ISMERGE'' | 16 | ''1'' wenn dies ein Merge-Ereignis ist (A34–A45) |
| ''HL7_ADT_HASMRG'' | 24 | ''1'' wenn MRG-Segment in der Nachricht vorhanden |
| ''HL7_ADT_SEND_APP / _LEN'' | 32 / 40 | Sendende Applikation |
| ''HL7_ADT_SEND_FAC / _LEN'' | 48 / 56 | Sendende Einrichtung |
| ''HL7_ADT_RECV_APP / _LEN'' | 64 / 72 | Empfangende Applikation |
| ''HL7_ADT_RECV_FAC / _LEN'' | 80 / 88 | Empfangende Einrichtung |
| ''HL7_ADT_CTRL_ID / _LEN'' | 96 / 104 | Nachrichten-Kontroll-ID |
| ''HL7_ADT_PID'' | 112 | Beginn des PID-Structs (176 Bytes) |
| ''HL7_ADT_PV1'' | 288 | Beginn des PV1-Structs (160 Bytes) |
| ''HL7_ADT_MRG'' | 448 | Beginn des MRG-Structs (48 Bytes) |
| ''HL7_ADT_NK1'' | 496 | Beginn des NK1-Structs (48 Bytes) |
----
===== Funktionen =====
==== Segmente einzeln parsen ====
^ Signatur ^ Beschreibung ^
| ''Hl7PidParse(seg: int64, segLen: int64, pid: int64): void'' | Parst PID-Segment; behandelt Wiederholungen (''~'') in PID-3; extrahiert Nachname/Vorname aus PID-5 Komponenten |
| ''Hl7Pv1Parse(seg: int64, segLen: int64, pv1: int64): void'' | Parst PV1-Segment; zerlegt PV1-3 in Standort-Komponenten (Punkt/Zimmer/Bett/Einrichtung) |
| ''Hl7MrgParse(seg: int64, segLen: int64, mrg: int64): void'' | Parst MRG-Segment |
| ''Hl7Nk1Parse(seg: int64, segLen: int64, nk1: int64): void'' | Parst NK1-Segment |
==== Vollständige Nachricht parsen / schreiben ====
^ Signatur ^ Beschreibung ^
| ''Hl7AdtParse(msg: int64, len: int64, adt: int64): void'' | Parst vollständige ADT-Nachricht; findet Segmente automatisch per CR+3-Buchstaben-Name-Scan; füllt alle Sub-Structs; setzt ''HL7_ADT_HASMRG=1'' wenn MRG gefunden; setzt ''HL7_ADT_ISMERGE'' via ''Hl7AdtIsMerge'' |
| ''Hl7AdtWrite(adt: int64, event: int64, out: int64, outMax: int64): int64'' | Schreibt MSH+PID+PV1+[MRG wenn HASMRG=1]; ''event'' null-terminiert (z. B. ''„A01"''); schreibt MSH-11=''P'' und MSH-12=''2.5.1''; gibt Bytes zurück |
| ''Hl7AdtIsMerge(eventPtr: int64, eventLen: int64): int64'' | ''1'' wenn das Event ein Merge-Ereignis ist (A34, A35, A36, A39–A45) |
----
===== Merge-Ereignisse =====
''Hl7AdtIsMerge'' erkennt folgende Trigger-Events als Merge:
^ Event ^ Bedeutung ^
| A34 | Merge Patient Info — Patient ID only |
| A35 | Merge Patient Info — Account Number only |
| A36 | Merge Patient Info — Patient ID and Account Number |
| A39 | Merge Person — Patient ID |
| A40 | Merge Patient — Patient Identifier List |
| A41 | Merge Account — Patient Account Number |
| A42 | Merge Visit — Visit Number |
| A43 | Move Patient Information — Patient Identifier List |
| A44 | Move Account Information — Patient Account Number |
| A45 | Move Visit Information — Visit Number |
Bei Merge-Ereignissen enthält ''HL7_ADT_MRG'' die alte (aufzulösende) Identität; ''HL7_ADT_PID'' enthält die neue (verbleibende) Identität.
----
===== Codebeispiel — Aufnahme und Verlegung =====
import std.hl7.adt;
import std.alloc;
fn handleAdmission(msgBuf: int64, msgLen: int64) {
var adt: int64 := alloc(HL7_ADT_SIZE);
Hl7AdtParse(msgBuf, msgLen, adt);
var pid: int64 := adt + HL7_ADT_PID;
var pv1: int64 := adt + HL7_ADT_PV1;
// Patientenname und ID
var fam: int64 := peek64(pid + HL7_PID_FAMILY);
var giv: int64 := peek64(pid + HL7_PID_GIVEN);
var pid1: int64 := peek64(pid + HL7_PID_ID1);
// Stationszuweisung
var room: int64 := peek64(pv1 + HL7_PV1_LROOM);
var bed: int64 := peek64(pv1 + HL7_PV1_LBED);
var cls: int64 := peek64(pv1 + HL7_PV1_CLASS);
// Merge-Sonderfall
if (peek64(adt + HL7_ADT_ISMERGE) == 1) {
var mrg: int64 := adt + HL7_ADT_MRG;
var oldPid: int64 := peek64(mrg + HL7_MRG_PID);
// mergePatients(oldPid, pid1);
}
// Neue ADT-A08-Nachricht (Update) erstellen
var outBuf: int64 := alloc(4096);
var outLen: int64 := Hl7AdtWrite(adt, "A08"c as int64, outBuf, 4096);
free(outBuf, 4096);
free(adt, HL7_ADT_SIZE);
}
----
===== Hinweise =====
* **Zero-Copy**: Alle ''Parse''-Funktionen setzen Zeiger in den Originalpuffer — kein Kopieren. Der Nachrichtenpuffer muss während der gesamten Verarbeitung des ADT-Structs gültig bleiben.
* **PID-3 Repeats**: ''Hl7PidParse'' verarbeitet bis zu drei ''~''-getrennte Wiederholungen in PID-3 (ID1, ID2, ID3). In der Praxis enthält PID-3 oft nur eine ID.
* **Merge-Logik**: ''Hl7AdtIsMerge'' prüft den Event-Code; ''HL7_ADT_HASMRG'' zeigt an ob physisch ein MRG-Segment vorhanden war. Beide können zusammen auftreten.
* **Hl7AdtWrite**: Erzeugt immer MSH+PID+PV1. MRG wird nur angehängt wenn ''HL7_ADT_HASMRG=1''. NK1 wird nicht geschrieben (nur lesbar).
----
===== Quelldatei =====
^ Unit ^ Datei ^
| ''std.hl7.adt'' | ''std/hl7/adt.lyx'' |
Letzte Aktualisierung: 2026-06-16