|
|
|
Die Frontend-Engine ist eine Programm-Schnittstelle, die alle Basis-Aktionen (=Instruktionen) eines Pro.M.D.-Frontends definiert. Die Frontend-Engine arbeitet auf sogenannten Akkumulatoren (=globale Variablen), die von den Instruktionen abgefragt und gesetzt werden können. Die möglichen Benutzeraktionen eines Pro.M.D.-Frontend-Formulars werden in der sogenannten Layout-Datei definiert, die alle beeinflußbaren Charakteristika des Frontends in einer erweiterten SGML-Notation darstellt. Die Frontend-Engine arbeitet durch die beiden folgenden Aufrufe mit der Inference-Engine zusammen:
fun.exe root(KNOWLEDGE):layout(FORM).
Dieser Aufruf erzeugt eine neue Layout-Datei, welche die Frontend-Engine ab sofort steuert. FORM ist meistens „search" oder „dialog".
fun.exe root(KNOWLEDGE):infere(TABLE,KEY).
Dieser Aufruf liest aus Tabelle TABLE die Falldaten aus dem Satz mit dem Schlüssel KEY und speichert das Inferenzergebnis in das Ergebnisfeld des gleichen Fallsatzes.
Die beiden Methoden layout/1 und infere/2 werden vom Pro.M.D.-Compiler aus den Regeln einer RUL-Wissensbasis erzeugt. Die Layout-Datei spezifiert das Verhalten des Frontends in einem Kontrollteil (PullDown-Menüleiste und Buttons) und in einem Datenteil (Eingabefelder und Anzeigeelemente). Sie definiert hierzu auch das Datenmodell, welches angibt, wo die Falldaten zu finden sind.
Instruktionssatz der Frontend-Engine
Wissensbasis und Datenbank
ask_current_knowledge
weist der Variablen current_knowledge den im Benutzerdialog erfragten
Dateinamen einer Wissensbasis zu.
set_current_knowledge(FILE)
weist der Variablen current_knowledge den Dateinamen FILE einer Wissensbasis
zu.
show_current_form(FORM)
berechnet eine neue Layout-Datei, zeigt das neue Formular an und weist
den Variablen current_table, current_keyfield, current_resultfield und
current_helpsystem entsprechend neue Werte zu.
set_current_table(TABLE)
weist der Variablen current_table die Informationen TABLE zum Zugriff
auf eine Falltabelle zu.
create_new_table(TABLE)
weist der Variablen current_table die Informationen TABLE zur Erzeugung
einer neuen Falltabelle zu.
Der aktuelle Datensatz
set_current_record_new
erzeugt in der aktuellen Falltabelle einen neuen Fallsatz und weist
dessen Schlüssel der Variablen current_record zu.
set_current_record_first
weist der Variablen current_record den Schlüssel des ersten passenden
Fallsatzes zu.
set_current_record_last
weist der Variablen current_record den Schlüssel des letzten passenden
Fallsatzes zu.
set_current_record_prev
weist der Variablen current_record den Schlüssel des vorherigen
passenden Fallsatzes zu.
set_current_record_next
weist der Variablen current_record den Schlüssel des nächsten
passenden Fallsatzes zu.
Fallauswahl und Inferenz
show_selection_form
Die im aktuellen Formular angezeigten Daten werden als Suchmaske interpretiert.
Diese Instruktion zeigt in einem Fallauswahl-Formular die Liste aller passenden
Fallsätze an. Der Benutzer kann hiermit einen Fall auswählen.
Der Schlüssel der ausgewählten Satzes wird an current_record
zugewiesen. Die genaue Struktur einer Fallzeile muß noch definiert
werden.
show_selectmul_form
Falls die aktuelle Suchmaske genau einen Fall definiert, wird dessen
Schlüssel an current_record zugewiesen. Ansonsten wird show_selection_form
ausgeführt.
perform_inference
schickt die Nachricht root(KNOWLEDGE):infere(TABLE,KEY) an den Wissensserver,
wobei KNOWLEDGE für die aktuelle Wissensbasis, TABLE die aktuelle
Falltabelle und KEY den aktuellen Fallsatz bezeichnen. Der Wissensserver
berechnet die Ergebnistexte und trägt sie in die entsprechende Falltabelle
ein.
Laden, Speichern und Drucken
load_current_record
zeigt die aktuellen Falldaten im aktuellen Formular an.
save_current_record
speichert die im aktuellen Formular angezeigten Falldaten als aktuellen
Satz der Falltabelle.
print_result
druckt das als Ergebnis spezifizierte Feld des aktuellen Datensatzes
aus.
store_result
speichert das als Ergebnis spezifizierte Feld des aktuellen Datensatzes
als Textdatei.
show_print_preview
zeigt in einem typischen print-preview-Fenster den aktuellen Befundbericht
an.
Hilfe und Ende*
show_helpsystem
zeigt die HTML des aktuellen Hilfesystems in einem HTML-Browser-Fenster
an.
no_operation
keine Operation. (nicht definfert)
finish_session
schließt die aktuelle Kommunikation mit dem Wissensserver ab
und beendet das Frontend-Programm.
Akkumulatoren der Frontend-Engine
current_knowledge
Diese Variable enthält den vollen Dateinamen der momentan aktuellen
Wissensbasis. Zum Beispiel „//promdsvr/kbs/gerinn.rul".
current_table
Diese Variable enthält alle Informationen, die notwendig sind,
um eine Datenbanktabelle zu erzeugen, zu löschen und auf ihre Datenfelder
lesend oder schreibend zuzugreifen. Die genaue Darstellung dieser Informationen
muß noch festgelegt werden.
current_record
Diese Variable enthält den Schlüssel (engl. key) des aktuellen
Fallsatzes (engl. record). Ein Beispiel ist „0123" für den Fall Nummer
123.
current_keyfield
Diese Variable enthält den Feldnamen des Schlüssels innerhalb
eines Fallsatzes. Zum Beispiel „FallNummer".
current_resultfield
Diese Variable enthält den Feldnamen des Ergebnisberichtes innerhalb
eines Fallsatzes. Zum Beispiel „BefundBericht".
current_helpsystem
Diese Variable enthält den Dateinamen der aktuellen Hilfedatei,
relativ zu current_knowledge. Zum Beispiel „fallsuchhilfe.html".
Für Pro.M.D.-Frondends sind nachfolgend beschriebene Kontroll-Aktionen typisch, deren Funktion mit Basis-Aktionen (siehe unten) der Frontend-Engine definiert werden.
Beispiel: Kontroll-Funktionen eines Pro.M.D.-Frontends
Aktionen der Fallsuche
Menu_File_Open: ask_current_knowledge, show_current_form(„search").
Menu_File_Exit: finish_session.
Button_Last: show_current_form(„dialog"),
set_current_record_last,
load_current_record.
Button_First: show_current_form(„dialog"), set_current_record_first,
load_current_record.
Button_New: show_current_form(„dialog"),
set_current_record_new,
load_current_record.
Button_Select: show_selection_form, show_current_form(„dialog").
Button_Dialog: show_selectmul_form, show_current_form(„dialog").
Button_Exit: finish_session.
Button_Help: show_helpsystem.
Aktionen des Falldialogs
Menu_File_Open: ask_current_knowledge, show_current_form(„search").
Menu_File_Exit: finish_session.
Button_Prev: save_current_record, set_current_record_prev,
load_current_record.
Button_Next: save_current_record, set_current_record_next,
load_current_record.
Button_New: save_current_record, set_current_record_new,
load_current_record.
Button_Answer: save_current_record, perform_inference, load_table_record.
Button_Result: save_current_record, perform_inference, show_print_preview
Button_Print: save_current_record, perform_inference, print_result.
Button_Store: save_current_record, perform_inference, store_result.
Button_Edit: no_operation.
Button_Select: no_operation.
Button_Search: save_current_record, show_current_form(„search").
Button_Exit: finish_session.
Button_Help: show_helpsystem.
Die Layoutdatei ist eine Schnittstelle, die Informationen über die für den Aufbau und die Steuerung des Frontends nötigen Daten enthält. Sie wird vom FUNLOG++-System generiert und ist in einer SGML-ähnlichen Notation spezifiziert. Sie besteht aus drei Hauptteilen, deren Zusammenhänge weiter unten erläutert werden.
Der erste Teil ist der sogennante Kontrollteil, der die Kommandos zur Steuerung des Systems enthält.
Der zweite Teil ist der Datenteil; hier werden die Eingabefelder beschrieben.
Der letzte Teil beschreibt das Datenmodell, das dazu dient, die Datenbankfelder
zu identifizieren und die Eingabefelder des Datenteils anzuzeigen.
The source file
frage lautet
"<CENTER><B><FONT SIZE=+2>Gerinnungs-Diagnostik</FONT></B></CENTER>"
in seite 1/1.
frage labnr lautet
"LaborNummer: " in seite 1/2/1*1.
frage einsender lautet "Einsender:
" in seite 1/2/2*1.
frage name
lautet "Name: " in seite
1/2/1*2.
frage vorname lautet "Vorname:
" in seite 1/2/2*2.
frage gdatum lautet "Geburtsdatum:
" in seite 1/2/1*3 breite 10 hoehe 1.
frage tdatum lautet "Tagesdatum:
" in seite 1/2/2*3 breite 10 hoehe 1.
frage fragestellung in seite 1/3 breite 50 hoehe 1.
begriff fragestellung sei 'V.a. Hämophilie A'
oder 'V.a. Hämophilie B'
oder 'V.a. Thrombophilie'.
/* Auswahl-Typ geht noch nicht */
frage quick lautet
"Quick: " in seite 1/4/1*2.
frage ptt
lautet "PTT: " in
seite 1/4/2*2.
frage tz
lautet "TZ: "
in seite 1/4/3*2.
frage fibrinogen lautet "F'gen: "
in seite 1/4/4*2.
frage thrombos lautet "Thrombozyten:
" in seite 1/4/1*1.
frage blutungszeit lautet "Blutungszeit: " in seite 1/4/3*1.
ergebnis kurzbefund lautet "Kurzbefund: " in seite 1/5.
frage anmerkung in seite 2/1 breite 66 hoehe 4.
ergebnis langbefund lautet "Langbefund:" in seite 2/2 breite 66 hoehe 8.
fakt kurzbefund = "V.a. Hämophilie A".
fakt langbefund = "Bei Herrn/Frau " # name # " besteht " # kurzbefund.
ergebnis lautet langbefund.
fakt ende.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD> <TITLE>Pro.M.D.-WWW-System</TITLE>
<COMMAND NAME="Menu_File_Open">
<ACTION NAME="ask_current_knowledge">
</ACTION>
<ACTION NAME="show_current_form">
<PARAM NAME="face" VALUE="search"> </PARAM>
</ACTION>
</COMMAND>
<COMMAND NAME="Menu_File_Exit">
<ACTION NAME="finish_session">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Prev">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="set_current_record_prev">
</ACTION>
<ACTION NAME="load_current_record">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Next">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="set_current_record_next">
</ACTION>
<ACTION NAME="load_current_record">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_New">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="set_current_record_new">
</ACTION>
<ACTION NAME="load_current_record">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Answer">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="perform_inference">
</ACTION>
<ACTION NAME="load_current_record">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Result">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="perform_inference">
</ACTION>
<ACTION NAME="show_print_preview">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Print">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="perform_inference">
</ACTION>
<ACTION NAME="print_result">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Store">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="perform_inference">
</ACTION>
<ACTION NAME="store_result">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Edit">
<ACTION NAME="no_operation">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Select">
<ACTION NAME="no_operation">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Search">
<ACTION NAME="save_current_record">
</ACTION>
<ACTION NAME="show_current_form">
<PARAM NAME="face" VALUE="search"> </PARAM>
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Exit">
<ACTION NAME="finish_session">
</ACTION>
</COMMAND>
<COMMAND NAME="Button_Help">
<ACTION NAME="show_helpsystem">
</ACTION>
</COMMAND>
</HEAD>
<FORM ACTION=xxx METHOD="POST">
<TABLE BORDER=5 COLS=1>
<TR> <TD><!-- FallDialog-Kontrolle -->
<SELECT NAME="File">
<OPTION> <B>FILE</B>
</OPTION>
<OPTION onClick="Menu_File_New">
New </OPTION>
<OPTION onClick="Menu_File_Open">
Open </OPTION>
<OPTION onClick="Menu_File_Save">
Save </OPTION>
<OPTION onClick="Menu_File_Exit">
Exit </OPTION>
</SELECT>
<SELECT NAME="Edit">
<OPTION> <B>EDIT</B>
</OPTION>
<OPTION onClick="Menu_Edit_Cut">
Cut </OPTION>
<OPTION onClick="Menu_Edit_Copy">
Copy </OPTION>
<OPTION onClick="Menu_Edit_Paste">
Paste </OPTION>
</SELECT>
<INPUT TYPE="submit" VALUE="GO">
</INPUT>
<BR> </BR>
<INPUT onClick="Button_Prev"
TYPE="submit" VALUE="PREV"> </INPUT>
<INPUT onClick="Button_Next"
TYPE="submit" VALUE="NEXT"> </INPUT>
<INPUT onClick="Button_New"
TYPE="submit" VALUE="NEW"> </INPUT>
<INPUT onClick="Button_Answer"
TYPE="submit" VALUE="ANSWER"> </INPUT>
<INPUT onClick="Button_Result"
TYPE="submit" VALUE="RESULT"> </INPUT>
<INPUT onClick="Button_Print"
TYPE="submit" VALUE="PRINT"> </INPUT>
<INPUT onClick="Button_Store"
TYPE="submit" VALUE="STORE"> </INPUT>
<INPUT onClick="Button_Edit"
TYPE="submit" VALUE="EDIT"> </INPUT>
<INPUT onClick="Button_Select"
TYPE="submit" VALUE="SELECT"> </INPUT>
<INPUT onClick="Button_Search"
TYPE="submit" VALUE="SEARCH"> </INPUT>
<INPUT onClick="Button_Exit"
TYPE="submit" VALUE="EXIT"> </INPUT>
<INPUT onClick="Button_Help"
TYPE="submit" VALUE="HELP"> </INPUT>
</TD> </TR>
<TR> <TD><!-- FallDialog-Felder -->
<!-- FD-Begin -->
<TABLE BORDER=1 WIDTH="100%">
<TR>
<TD>
<TABLE BORDER=1 WIDTH="100%">
<TR>
<TD BGCOLOR="#FFFF99">
<CENTER><B><FONT SIZE=+2>Gerinnungs-Diagnostik</FONT></B></CENTER>
</TD>
</TR>
<TR>
<TD>
<TABLE BORDER=1 WIDTH="100%">
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="labnr">LaborNummer: </LABEL>
<INPUT
LABEL="LaborNummer:
" TYPE="text"
NAME="labnr" SIZE="16,1">
</INPUT></PRE>
</TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="name">Name:
</LABEL> <INPUT
LABEL="Name:
" TYPE="text"
NAME="name" SIZE="16,1">
</INPUT></PRE>
</TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="gdatum">Geburtsdatum:
</LABEL> <INPUT
LABEL="Geburtsdatum:
" TYPE="text"
NAME="gdatum" SIZE="10,1">
</INPUT></PRE>
</TD>
</TR>
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="einsender">Einsender:
</LABEL> <INPUT
LABEL="Einsender:
" TYPE="text"
NAME="einsender" SIZE="16,1">
</INPUT></PRE>
</TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="vorname">Vorname: </LABEL>
<INPUT
LABEL="Vorname: " TYPE="text"
NAME="vorname" SIZE="16,1">
</INPUT></PRE>
</TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="tdatum">Tagesdatum:
</LABEL> <INPUT
LABEL="Tagesdatum:
" TYPE="text"
NAME="tdatum" SIZE="10,1">
</INPUT></PRE>
</TD>
</TR>
</TABLE></TD>
</TR>
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="fragestellung">fragestellung:
</LABEL> <INPUT
LABEL="fragestellung:
" TYPE="text"
NAME="fragestellung"
SIZE="50,1"> </INPUT></PRE>
</TD>
</TR>
<TR>
<TD>
<TABLE BORDER=1 WIDTH="100%">
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="thrombos">Thrombozyten:
</LABEL> <INPUT
LABEL="Thrombozyten:
" TYPE="text"
NAME="thrombos" SIZE="16,1">
</INPUT></PRE>
</TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="quick">Quick:
</LABEL> <INPUT
LABEL="Quick:
" TYPE="text"
NAME="quick" SIZE="16,1">
</INPUT></PRE>
</TD>
</TR>
<TR><TD BGCOLOR="#FFFF99"> </TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="ptt">PTT:
</LABEL> <INPUT
LABEL="PTT:
" TYPE="text"
NAME="ptt" SIZE="16,1">
</INPUT></PRE>
</TD>
</TR>
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="blutungszeit">Blutungszeit:
</LABEL> <INPUT
LABEL="Blutungszeit:
" TYPE="text"
NAME="blutungszeit"
SIZE="16,1"> </INPUT></PRE>
</TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="tz">TZ:
</LABEL> <INPUT
LABEL="TZ:
" TYPE="text"
NAME="tz" SIZE="16,1">
</INPUT></PRE>
</TD>
</TR>
<TR><TD BGCOLOR="#FFFF99"> </TD>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="fibrinogen">F'gen:
</LABEL> <INPUT
LABEL="F'gen:
" TYPE="text"
NAME="fibrinogen" SIZE="16,1">
</INPUT></PRE>
</TD>
</TR>
</TABLE></TD>
</TR>
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="kurzbefund">Kurzbefund:
</LABEL> <EMBED
NAME="kurzbefund" MIMETYPE="text/plain"
WIDTH=128 HEIGHT=8>
</EMBED></PRE>
</TD>
</TR>
</TABLE></TD>
</TR>
<TR>
<TD>
<TABLE BORDER=1 WIDTH="100%">
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="anmerkung">anmerkung:
</LABEL> <TEXTAREA
LABEL="anmerkung: "
TYPE="text"
NAME="anmerkung" COLS=66
ROWS=4> </TEXTAREA></PRE>
</TD>
</TR>
<TR>
<TD BGCOLOR="#FFFF99">
<PRE><LABEL for="langbefund">Langbefund:</LABEL>
<EMBED
NAME="langbefund" MIMETYPE="text/plain"
WIDTH=528 HEIGHT=64>
</EMBED></PRE>
</TD>
</TR>
</TABLE></TD>
</TR>
</TABLE>
<!-- FD-End -->
</TD> </TR>
<TR> <TD>
<TABLE BORDER=1 COLS=3>
<TR><TD>KB=aaaaa
</TD> <TD>DB=bbbbb </TD> <TD>Case=ccccc </TD></TR>
</TABLE>
</TD> </TR>
</TABLE>
<DATA><!-- FallDialog-Daten -->
<ACCU CURRKB="quarto" CURRDB="CaseTable" CURRHELP="PromdDocs\DialogH.Htm">
</ACCU>
<DBTABLE NAME="CaseTable" SOURCE="quartoCases"
TABLE="CaseTable"
KEY="CaseKey" RESULT="CaseResult">
<FIELD NAME="ohneBegriff" DBNAME="ohneBegriff" DBTYPE="text"
DBSIZE="0"> </FIELD>
<FIELD NAME="labnr" DBNAME="labnr" DBTYPE="text" DBSIZE="0">
</FIELD>
<FIELD NAME="einsender" DBNAME="einsender" DBTYPE="text" DBSIZE="0">
</FIELD>
<FIELD NAME="name" DBNAME="name" DBTYPE="text" DBSIZE="0"> </FIELD>
<FIELD NAME="vorname" DBNAME="vorname" DBTYPE="text" DBSIZE="0">
</FIELD>
<FIELD NAME="gdatum" DBNAME="gdatum" DBTYPE="text" DBSIZE="10">
</FIELD>
<FIELD NAME="tdatum" DBNAME="tdatum" DBTYPE="text" DBSIZE="10">
</FIELD>
<FIELD NAME="fragestellung" DBNAME="fragestellung" DBTYPE="text"
DBSIZE="50"> </FIELD>
<FIELD NAME="quick" DBNAME="quick" DBTYPE="text" DBSIZE="0">
</FIELD>
<FIELD NAME="ptt" DBNAME="ptt" DBTYPE="text" DBSIZE="0"> </FIELD>
<FIELD NAME="tz" DBNAME="tz" DBTYPE="text" DBSIZE="0"> </FIELD>
<FIELD NAME="fibrinogen" DBNAME="fibrinogen" DBTYPE="text" DBSIZE="0">
</FIELD>
<FIELD NAME="thrombos" DBNAME="thrombos" DBTYPE="text" DBSIZE="0">
</FIELD>
<FIELD NAME="blutungszeit" DBNAME="blutungszeit" DBTYPE="text"
DBSIZE="0"> </FIELD>
<FIELD NAME="kurzbefund" DBNAME="kurzbefund" DBTYPE="text" DBSIZE="0">
</FIELD>
<FIELD NAME="anmerkung" DBNAME="anmerkung" DBTYPE="text" DBSIZE="264">
</FIELD>
<FIELD NAME="langbefund" DBNAME="langbefund" DBTYPE="text" DBSIZE="528">
</FIELD>
</DBTABLE>
</DATA>
<!-- /FRAMESET>
</FORM>
</HTML>