ITC-Connect Funktionsreferenz

<< Klicken Sie, um das Inhaltsverzeichnis anzuzeigen >>

Navigation:  Technisches >

ITC-Connect Funktionsreferenz

Grundsätzliche Verarbeitung

Die Verarbeitung einer Inbound-Nachricht im Script erfolgt in einer Schleife über alle Segmente.

var

    aSegment: String;

begin

    While NextSegment(aSegment) do begin

        if aSegment='msh' then begin

         ... Bearbeitung des Segments ...

        end;

    end;

end.

Über die debug Direktive kann in der Testumgebung überall im Script eine Ausgabe erfolgen. Diese Ausgabe erfolgt nur im Kanaleditor in die Konsole.

  debug(aSegment);

Um Ausgaben im Produktivsystem zu machen, die dann im Protokoll erscheinen, ersetzen Sie debug durch writeln.

  writeln(aSegment);

Patientenakte suchen oder anlegen

Um Daten einer EMIL-Patientenakte zuordnen zu können, die evt. bereits existiert, benötigt man die ID des Sendenden Systems (hier immer KIS-ID) und die Angaben Vorname, Nachname und Geburtsdatum. Diese müssen zunächst imit GetData aus dem passenden Nachrichtensegment gelesen werden:

  aPID:=GetData('3-1-1-1');

  aLastName:=GetData('5-1-1-1');

  aFirstname:=GetData('5-1-2-1');

  aBirthDate:=StrToDateTime(GetData('7-1-1-1'),'yyyymmdd');

Datumsangaben werden im Script als Fließkommazahlen (Double) verarbeitet und können mit der Funktion StrToDateTime anhand einer Formatangabe konvertiert werden. Mit diesen Daten kann nun die Patientenakte in EMIL lokalisiert oder angelegt werden. Da es sein kann, dass diese Patientenakte gerade an einem Arbeitsplatz bearbeitet wird, wird versucht, sie zu sperren. Schlägt das fehl, liefert die Funktion false zurück und der Script wird ohne weitere Aktionen verlassen, die Nachricht wird dann bei der nächsten Verarbeitung erneut aufgerufen und geht nicht verloren.

  if not FindOrCreateSubject(aPID,aFirstname,aLastname,aBirthDate) then exit;

Diese Funktion sucht zunächst nach einer EMIL-Patientenakte, in der als KIS-Ident exakt die angegebene PID eingetragen ist. ITC-Connect entfernt automatisch führende Nullen von KIS-Idents, da diese in manchen Systemen in Nachrichten unterschiedlich mit und ohne führende Nullen angegeben werden, was dazu führen würde, dass Nachrichten nicht zugeordnet werden. ITC-Connect verarbeitet hier auch nicht numerische Identifikationen, die allerdings selten vorkommen.

clip0353

Wird eine Akte mit dieser Identifikation gefunden und weder Vor- noch Nachname stimmen überein, wird diese Akte verworfen und -1 als Aktennummer zurückgeliefert, da das Risiko dann sehr groß ist, dass eine falsche Akte zugeordnet wird. Dieser Mechanismus greift deshalb nur bei unterschiedlichem Vor- und Nachnamen, damit eine Namensänderung z.B. durch Heirat nicht zur Ablehnung der Zuordnung führt.

Wird keine Akte mit dieser Identifikation gefunden, sucht ITC-Connect über Vorname, Nachname, Geschlecht und Geburtsdatum. Da bei den üblichen Patientenzahlen einer Einrichtung die Wahrscheinlichkeit eines Dublette über all diese Parameter extrem unwahrscheinlich ist, wird diese Zuordnung als gültig angenommen und diese Akte zudem mit der PID versehen, um sie im Anschluss sicher über die PID zu finden.

Stammdaten aktualisieren

Wenn die Akte gefunden oder angelegt wurde, können die Stammdaten mit Daten aus der Nachricht aktualisiert werden. Hier empfiehlt es sich, nicht mit leeren Angaben zu überschreiben, um manuell nachgetragene Daten nicht zu beseitigen. Dafür dient die Funktion setSubjectInfo:

  if aLastName<>'' then setSubjectInfo('lastname',aLastName);

  ...

  if GetData('11-1-3-1')<>'' then setSubjectInfo('city',GetData('11-1-3-1'));

Neben setSubjectInfo stehen noch folgende Funktionen zur Verfügung, die teilweise auch Items in den festen Daten anlegen oder aktualisieren:

setGender

setBirthdate

AddRelatives (fügt nur neue Informationen zum Stammdaten-Feld Angehörge hinzu)

