Verbesserung Patientliste-Filter

Neues rund um Elexis

Verbesserung Patientliste-Filter

Beitragvon gweirich » 05.06.2008, 12:12

Die Filtermöglichkeiten der Patientenliste waren ja recht limitiert und umständlich zu bedienen. Ich bin jetzt dabei, das zu ändern und ähnlich wie die neueren Filter (z.B. bei der Kons-Statistik) zu gestalten:

Mit Klick auf den Filter-Button öffnet sich oben ein Teilfenster, in das man mit Drag&Drop Filterbedingungen ziehen kann.

Bild

Man kann im Prinzip beliebige Objekte hineinziehen, also beispielsweise Verrechnungspositionen oder Diagnosecodes, oder Kontakte. Die Liste wird dann immer auf diejenigen Patienten limitiert, auf die das entsprechende Objekt zutrifft bzw. alle Filterobjekte zutreffen (Also wo die entsprechende Verrechnung oder Diagnose bei mindestens einer Konsultation eingetragen wurde, oder wo der entsprechende Kontakt als Bezugskontakt etc. vorhanden ist).

Als Besonderheit für "Fortgeschrittene" kann man auch selber definierte Scripts hineinziehen, die ähnlich funktionieren, wie die Scripts bei den berechneten Laborwerten oder Befunden:

Bild

Dieses Script würde alle selektieren, die zwischen 25 und 30 Jahre alt sind, und in der Diagnoseliste irgendwas mit "allergie" stehen haben.

Insgesamt filtert obengenanntes Beispiel also die Patientenliste auf diejenigen, bei denen mindestens einmal der TI-Code M2 als Konsultationsdiagnose eingetragen wurde, UND, die zwischen 25 und 30 Jahre alt sind, UND die eine allergie in der Diagnoseliste haben.

Es ist klar, dass ein solcher Filter relativ langsam ist, da auf jeden einzelnen Patienten alle Filterbedingungen angewendet werden müssen (bei mir dauert obiges Beispiel rund eine Minute). Ich halte das dennoch für akzeptabel, weil solche Filter ja relativ selten gesetzt werden und dann gewisse Wartezeiten nicht so schlimm sind. Oder was meint Ihr?

Weitere Anregungen zu dieser Änderung sind wie immer willkommen, Redaktionsschluss ist dann, wenn ich das Interesse daran wieder verloren habe :wink:
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Beitragvon henzi.stefan » 06.06.2008, 06:34

Tönt sehr spannend - dann müssten wir aber eine sehr gute Anleitung zum Script-Schreiben bekommen - was würdest Du empfehlen, wenn man sich darin einarbeiten möchte ?
henzi.stefan
 
Beiträge: 99
Registriert: 05.01.2008, 18:53

Beitragvon henzi.stefan » 06.06.2008, 06:35

Wird damit auch eine Filterung der selbst definierten "Zusatzfelder" möglich sein ?
henzi.stefan
 
Beiträge: 99
Registriert: 05.01.2008, 18:53

Beitragvon gweirich » 06.06.2008, 06:54

henzi.stefan hat geschrieben:Tönt sehr spannend - dann müssten wir aber eine sehr gute Anleitung zum Script-Schreiben bekommen - was würdest Du empfehlen, wenn man sich darin einarbeiten möchte ?


