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.corestd.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:
Hl7PidParseverarbeitet bis zu drei~-getrennte Wiederholungen in PID-3 (ID1, ID2, ID3). In der Praxis enthält PID-3 oft nur eine ID. - Merge-Logik:
Hl7AdtIsMergeprüft den Event-Code;HL7_ADT_HASMRGzeigt 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