AddDiagnoses (fügt Zeilen zu Dauerdiagnosen hinzu, wenn noch nicht vorhanden oder enthaltener ICD-10 Code nicht bereits in den Dauerdiagosen enthalten ist

Krankenversicherungsdaten werden über eine spezielle Funktione hinzugefügt. Diese ersetzt vorherige Daten, sofern diese bereits vorhanden waren.

SetInsurance(IK, Nummer der Versicherung, Versichertennummer, Versichertenart, DMP-Kennzeichen, Besondere personengruppe, WOP-Kennzeichen);

Diese Funktion ermittelt die Versicherung wahlweise über das IK oder über die Nummer der Versicherung und füllt auch den Namen aus, basierend auf den Daten der offiziellen Kostenträger Stammdaten die in EMIL vorhanden sind und mit den Programmaktualisierungen auch aktualisiert werden.

Befunddaten

Befunddaten werden in ORU Nachrichten in OBR und OBX sowie NTE Segmenten übertragen. Da auf ein Ergebnisfeld OBX auch mehrere NTE Freitextelemente folgen können, müssen die Daten gesammelt und dann bei Segmentwechsel oder am Ende der Verarbeitung an EMIL übergeben werden. Der folgede Scriptcode sucht das Befunddatum aus dem OBR Segment heraus und sammelt dann die Befunddaten in den folgenden OBX und NTE Segmenten. Dabei wird zwischen OBX Befund (in der Regel ein Zahlenwert) und NTE Segmenttext unterschieden.

 ...

 else if aSegment='obr' then begin

      // if we have previous data we have to write it to the database

      if (aResultValue<>'') then 

         SetOrLearnResult(aResultDate,aResultIdent,aResultValue,aResultRange,

         aResultUnit,aResultTitle)

      else if (aResultText<>'') then   

         SetOrLearnResult(aResultDate,aResultIdent,aResultText,aResultRange,

         aResultUnit,aResultTitle);

      aResultDate:=StrToDateTime(GetData('7-1-1-1'),'yyyymmddhhnn');

      if aResultDate=0 then aResultDate:=StrToDateTime(GetData('14-1-1-1'),

      'yyyymmddhhnn');

      if aResultDate=0 then aResultDate:=StrToDateTime(GetData('22-1-1-1'),

      'yyyymmddhhnn');

      aResultValue:='';

      aResultText:='';     

    end else if (aSegment='obx') and (aResultDate>0) then begin

      // if we have previous data we have to write it to the database

      if (aResultValue<>'') then 

         SetOrLearnResult(aResultDate,aResultIdent,aResultValue,aResultRange,

         aResultUnit,aResultTitle)

      else if (aResultText<>'') then   

         SetOrLearnResult(aResultDate,aResultIdent,aResultText,aResultRange,

         aResultUnit,aResultTitle);

      aResultIdent:=GetData('3-1-1-1');

      aResultValue:=GetData('5-1-1-1');

      aResultRange:=GetData('7-1-1-1');

      aResultUnit:=GetData('6-1-1-1');

      aResultTitle:=GetData('3-1-2-1')+' '+GetData('3-1-3-1')+' '+

      GetData('3-1-4-1')+' '+GetData('3-1-5-1')+' '+

      GetData('3-1-6-1')+' '+GetData('3-1-8-1') 

      aResultText:=''; 

    end else if (aSegment='nte') and (aResultDate>0) and 

      (GetData('3-1-1-1')<>'') then 

      aResultText:=aResultText+' '+GetData('3-1-1-1');

  end;

Die Ausgabe und Rücksetzung erfolgt immer bei Start eines neuen OBR oder OBX Segmentes, dies ist erforderlich, da mehrere OBX/NTE Gruppen auf ein OBR Segment folgen können, beispielsweise, wenn Ergebnisse gebündelt zu einer Anforderung übertragen werden. Am Ende der Verarbeitungsschleife muss ein eventuell offener Befund auch noch übertragen werden!

Daten festschreiben und Nachricht aus Puffer löschen

Wenn die Verarbeitung fehlerfrei erfolgt ist, werden am Ende des Scriptes die Daten in der Datenbank festgeschrieben und die Nachricht wird aus dem Puffer gelöscht.

  SaveAndClose(debugging);

Mit dem Parameter debugging wird bewirkt, dass die Nachricht in der Scriptentwicklungsumgebung nicht gelöscht wird, da sonst nach jedem Lauf die Testnachricht wieder erneut eingelesen werden müsste.

Andere Formate

Die obige Beschreibung für HL7 Kanäle gilt analog für HCM und auch xDT Daten, wobei die Positionsangaben naturgemäß andere sind und durch die passenden ersetzt werden müssen. Der grundsätziche Aufbau und die Arbeitsweise sind aber identisch.

Referenz der zur Verfügung stehenden Funktionen. 

procedure First;

Setzt den Recordzeiger an den Anfang der Quelldatenmenge.

procedure SaveAndClose(keepMessage: Boolean);

Schreibt die Ergebnisse in die Datenbank und löscht die Nachricht, wenn keepMessage false ist.

function Debugging: Boolean;

Liefert in der Testumgebung (Client) true zurück, um Testmodus vom Produktivbetrieb im Script unterscheiden zu können.

function NextSegment(var aName: String): Boolean;

Sucht das nächste Segment in der Quellnachricht mit der angegebenen Segmentidentifikation.

function GetData(const aPosition: String): String;

Liefert aus dem gelesenen Segment die Daten einer Position, die durch Feld-Subfeld... angegeben wird.

procedure WriteLn(content: Variant);

Schreibt eine Zeile mit dem angegebenen Inhalt in die Log-Datei und Debug Ausgabe.

procedure Debug(content: Variant);

Schreibt eine Zeile mit dem angegebenen Inhalt nur in die Debug Ausgabe.

function StrToDateTime(const s, format: string): TDateTime;

Wandelt eine Zeitangabe im angegebenen format in einen Zeittypen um.

function WhichIdentifier(const NewPID, OldPID, firstname, lastname: String): String;

Hilfsfunktion, die bei Umstellung eines KIS-Systems mit neuen Patientennummern. Ist NewPID nicht vorhanden, aber OldPID, dann wird OldPID zurückgeliefert, sonst immer NewPID.

function FindSubject(const PID): Boolean;

Prüft, ob es einen Patienteneintrag unter der angegebenen PID (KIS-ID) gibt. Wichtig für die Laborzuordnung, um keine unnötigen Sätze anzulegen. Wenn die Funktion true liefert, arbeiten alle folgenden Funktionen auf das gefundene Subject.

function FindOrCreateSubject(const PID, firstname, lastname: String; birthdate: TDateTime): Boolean;

Sucht einen Patienteneintrag und legt ihn gegebenenfalls an. Alle folgenden Aktionen beziehen sich auf diesen Patienten. PID ist die KIS-ID! Wenn die Funktion true liefert, arbeiten alle folgenden Funktionen auf das gefundene Subject.

function FindOrCreateVisitWithTime(aTimeStamp: TDateTime): boolean;

Sucht oder erstellt einen Verlaufsdatenvisit zum aktuellen Patienten. Dieser ist anschließend Basis für alle Aufrufe von InsertOrUpdateItem, wenn dabei Verlaufsdatenitems angegeben werden. Hier wird die Uhrzeit mit beachtet.

function FindOrCreateVisit(aTimeStamp: TDateTime): boolean;

Sucht oder erstellt einen Verlaufsdatenvisit zum aktuellen Patienten, wobei die Uhrzeit des Zeitstempels nicht beachtet wird, sodass immer nur ein Visit am Tag entsteht. Dieser ist anschließend Basis für alle Aufrufe von InsertOrUpdateItem, wenn dabei Verlaufsdatenitems angegeben werden.

procedure InsertOrUpdateItem(aTypeID: Int64; const aStringValue: String; updateExisting: boolean);

Fügt ein Item ein oder aktualisert ein vorhandenes, wenn updateExisting wahr ist. Der Wert wird als aStringValue angegeben und wird so behandelt, wie Eingaben über das Eingabegitter in EMIL. Wenn das angegebene Item ein Feste Daten Item ist, wird es natürlich dort verortet und nicht am letzten, durch FindOrCreateVisit angelegten Visit. Labordatenitems werden hier ignoriert, da diese über SetOrLearnResult anzulegen sind.

procedure AddRelatives(const Line: String);

Fügt eine Zeile zu den Angehörigen hinzu.

procedure AddDiagnoses(const Line: String);

Fügt Diagnosen hinzu.

procedure SetSubjectInfo(const aField: String; aContent: variant);

Setzt verschiedene Felder des Stammdatenblattes über ihre Feldnamen.

procedure SetSubjectInfoIfEmpty(const aField: String; aContent: variant);

Setzt verschiedene Felder des Stammdatenblattes über ihre Feldnamen, wenn das Feld leer ist.

procedure SetInsurance(const IK, aInsNum, MemberNum, InsKind, DMP, VIP, WOP: String);

Setzt die Versicherteninformtionen.

procedure SetGender(const aValue: String);

Setzt das Item Geschlecht.

procedure SetBirthDate(aValue: TDateTime);

Setzt das Item Geburtsdatum.

procedure SetOrLearnResult(aDate: TDateTime; const aIdent, aValue, aRange, aUnit, aTitle: String);

Setzt ein Befundergebis über ein Ident, wenn es keinem EMIL-Feld zugeordnet ist, wird es gelernt.

function RemoveText(const Source, ToBeRemoved: String): String;

Beseitigt Text aus einem String.

function ReplaceText(const Source, ToBeReplaced, ReplaceWith: String): String;

Ersetzt Text in einem String.