Die Sprache ist untypisiertes und ad hoc interpretiertes Java. Der verwendete Interpreter ist Beanshell (http://www.beanshell.org/). Dokumentation somit dort. Die verwendbaren Elexis-internen Variablen sind die auch in Textvorlagen verwendbaren Platzhalter.

Das Script erhält nacheinander jeden Patienten in seine [Patient.xxx] Variablen eingetragen und gibt jedesmal entweder 1 zurück (diesen Patienten in die Liste aufnehmen) oder -1 (diesen Patienten weglassen), oder 0 (ist mir egal), oder -2 (interner Fehler, Aktion abbrechen).

Mehr Dokumentation ist eigentlich nicht notwendig, oder doch?
Wir können ja dann ein paar Beispiele publizieren, ähnlich wie bei den Textvorlagen.

Alternativ könnte man auch groovy (http://groovy.codehaus.org/) als Interpreter einbinden, wäre wohl noch leistungsfähiger und flexibler. Aber ich denke, das ist dann ein weiterer Schritt, wenn wir wirklich an die Grenzen von Beanshell stossen :wink:
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Beitragvon gweirich » 06.06.2008, 07:03

henzi.stefan hat geschrieben:Wird damit auch eine Filterung der selbst definierten "Zusatzfelder" möglich sein ?


Soweit man auf diese Felder in Textvorlagen zugreifen kann, kann man sie auch in Scripts verwenden. Sollte also, Fehler vorbehalten, gehen.
[Patient.Haarfarbe] bringt dann entweder die Haarfarbe, wenn sie eingetragen wurde, oder ???Patient.Haarfarbe??? wenn sie nicht gefunden wurde.

if([Patient.Haarfarbe].equals("blau"))return 1; else return -1;

liefert dann eine Liste aller Patienten mit blauen Haaren.
Bild
Zuletzt geändert von gweirich am 28.06.2008, 09:32, insgesamt 1-mal geändert.
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Weiteres Beispiel

Beitragvon gweirich » 18.06.2008, 11:39

Da meine Begeisterung für die neue Script-Funktion offenbar vom geneigten Publikum noch nicht so geteilt wird, möchte ich ab und zu einige Möglichkeiten zeigen.

Hier als eine Beispielfrage: "Durchschnittsalter meiner Hausarztmodell-Patienten"

Ich filtere als erstes auf meine Etikette "Hausarztmodell" und als zweites auf mein Script "Durchschnittsalter":
Bild

Das Script "Durchschnittsalter" sieht so aus:

Bild

Und als Resultat wird mir nach Einlesen der Patientenliste angezeigt:

Bild

Man kann Filterbedingungen beliebig kombinieren.

Reihenfolge der Filter:
  • Die "schnellsten" Filter oben und die langsamen unten setzen, weil die Filter in der Reihenfolge abgearbeitet werden, in der sie in der Filterbox stehen.
  • Filter, die alles durchlassen wie das Durchschnittsalter-Script als letzte Filterbedingung setzen, damit sie nur die erfassen, die von den anderen Bedingungen durchgelassen wurden.


Hier noch ein Beispiel: Durchschnittsalter aller Patienten, bei denen ich die Dringlichkeitspauschale verrechnet habe:

Bild
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Feld-Filter

Beitragvon gweirich » 18.06.2008, 16:04

Dem aufmerksamen Leser ist vielleicht aufgefallen, dass in der Filterbox neu auch "Feld.." steht:

Bild

Wenn man auf Feld klickt, kann man Bedingungen für einzelne Felder (Festverdrahtete und selbstdefinierte) eingeben und spart sich so, extra ein Script erstellen zu müssen:

Bild

Gross/Kleinschreibung spielt keine Rolle.

In der Mitte, dort wo "=" steht, kann man aufklappen und hat dann noch weitere Optionen:
  • LIKE: Dies findet Wortteile. also 'Ort LIKE thal' würde Feuerthalen und Marthalen finden.
  • Regexp: Dies findet reguläre Ausdrücke. Eine eingehende Erklärung würde hier zu weit führen. Bei Interesse hilft Wikipedia (http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck). Beispielsweise würde 'Name Regexp M[ae][iy]er' alle Meiers, Maiers, Meyers und Mayers finden, oder 'Vorname Regexp S[a-z]+a' alle Vornamen, die mit S anfangen, mit a enden und dazwischen mindestens einen Buchstaben haben.


Natürlich kann man auch den Feld-Filter mit allen anderen Filteroptionen kombinieren.
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Migränepatienten

Beitragvon gweirich » 19.06.2008, 06:39

Noch ein Beispiel: Kleine Demografie der Migränepatienten

Bild

Das Script "Zaehler" sieht so aus:

Bild
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Medikamente-Top Ten

Beitragvon gweirich » 26.06.2008, 07:25

Noch mal ein Beispiel: Welche Medikamente sind bei mir die TopTen bei der Fixmedikation?

Bild

Das Ergebnis ist zugegebenermassen auch für mich überraschend. Des Rätsels Lösung ist, dass die Liste eigentlich nicht korrekt ist: Jede Spezialität wird ja separat gezählt. Also all die Pravastatin- und Simvastatin-Generika sind unter "ferner liefen", weil sie auf viele separate Spezialitäten aufgesplittert sind, und weil auch jede Packungsgrösse separat gezählt wird.

Eigentlich ist diese Statistik somit nicht sehr sinnvoll. Wir müssen besser auf Ebene der Wirkstoffe zählen. Darauf werde ich in einem späteren Beispiel zurückkommen. Trotzdem als Anschauungsmaterial hier das Script für obiges Resultat:

Code: Alles auswählen
import ch.elexis.data.*;
import ch.elexis.scripting.*;

if(init){
   medis=new Counter();
}else if(finished){
   String res=medis.getTopListAsString(10);      // die häufigsten 10 holen
   Util.display("Häufigste 10 Medikamente",res);
}else{
   if(patient != void){
      Prescription[] pre=patient.getFixmedikation();
      
      for(Prescription p:pre){
         medis.add(p.getArtikel());
      }
   }
}
return 0;
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Häufigste Substanzen in der Fixmedikation

Beitragvon gweirich » 27.06.2008, 16:45

Hier also die versprochene Verbesserung der Medi-Statistik: Was sind die 10 häufigsten Substanzen in der Fixmedikation?

Bild

Das dazugehörige Script:
Code: Alles auswählen
import ch.elexis.Hub;
import ch.elexis.data.*;
import ch.elexis.scripting.*;

if(init){
   medis=new Counter();
}else if(finished){
   String res=medis.getTopListAsString(10);      // die häufigsten 10 holen
   Util.display("Häufigste 10 Substanzen",res);
}else{
   if(patient != void){
      Prescription[] pre=patient.getFixmedikation();
      
      for(Prescription p:pre){
         Artikel art=p.getArtikel();
         bagmedi=Hub.poFactory.createFromString("ch.elexis.medikamente.bag.data.BAGMedi::"+art.getId());
         if(bagmedi.exists()){
            substances=bagmedi.getSubstances();
            for(int i=0;i<substances.size();i++){
               s=substances.get(i);
               medis.add(s);
            }
         }
         
      }
   }
}
return 0;


Falls Ihnen dieses Script ein wenig esoterisch vorkommt: Macht nichts, Sie können es ja einfach abtippen resp. mit cut&paste übernehmen.

Sie können es aber nur verwenden, wenn Sie den Medikamentenstamm der Spezialitätenliste (mit dem BAGMedi-Plugin) importiert haben! Die Galdat- und Rose-Datenstämme enthalten keine Substanzinformationen.
Dementsprechend werden hier auch nur Substanzen aufgelistet, die in Medikamenten der SL enthalten sind. Dies aber sehr korrekt: Das Script zählt bei Kombinationspräparaten jede Substanz separat mit.
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Wer war wann da?

Beitragvon gweirich » 28.06.2008, 09:30

Als vorläufigen Abschluss dieser Serie noch die Frage: Wer von den Hausarztmodell-Patienten war seit dem 1.6.2008 hier?

Bild

Das dazugehörige Script sieht so aus:

Code: Alles auswählen
import ch.elexis.data.*;
import ch.elexis.scripting.Util;

if(patient!=void){
   Fall[] faelle=patient.getFaelle();
   for(Fall fall:faelle){
      Konsultation[] konsen=fall.getBehandlungen(false);
      for(Konsultation kons:konsen){
         String konsDatum=kons.getDatum();
         if(Util.compareDates(konsDatum, "01.06.2008")>0) {
            return 1;
         }
      }
   }
}
return -1;


Das Script tut folgendes: Zunächst überprüft es, ob es wirklich mit einemm Patienten als Parameter aufgerufen wurde, und wenn ja holt es sämtliche Fälle dieses Patienten und von diesen sämtliche Konsultationen und prüft für jede Konsultation, ob das Datum nach dem 1.6.2008 liegt. In diesem Fall wird der Patient in die Liste aufgenommen (return 1), in allen anderen Fällen nicht (return -1). Da im Filterfenster die Etikette "Hausarztmodell" zuoberst steht, wird das Script nur auf die Hausarztmodell-Patienten angewendet.

Eine kuze Einführung ins Scripting gibt es hier
http://www.rgw.ch/elexis/dox/elexis-scripting.pdf

Ich schliesse jetzt mal hier ab und bedanke mich für die rege Beteiligung :lol:
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

encoding in Windows XP ändern?

Beitragvon ursberner » 15.08.2008, 05:57

Ich kämpfe immer noch mit den Filtern und Scripts. Wahrscheinlich liegt mein Problem beim verwendeten Zeichensatz. Der Computer wurde von jemand anderem aufgesetzt. Wo finde ich den Encoding-Typ? Kann ich den "einfach so" ändern? Habe herumgesucht, bis jetzt ohne Erfolg. Danke
ursberner
 
Beiträge: 135
Registriert: 06.01.2008, 04:05

Re: encoding in Windows XP ändern?

Beitragvon gweirich » 18.08.2008, 10:59

ursberner hat geschrieben:Ich kämpfe immer noch mit den Filtern und Scripts. Wahrscheinlich liegt mein Problem beim verwendeten Zeichensatz. Der Computer wurde von jemand anderem aufgesetzt. Wo finde ich den Encoding-Typ? Kann ich den "einfach so" ändern? Habe herumgesucht, bis jetzt ohne Erfolg. Danke


Ich glaube nicht, dass das bei Windows das Problem ist. Im Prinzip ist das Standard-encoding immer korrekt - Windows arbeitet intern seit NT immer mit Unicode.

Probier mal folgendes:
- View "Script" öffnen
- Neues Script klicken (roter Stern), als Name 'test' eingeben
- test rechts anklicken und "Script bearbeiten" wählen.
- folgende Script direkt von hier mit cut&paste in das script-fenster kopieren
--------------- schnipp -----------------
Code: Alles auswählen
/* Dieses Script zählt aus den von vorangestellten Filtern übriggebliebenen Patienten
     alle Männer und Frauen und berechnet das Durchschnittsalter */

import ch.elexis.scripting.*;               //  Hilfsklassen

if(init){                              // Vor dem ersten Durchlauf wird init aufgerufen
   counter=new Counter();            
   maenner=0;                     // maenner und frauen als Ganzzahlen
   frauen=0;

}else if(finished){                     // nach dem letzten Durchlauf wird finished aufgerufen
   // Ergebnis auf 2 Stellen runden
   float sc=counter.getAverage(2);

   Util.display("Ausgewählte Patienten",
      Integer.toString(maenner)+" Männer, "+
      Integer.toString(frauen)+" Frauen, "+
      "Durchschnittsalter: "+Float.toString(sc)+
      ", Median: "+counter.getMedian()
);

}else{                              // Dieser Block wird für jeden Patienten aufgerufen
   if([Patient.Geschlecht].equalsIgnoreCase("m")){
      maenner++;
   }else{
      frauen++;
   }
   int jahre=Integer.parseInt([Patient.Alter]);
   counter.add(jahre);

}

return 1;                           // Wir lassen alle durch (wir zählen ja nur)

---------------schnapp -----------
Dann OK klicken.

- Dann in der Patientenliste auf den Filter klicken
- Das eben erstellte Script "test" aus dem Script-Fenster in den Filter ziehen
- Durck klicken auf "Name" die Liste neu einlesen.

Je nach Zahl der Patienten kann das Script eine halbe Minute oder so brauchen.

Was passiert bei Dir? Kommt das Ergebnis, oder gibt es eine Fehlermeldung? Falls letzteres: Bitte Logfile an mich senden.
gweirich
 
Beiträge: 516
Registriert: 06.01.2008, 08:16
Wohnort: Schaffhausen

Beitragvon ursberner » 18.08.2008, 12:21

ok, danke, das klappt, bis auf 2 Stellen hinter dem Komma. Dann kann ich von da aus etwas weiter arbeiten. Vielen Dank. Warum sind so viel mehr Frauen krank als Männer? Arbeiten wir zuviel, um Zeit für einen Arztbesuch zu finden?
ursberner
 
Beiträge: 135
Registriert: 06.01.2008, 04:05


Zurück zu News

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron