Script Erstellung

<< Klicken Sie, um das Inhaltsverzeichnis anzuzeigen >>

Navigation:  Schnittstellen > ITC-Connect (Zusatzprodukt) >

Script Erstellung

Grundaufbau eines Scripts

Scripte werden in Pascal Script erstellt. Diese Scriptsprache folgt der Syntax von Pascal. Im Folgenden ist der Vorgang der Scripterstellung in Beispielen erklärt. Für weitergehende Informationen bietet ITC Kurse an, um das Entwickeln komplexer Scripte in RheMIT zu erlernen.

Der Grundaufbau des Scripts ist

var

   ... Variablendefinitionen ...

begin

   ... Programmcode ...

end.

Die Variablendefinitionen haben folgenden Aufbau

  variable: Typ;

Als Variablentypen stehen String, Integer, Double zur Verfügung. Datumsangaben (mit oder ohne Zeit) werden in Scripten immer als Double verarbeitet.

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 RheMIT-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 RheMIT 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 RheMIT-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 sktualisieren:

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 RheMIT 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 Vrarbeitung an RheMIT ü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 festsshreiben 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 eingelsesen 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.