|
<< Klicken Sie, um das Inhaltsverzeichnis anzuzeigen >> Navigation: Scripts > Formular Scripts |
Im Formular-Editor kann ein Script hinterlegt werden, das die Anzeigezeile des Formulars in der Akte berechnet, z.B. einen Score aus Ankreuzfeldern, eine Plausibilitätsprüfung über mehrere Felder oder eine formatierte Zusammenfassung. Vorausgesetzt werden die Scripting-Grundlagen.
Das Script läuft nach jeder Eingabe im Formular. Es liest die Werte der Formularfelder, berechnet daraus ein Ergebnis und weist dieses der vordefinierten Variablen finalScore zu. Der Inhalt von finalScore wird anschließend in der Akte als zusammengefasste Ergebniszeile angezeigt.
Wichtig: finalScore ist eine String-Variable - auch Zahlenergebnisse müssen vor der Zuweisung über Format oder IntToStr/FloatToStr in einen Text umgewandelt werden. Wenn finalScore nach Scriptende noch den Initialwert '????' trägt, wird die Anzeigezeile nicht aktualisiert - so kann das Script die Aktualisierung gezielt unterdrücken, indem es finalScore einfach nicht setzt.
Minimalbeispiel:
var
score: Integer;
begin
score := frageA + frageB + frageC;
finalScore := IntToStr(score);
end.
Im Formular-Script sind diese Variablen ohne var-Deklaration verfügbar. Jedes mit einem Namen versehene Formularfeld ist eine gleichnamige Variable:
Variable / Feldtyp |
Typ im Script |
Inhalt, leeres Feld |
finalScore |
String |
Ausgabevariable für die Anzeigezeile (siehe oben). |
Empty |
Extended |
Vordefinierter Wert für ein leeres numerisches Feld (intern -NaN). Unterscheidet eine fehlende Eingabe von einer eingegebenen 0, siehe validNumber. |
Ankreuzfelder (TITCCheckBox) |
Extended |
1.0 (angekreuzt) oder 0.0 (nicht angekreuzt). |
Numerische Texteingaben (TEdit mit Datentyp Ganzzahl oder Fließkomma) |
Extended |
Leer = Empty (-NaN). |
Text-Eingaben (TEdit mit Datentyp Text oder Datum) |
String |
Bei Bedarf mit StrToIntDef/StrToFloatDef in Zahlen umsetzen. |
NRS-Skalen (TITCNRS) |
Extended |
Leer = Empty. |
Comboboxen (TComboBox) |
String |
Der Code (Teil hinter dem #255-Trenner der Anzeige/Code-Definition), nicht der Anzeigetext. |
Zahlenfelder der Akte (Dictionary, z.B. Laborwerte), unter ihrem Variablennamen |
Extended |
Wert aus derselben Visite, aus den Stammdaten oder bei Laborwerten aus der Laborvisite, die dem Visitendatum am nächsten liegt (höchstens 14 Tage davor oder danach, wie bei den Formeln). Fehlt der Wert oder steht kein glatter Wert in der Zelle (z.B. < 0.5 oder negativ), kommt Empty an. Prüfen Sie mit validNumber, nicht mit = Empty (dieser Vergleich ist immer falsch). |
<Variablenname>_TXT zu jedem Zahlenfeld der Akte |
String |
Der Text, der in der Zelle steht, siehe Beispiel „Laborwert unter der Nachweisgrenze“. |
Die Rückführung in das Formular erfolgt automatisch nach dem Script: Wird der Variableninhalt eines Feldes im Script geändert, übernimmt der Formular-Editor diesen Wert in das Formular. So kann das Script aus mehreren Eingaben einen abgeleiteten Wert berechnen und in ein Anzeigefeld schreiben.
Das folgende Beispiel zeigt die typische Struktur eines Score-Scripts mit zwei Comboboxen. Die Codes der Comboboxen sind als Ganzzahlen kodiert und werden zur Berechnung addiert. Wenn der Benutzer eine der Comboboxen nicht ausgewählt hat (Wert lässt sich nicht in eine nicht-negative Zahl wandeln), gilt das Formular als ungültig und es wird statt eines Scores der Text 'Ungültig' angezeigt:
var
ok: Boolean;
score, x: Integer;
begin
score := 0;
ok := true;
x := StrToIntDef(combobox1, -1);
if x < 0 then
ok := false
else
score := score + x;
x := StrToIntDef(combobox2, -1);
if x < 0 then
ok := false
else
score := score + x;
if ok then
finalScore := Format(score, 0)
else
finalScore := 'Ungültig';
end.
Die Codes der Combobox-Einträge werden im Formular-Editor als Anzeige/Code-Paare definiert. Wenn als Code numerische Werte verwendet werden (z.B. 0, 1, 2, 3), lassen sich diese im Script mit StrToIntDef in eine Zahl wandeln; der default-Parameter (-1) deckt den Fall "keine Auswahl getroffen" ab.
Bei numerischen Feldern (Ankreuzboxen, Zahlen-Edits, NRS-Skalen) sollte mit validNumber geprüft werden, ob ein Wert eingegeben wurde - leere Felder kommen als -NaN ins Script:
var
sum: Extended;
begin
if validNumber(frageA) and validNumber(frageB) and validNumber(frageC) then
begin
sum := frageA + frageB + frageC;
finalScore := Format(sum, 1);
end
else
finalScore := 'unvollständig';
end.
Laborwerte aus der Akte gibt es im Script zweimal: als Zahl (CRP) und als Zelltext (CRP_TXT). Ist die Zahl leer, verrät der Zelltext den Grund: Ist auch CRP_TXT leer, wurde nichts erhoben. Sonst steht dort, was das Labor geliefert hat, z.B. < 0.5, unter Nachweisgrenze oder kein Material. Der genaue Wortlaut hängt vom Labor ab.
begin
if validNumber(CRP) then
finalScore := 'CRP ' + Format(CRP, 1)
else if CRP_TXT = '' then
finalScore := 'CRP nicht erhoben'
else
finalScore := 'CRP ' + CRP_TXT;
end.
Feldtyp und Variable müssen zusammenpassen. Zahlen (CRP) gehören in ein Edit mit Datentyp Ganzzahl oder Fließkommazahl, Texte (CRP_TXT, Comboboxen) in ein Edit mit Datentyp Text. Ein Edit mit Datentyp Datum ist im Script ebenfalls Text. Passt die Zuweisung nicht (z.B. edit1 := CRP_TXT bei einem Zahlenfeld), lässt sich das Script nicht übersetzen und wird gar nicht ausgeführt. Dann bleiben im Formular alle berechneten Felder leer. Umwandeln lässt sich mit Format (Zahl nach Text) und StrToFloatDef (Text nach Zahl).
Zusätzlich zu den Standardfunktionen (darunter Format, roundTo, StrToIntDef und StrToFloatDef) gibt es im Formular-Editor diese Funktion:
function validNumber(f: Extended): Boolean;
Liefert true, wenn f einen echten Zahlenwert enthält, und false bei -NaN (leere Eingabe). Damit lässt sich vor einer Berechnung prüfen, ob alle benötigten Felder ausgefüllt sind.
if not validNumber(frageA) then exit;