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