View Categories

04 Formulare & Scripts

Die MCDMS WebAkte verwendet normale HTML-Dateien zur Darstellung von Formularen, Übersichten und Funktionsseiten.

Die Formular-Konfiguration befindet sich unter:

{APPPATH}\Web\FORMULARE.INI

Die HTML-Dateien liegen unter:

{APPPATH}\Web\HTML

Ein Formular besteht grundsätzlich aus drei voneinander getrennten Ebenen:

FORMULARE.INI
→ technische und fachliche Formular-Konfiguration

HTML / CSS / JavaScript
→ Darstellung und Browserlogik

SQL / Access / MCDMS
→ Daten und fachliche Funktionen

Der WebServer verbindet diese Komponenten und stellt dabei sicher, dass sicherheitsrelevante Entscheidungen ausschließlich serverseitig getroffen werden.

FORMULARE.INI

Jeder Abschnitt der FORMULARE.INI beschreibt genau ein Webformular.

Beispiel:

[FORMULAR_MEDIKATIONSPLAN]
Title=Medikationsplan
TitleRow=Medikationsplan vom [#DATE#]
HTML=HTML\Medikation\MEDIKATIONSPLAN.html

Edit=TRUE
MultiRecord=TRUE
Delete=TRUE
AllowDuplicate=TRUE
DoubleSaveButton=TRUE

Database=FRM_MEDIKATIONSPLAN;FRMID;PatientID#FRM_MEDIKATIONSPLAN_DETAIL;ID;FRMID;PatientID
OrderBy=FRMID;DESC
OrderByDetails=ID;ASC

ScriptLoadHTML=CONFIG\Scripts\WEB\Medikation\load.mcfscr
ScriptSaveHTML=CONFIG\Scripts\WEB\Medikation\save.mcfscr
ScriptDelete=

MATCHCODE=MEDIKATION

Formular-ID

Der Name des INI-Abschnitts ist die eindeutige Formular-ID.

Beispiel:

[FORMULAR_MEDIKATIONSPLAN]

Die Formular-ID wird unter anderem verwendet für:

  • Navigation
  • URLs
  • Rechteprüfung
  • Formularaufruf
  • Recordlisten
  • Aktionen

Sie muss nicht mit dem HTML-Dateinamen identisch sein.

Title

Title definiert den sichtbaren Titel des Formulars bzw. Formularbereichs.

Title=Medikationsplan

TitleRow

Mit TitleRow kann die Beschriftung eines Datensatzes in einer Recordliste dynamisch aufgebaut werden.

Beispiel:

TitleRow=Medikationsplan vom [#DATE#] | [#ErstelltVon#]

Die verwendeten Werte stammen ausschließlich aus dem geladenen Masterdatensatz.

Beispiel:

DATE=14.10.2026
ErstelltVon=MCMADMIN

ergibt:

Medikationsplan vom 14.10.2026 | MCMADMIN

Fehlende oder leere Spalten führen zu einem leeren Platzhalterwert.

Kann kein eigener Titel erzeugt werden, wird ein technischer Standardtitel verwendet.

HTML

HTML definiert die HTML-Datei relativ zu:

{APPPATH}\Web

Beispiel:

HTML=HTML\Medikation\MEDIKATIONSPLAN.html

ergibt:

{APPPATH}\Web\HTML\Medikation\MEDIKATIONSPLAN.html

Der Verzeichnispfad unter HTML bestimmt gleichzeitig die Zuordnung zum in WEB.INI definierten Navigationszweig.

Navigation und HTML-Pfad

Beispiel:

[AKTENSTRUKTUR]
Verwaltung
Verwaltung\DRV
Verwaltung\DRV\Anträge

Ein Formular:

HTML=HTML\Verwaltung\DRV\ANTRAG.html

gehört zum Zweig:

Verwaltung\DRV

Ein Formular:

HTML=HTML\Verwaltung\DRV\Anträge\G0100.html

gehört zu:

Verwaltung\DRV\Anträge

Der ermittelte Zweig muss in [AKTENSTRUKTUR] vorhanden sein.

Verhalten eines Navigationszweigs

Ein Navigationszweig kann:

  • nur als Strukturknoten dienen
  • genau ein Formular enthalten
  • mehrere Formulare enthalten
  • weitere Unterzweige besitzen

Hat ein Zweig genau ein direkt zugeordnetes datenbankloses Formular, kann dieses beim Anklicken automatisch geöffnet werden.

Datenbankgebundene Formulare verwenden dagegen immer den normalen Datensatzworkflow.

Edit

Edit=TRUE

Das Formular kann gespeichert werden.

Edit=FALSE

Das Formular dient ausschließlich zur Anzeige oder für andere Funktionen.

Bei Edit=FALSE wird keine normale Speichern-Schaltfläche erzeugt.

MultiRecord

MultiRecord=TRUE

Mehrere Masterdatensätze pro Patient sind erlaubt.

MultiRecord=FALSE

Es darf höchstens ein Datensatz dieses Formulars pro Patient existieren.

Existiert bereits ein Datensatz, wird kein weiterer + Neu-Vorgang zugelassen.

Delete

Delete=TRUE

Löschen ist grundsätzlich für dieses Formular aktiviert.

Ob ein konkreter Benutzer löschen darf, wird zusätzlich durch die Rechteprüfung bestimmt.

Delete=FALSE

Der Datensatz kann über die WebAkte nicht gelöscht werden.

AllowDuplicate

AllowDuplicate=TRUE

Ein vorhandener Datensatz darf dupliziert werden.

Voraussetzung ist ein MultiRecord-Formular.

Beim Duplizieren:

  • erhält der neue Datensatz eine neue technische ID
  • wird PatientID serverseitig gesetzt
  • werden technische Spalten nicht blind kopiert
  • werden bei Master/Detail auch die Detailzeilen kopiert

DoubleSaveButton

Bei langen Formularen kann zusätzlich am oberen Rand eine zweite Speichern-Schaltfläche angezeigt werden:

DoubleSaveButton=TRUE

Beide Schaltflächen verwenden exakt denselben serverseitigen Speichervorgang.

Rechte

Die Rechte werden nicht über frei definierte Web-Rollen gesteuert.

Es gibt zwei grundlegende Fälle.

Formular mit MATCHCODE

MATCHCODE=MEDIKATION

Dann verwendet die WebAkte die MCDMS-Berechtigung für diesen MATCHCODE.

Die effektiven Rechte sind:

-1 = gesperrt
 0 = kein Zugriff
 1 = lesen
 2 = lesen / erstellen / bearbeiten
 3 = Vollzugriff

Zusätzlich gilt:

UserType=0
→ Administrator
→ Vollzugriff

Löschen ist zulässig für:

Administrator

oder

Recht 3

oder

Recht 2 + Eigentümer des Datensatzes

Formular ohne MATCHCODE

Bei reinen Webformularen ohne MCDMS-MATCHCODE können verwendet werden:

AdminOnly=TRUE

oder:

ONLY_USERS=MUELLER;MEIER;SCHMIDT

ONLY_USERS enthält MCDMS-Loginnamen.

Alle Berechtigungsprüfungen erfolgen serverseitig.

Database

Database definiert das Datenmodell eines Formulars.

Einfaches Formular

Syntax:

Database=TABELLE;PRIMÄRSCHLÜSSEL;PATIENTENFELD

Beispiel:

Database=FRM_ANAMNESE;FRMID;PatientID

Bedeutung:

FRM_ANAMNESE
→ Mastertabelle

FRMID
→ technischer Primärschlüssel

PatientID
→ Patientenbezug

Die PatientID wird ausschließlich aus der aktuellen serverseitigen Session übernommen.

Datenbankloses Formular

Ein Formular muss keine eigene Datenbanktabelle besitzen.

Database=

Geeignet beispielsweise für:

  • Patientenübersichten
  • Dashboards
  • Informationsseiten
  • reine MCDMS-Scriptfunktionen
  • Druckseiten
  • Navigation
  • Hilfsfunktionen

Auch solche Formulare können:

  • Templatevariablen
  • HTML
  • CSS
  • JavaScript
  • MCDMS-Actions
  • ScriptLoadHTML

verwenden.

SQL Server und Access

Formulardaten können aus:

  • SQL Server
  • Microsoft Access

stammen.

Für SQL Server genügt normalerweise die Database-Angabe.

Für Access wird zusätzlich DatabaseFile verwendet.

Beispiel:

DatabaseFile=DATABASE\FORMULAR\ERGOMETERTRAINING.MDB
Database=FORMULAR;FRMID;PatientID

Dynamisches Access-DatabaseFile

Der Datenbankpfad kann patientenabhängig aufgebaut werden.

Beispiel:

DatabaseFile=DATABASE\MEDDOK{IDDEV}.MDB

{IDDEV} stammt aus dem serverseitig gesicherten Patientenkontext.

Der resultierende Pfad wird serverseitig validiert.

Master-/Detailformulare

Ein Formular kann einen Masterdatensatz und beliebig viele Detaildatensätze besitzen.

Syntax:

Database=MASTER;MASTER_PK;PATIENTENFELD#DETAIL;DETAIL_PK;MASTER_FK;PATIENTENFELD

Beispiel:

Database=FRM_MEDIKATIONSPLAN;FRMID;PatientID#FRM_MEDIKATIONSPLAN_DETAIL;ID;FRMID;PatientID

Bedeutung:

FRM_MEDIKATIONSPLAN
→ Mastertabelle

FRMID
→ Master-PK

PatientID
→ Master-Patientenfeld


FRM_MEDIKATIONSPLAN_DETAIL
→ Detailtabelle

ID
→ Detail-PK

FRMID
→ Fremdschlüssel zum Master

PatientID
→ Detail-Patientenfeld

Detail-Lifecycle

Beim Laden werden die Details über:

MasterFK = aktuelle Master-ID
PatientID = aktueller Patient

geladen.

Beim Speichern werden Master und Details gemeinsam in einer Transaktion verarbeitet.

Für die Detaildaten gilt:

aktueller Browserbestand
→ vollständiger gewünschter Detailbestand

Die bisher gespeicherten Detailzeilen werden innerhalb derselben Transaktion durch den aktuellen Bestand ersetzt.

Bei einem Fehler erfolgt ein vollständiger Rollback.

OrderBy

Für MultiRecord-Formulare kann die Reihenfolge der Masterdatensätze definiert werden.

Beispiel:

OrderBy=FRMID;DESC

oder:

OrderBy=DATE;ASC

Erlaubt ist genau eine reale Spalte mit:

ASC
DESC

OrderByDetails

Für Master-/Detailformulare:

OrderByDetails=ID;ASC

oder beispielsweise:

OrderByDetails=LEISTUNGSDATUM;DESC

Die Einstellung betrifft ausschließlich die Detailzeilen innerhalb eines Masters.

HTML als normale Webtechnologie

Formulare sind normale HTML-Dokumente.

Sie können verwenden:

  • HTML5
  • CSS
  • JavaScript
  • Inline-Styles
  • Inline-Scripts
  • DOM-Events
  • lokale CSS-Dateien
  • lokale JavaScript-Dateien
  • lokale Bilder

Formular-CSS sollte auf einen eigenen Formularbereich begrenzt werden.

Beispiel:

.medikationsplan .feld {
    font-weight: 600;
}

statt:

input {
    font-weight: 600;
}

damit das Formular nicht unbeabsichtigt die WebAkte-Shell verändert.

Lokale Ressourcen

Formulare können Ressourcen aus der WebAkte verwenden:

/CSS/...
/JS/...
/IMAGES/...

Externe Script-, CSS- und Datenquellen sind aufgrund der Sicherheitsrichtlinien nicht für normale Formularlogik vorgesehen.

Masterfelder

Ein bearbeitbares Masterfeld benötigt:

name
data-field

Beispiel:

<input type="text"
       name="MEDIKATION1"
       data-field="MEDIKATION1">

Beide Namen müssen case-insensitiv identisch sein.

data-field ordnet das Control einer Master-Datenbankspalte zu.

Beim Speichern muss diese Spalte tatsächlich existieren und beschreibbar sein.

Anzeigeelemente

Ein Element mit data-field, aber ohne name, kann als Anzeigeelement verwendet werden.

Es wird nicht als beschreibbares Masterfeld behandelt.

Damit können Daten angezeigt werden, ohne sie beim Speichern zurückzuschreiben.

Hidden-Felder

Auch versteckte Felder können normale Masterfelder sein.

Beispiel:

<input type="hidden"
       name="ErstelltVon"
       data-field="ErstelltVon"
       value="[#ErstelltVon#]">

oder:

<input type="hidden"
       name="ErstelltAm"
       data-field="ErstelltAm"
       value="[#ErstelltAm#]">

Hidden-Felder sind normale Browserwerte und werden serverseitig genauso validiert wie sichtbare Felder.

Native HTML-Feldtypen

Die WebAkte verwendet normale HTML5-Feldtypen.

Beispiele:

<input type="text">

<input type="date">

<input type="time">

<input type="datetime-local">

<input type="number">

<input type="checkbox">

<input type="radio">

<textarea></textarea>

<select></select>

Detailfelder

Detailfelder werden mit:

data-detail-field

gekennzeichnet.

Beispiel:

<input type="text"
       data-detail-field="NAMEWIRKSTOFF">

Detailcontainer

Ein Master-/Detailformular benötigt mindestens einen:

data-mcdms-detail-list

Container.

Beispiel:

<tbody data-mcdms-detail-list>
</tbody>

Gemeinsames Detailtemplate

Es gibt genau ein gemeinsames:

template[data-mcdms-detail-row]

Beispiel:

<template data-mcdms-detail-row>
    <tr>
        <td>
            <input data-detail-field="NAMEWIRKSTOFF">
        </td>
        <td>
            <input data-detail-field="SCHEMA">
        </td>
    </tr>
</template>

Mehrere Detailbereiche

Ein Formular darf mehrere echte Detailcontainer besitzen.

Beispiel:

<tbody data-mcdms-detail-list
       data-area="REGEL">
</tbody>

<tbody data-mcdms-detail-list
       data-area="BESONDERE_ZEITEN">
</tbody>

<tbody data-mcdms-detail-list
       data-area="SELBST">
</tbody>

Alle Container gehören weiterhin zum selben konfigurierten Detailmodell.

Es gibt:

1 Master
1 Detailmodell
1 Detailtemplate
1 gemeinsame Detailfeld-Allowlist
1..n sichtbare Detailcontainer

Der WebServer kennt dabei keine fachliche Bedeutung wie „Regelmedikation“ oder „Selbstmedikation“.

Eine solche Zuordnung wird vom Formular selbst vorgenommen.

Beispielsweise über ein normales Detailfeld:

<input type="hidden"
       data-detail-field="BEREICH">

Laden mehrerer Detailbereiche

Beim serverseitigen Rendern werden vorhandene Detailzeilen zunächst in den ersten Detailcontainer geladen.

Das Formular kann die Zeilen anschließend anhand eigener Datenfelder visuell auf die verschiedenen Container verteilen.

Beim Speichern sammelt die WebAkte alle:

[data-mcdms-detail-list]

in Dokumentreihenfolge ein.

Dadurch sind mehrere sichtbare Detailbereiche vollständig generisch nutzbar.

Textarea

Beispiel:

<textarea name="ANGABEN_VERORDNUNG"
          data-field="ANGABEN_VERORDNUNG"></textarea>

Select

<select name="STATUS"
        data-field="STATUS">

    <option value="">Bitte wählen</option>
    <option value="1">Aktiv</option>
    <option value="0">Inaktiv</option>

</select>

Checkbox

<input type="checkbox"
       name="BTM"
       data-field="BTM">

Typischerweise wird dies auf eine boolesche bzw. bit-Spalte abgebildet.

Radio-Buttons

Mehrere Radio-Buttons gehören zu demselben Formularfeld, wenn sie denselben:

name
data-field

verwenden.

Beispiel:

<label>
    <input type="radio"
           name="GESCHLECHT"
           data-field="GESCHLECHT"
           value="M">
    männlich
</label>

<label>
    <input type="radio"
           name="GESCHLECHT"
           data-field="GESCHLECHT"
           value="W">
    weiblich
</label>

Gespeichert wird der Wert des ausgewählten Radio-Buttons.

Templatevariablen

MCDMS- und Serverwerte können mit:

[#VARIABLE#]

ausgegeben werden.

Beispiel:

<div>[#GESAMTNAME#]</div>

oder:

<input type="text"
       name="ORT"
       data-field="ORT"
       value="[#ORT#]">

Typische Server- und Benutzervariablen

Je nach aktuellem Kontext können unter anderem Variablen aus den Bereichen:

Benutzer
Patient
System
PatientVar

bereitgestellt werden.

Beispiele:

USERID
USERNAME
USERVORNAME
USERLOGINNAME
USERABTEILUNG
USERGRUPPE
USERSTATION
USERMAIL
USERTYPE

System:

APPPATH
DATE
TIME
KWOCHE

Patientenbezug:

PATIENTID
MANDANTNR
IDDEV
IDDEVLAB
ALTER

Die genaue verfügbare Variablenliste wird in Kapitel 08 HTML-Formulare vollständig dokumentiert.

PatientVar und data-field

PatientVars und Formularfelder sind bewusst getrennt.

Ein:

data-field
  • erzeugt keine PatientVar
  • löscht keine PatientVar
  • überschreibt keine PatientVar
  • schreibt einen Browserwert nicht automatisch in eine PatientVar zurück

Beispiel:

PatientVar TESTVAR = ABC

Ein neues Formular enthält:

<input name="TESTVAR"
       data-field="TESTVAR"
       value="[#TESTVAR#]">

Dann kann beim ersten Öffnen eines neuen Datensatzes:

TESTVAR = ABC

als Initialwert erscheinen.

Ändert der Anwender den Formularwert anschließend auf:

XYZ

bleibt die PatientVar weiterhin:

ABC

Bestehende Datensätze

Bei einem vorhandenen Datensatz ist die Datenbank die maßgebliche Quelle.

Ist eine SQL-Spalte:

NULL

oder leer, wird dieser Wert nicht automatisch mit aktuellen:

  • PatientVars
  • Servervariablen
  • Benutzerwerten

gefüllt.

Dadurch bleiben bestehende Datensätze reproduzierbar.

Neuer Datensatz

Bei:

+ Neu

wird ein neuer Formularzustand erzeugt.

Alte Recordwerte werden nicht übernommen.

Nach ScriptLoadHTML kann eine gleichnamige PatientVar einmalig ein noch unbelegtes Masterfeld initialisieren.

Nach erfolgreichem INSERT erhält der neue Datensatz seine echte technische RecordID.

Speichern

Der zentrale Save-Lifecycle ist:

Formulardaten sammeln
↓
Rechte und Patientenkontext prüfen
↓
Feld-Allowlist prüfen
↓
SQL-Metadaten prüfen
↓
Master speichern
↓
Details speichern
↓
COMMIT
↓
technischen Primärschlüssel bereitstellen
↓
ScriptSaveHTML
↓
Master und Details erneut lesen
↓
ScriptLoadHTML
↓
finalen Datenbankzustand darstellen

Master und Details werden gemeinsam transaktional gespeichert. PROJECT-HANDOVER

Geschützte Felder

Technische Felder können nicht frei über Browserwerte geschrieben werden.

Dazu gehören insbesondere:

  • Master-Primärschlüssel
  • PatientID
  • Identity-Spalten
  • computed-Spalten
  • rowversion/timestamp
  • Detail-PK
  • Master-FK

Der WebServer ermittelt diese Werte selbst.

ScriptLoadHTML

Konfiguration:

ScriptLoadHTML=CONFIG\Scripts\WEB\load.mcfscr

ScriptLoadHTML läuft vor dem Rendern des Formulars.

Typische Einsatzbereiche:

  • PatientVars vorbereiten
  • zusätzliche Informationen ermitteln
  • Berechnungen
  • fachliche Prüfungen
  • Anzeigeinformationen bereitstellen

Bei einem neuen Datensatz können daraus Initialwerte für noch unbelegte Masterfelder entstehen.

ScriptSaveHTML

ScriptSaveHTML=CONFIG\Scripts\WEB\save.mcfscr

ScriptSaveHTML wird genau einmal nach erfolgreichem SQL-Commit ausgeführt.

Das bedeutet:

Datensatz ist bereits gespeichert
↓
ScriptSaveHTML

Das Script kann anschließend mit der echten technischen RecordID arbeiten.

Danach liest die WebAkte Master und Details erneut aus der Datenbank.

Fehler in ScriptSaveHTML

Schlägt ScriptSaveHTML fehl:

Der Datensatz bleibt gespeichert.

Es erfolgt kein Rollback des bereits erfolgreich committed SQL-Datensatzes.

Der Benutzer erhält eine entsprechende Fehlermeldung mit einer korrelierbaren Fehler-ID.

ScriptDelete

ScriptDelete=CONFIG\Scripts\WEB\delete.mcfscr

Das Script läuft vor dem eigentlichen SQL-Delete.

Liefert das Script keinen Erfolg oder tritt ein Fehler auf, wird der Datensatz nicht gelöscht.

Bei einem Master-/Detailformular läuft ScriptDelete einmal für den Mastervorgang.

Mehrere Scripts

Mehrere Scriptpfade können durch Semikolon getrennt werden.

ScriptLoadHTML=CONFIG\Scripts\a.mcfscr;CONFIG\Scripts\b.mcfscr

Die Ausführung erfolgt von links nach rechts.

Sobald ein Script fehlschlägt, wird die jeweilige Scriptfolge beendet.

Script-Ausführung

Scripts werden direkt über die sessioneigene MCDMS5API-Frameworkinstanz ausgeführt.

Damit arbeiten sie im aktuellen:

  • Benutzerkontext
  • Patientenkontext
  • MCDMS-Kontext

Scriptpfade stammen ausschließlich aus serverseitiger Konfiguration.

Actions

Ein Formular kann frei definierbare Aktionen enthalten.

HTML:

<button type="button"
        data-mcdms-action="DRUCKEN">
    Drucken
</button>

FORMULARE.INI:

Action_DRUCKEN=CONFIG\Scripts\WEB\DRUCKEN.MCFSCR

Der Browser übermittelt nur:

DRUCKEN

Der tatsächliche Scriptpfad wird ausschließlich serverseitig aus der Formular-Konfiguration ermittelt.

Mehrere Actions

Beispiel:

Action_DRUCKEN=CONFIG\Scripts\WEB\DRUCKEN.MCFSCR
Action_PDF=CONFIG\Scripts\WEB\PDF.MCFSCR
Action_FREIGEBEN=CONFIG\Scripts\WEB\FREIGEBEN.MCFSCR

HTML:

<button type="button"
        data-mcdms-action="DRUCKEN">
    Drucken
</button>

<button type="button"
        data-mcdms-action="PDF">
    PDF erzeugen
</button>

<button type="button"
        data-mcdms-action="FREIGEBEN">
    Freigeben
</button>

ActionReload

Standardmäßig führt eine erfolgreiche Action keinen vollständigen Reload aus.

Optional:

ActionReload_AKTUALISIEREN=TRUE

Dann wird nach erfolgreicher Action die aktuelle Formularseite vollständig neu geladen.

Sind noch ungespeicherte Formularänderungen vorhanden, wird ein automatischer Reload verhindert.

Eine Action speichert das Formular nicht automatisch.

Action-Feedback

Während einer Action wird die angeklickte Schaltfläche temporär deaktiviert.

Beispiel:

Drucken
↓
Drucken...
↓
Ausgeführt
↓
Drucken

Bei Fehler:

Drucken...
↓
Fehlgeschlagen
↓
Drucken

Scriptwerte als Text

Ein Script kann beispielsweise setzen:

TESTVAR=Zeile 1
Zeile 2

Ausgabe:

<div style="white-space: pre-line">
    [#TESTVAR#]
</div>

Damit werden vorhandene Zeilenumbrüche sichtbar.

Dynamisches HTML aus Scriptwerten

Soll ein Scriptwert bewusst als HTML interpretiert werden:

<div data-mcdms-html="TESTVAR"></div>

Dieser dynamische Inhalt wird vor der Ausgabe serverseitig bereinigt.

Er ist nicht mit dem statisch administrierten Formular-HTML gleichzusetzen.

JavaScript im Formular

Formulare dürfen normales JavaScript verwenden.

Beispiel:

<script>
(function () {
    document.addEventListener("click", function (event) {
        // Formularlogik
    });
})();
</script>

Normale DOM-Ereignisse und Browserfunktionen können direkt verwendet werden.

Besonderheit beim Speichern

Nach dem Speichern wird nicht die komplette Seite neu geladen.

Die WebAkte ersetzt nur den eigentlichen Formularbereich durch den neu gerenderten Endzustand.

Dadurch bleiben erhalten:

  • Navigation
  • Patientenkopf
  • aktuelle Seite
  • Scrollposition

Formular-JavaScript muss deshalb so geschrieben sein, dass es mit einem partiellen DOM-Austausch umgehen kann. PROJECT-HANDOVER

Empfohlen sind:

  • Event Delegation
  • idempotente Initialisierung
  • keine Annahme, dass ein <script> nach jedem Save erneut ausgeführt wird

RecordView=LIST

Für bestimmte Formulare können mehrere Datensätze unmittelbar in einer gemeinsamen Liste bearbeitet werden.

Beispiel:

MultiRecord=TRUE
RecordView=LIST
Database=DIAGNOSEN;ID;PatientID
OrderBy=ICDRANG;ASC

Das HTML verwendet:

data-mcdms-record-list

und ein gemeinsames:

template[data-mcdms-record-row]

Die Felder werden gekennzeichnet mit:

data-record-field

Beispiel:

<div data-mcdms-record-list></div>

<template data-mcdms-record-row>
    <div>
        <input data-record-field="DIAGNOSE">
        <input data-record-field="ICD">
    </div>
</template>

LIST unterstützt unter anderem:

  • Hinzufügen
  • Bearbeiten
  • Löschen
  • Duplizieren
  • Sortieren
  • gemeinsames Speichern

Persistente LIST-Reihenfolge

Ein numerisches Datenbankfeld kann als dauerhafte Sortierreihenfolge verwendet werden.

HTML:

<input type="hidden"
       data-record-field="ICDRANG"
       data-mcdms-record-order>

Beim Speichern wird die aktuelle sichtbare Reihenfolge auf:

1
2
3
4
...

normalisiert.

Scripts bei RecordView=LIST

Auch LIST-Formulare können verwenden:

ScriptLoadHTML=
ScriptSaveHTML=
ScriptDelete=

Dabei gelten sie jeweils für den gesamten LIST-Vorgang.

Besonderheit MATCHCODE und LIST

RecordView=LIST bildet mehrere Datensätze gleichzeitig ab.

Eine automatische native MCDMS-Akte-Zuordnung je einzelnen LIST-Datensatz ist derzeit nicht Teil dieses Vertrags.

Deshalb darf der LIST-Batch selbst nicht mit einer automatischen per-SatzID-Aktenlogik verwechselt werden.

Direkte Formular-URLs

Kanonische URLs sind beispielsweise:

/1043

Patientenstammblatt.

/1043/medikation

Aktenbereich.

/1043/medikation/FORMULAR_MEDIKATIONSPLAN

Formular.

/1043/medikation/FORMULAR_MEDIKATIONSPLAN/24

Vorhandener Masterdatensatz.

Detaildatensätze besitzen keine eigene URL.

Änderungen an HTML

HTML-Dateien werden beim Öffnen eines Formulars neu gelesen.

Änderungen an:

HTML
CSS
JavaScript

benötigen daher grundsätzlich keinen Austausch der WebServer-EXE.

Änderungen an FORMULARE.INI

FORMULARE.INI wird beim Start des WebServers eingelesen und validiert.

Nach Änderungen sollte der Dienst neu gestartet werden:

Stop-Service MCDMS.WebAkte
Start-Service MCDMS.WebAkte

Validierung beim Start

Die WebAkte prüft Konfiguration und Datenmodelle bereits beim Start.

Je nach Formular gehören dazu unter anderem:

  • HTML-Datei vorhanden
  • Navigationszweig gültig
  • Tabelle vorhanden
  • Primärschlüssel vorhanden
  • Patientenfeld vorhanden
  • Master-/Detailstruktur gültig
  • SQL-Typen geeignet
  • Detail-Fremdschlüssel gültig
  • Delete-Cascade vorhanden
  • Sortierspalten vorhanden
  • Templatevertrag gültig

Fehlerhafte Konfigurationen werden nicht stillschweigend akzeptiert.

Grundprinzip

Die WebAkte trennt bewusst:

Navigation
→ WEB.INI / AKTENSTRUKTUR

Formular
→ FORMULARE.INI

Darstellung
→ HTML / CSS / JavaScript

Datenhaltung
→ SQL Server / Access

fachliche Logik
→ MCDMS-Scripts

Berechtigung
→ MCDMS-Rechte / WebAkte-Regeln

Interaktion
→ HTML / JavaScript / Actions

Dabei gilt:

Navigation ≠ Formular

Formular ≠ Datenbankdatensatz

data-field ≠ PatientVar

Master ≠ Detail

OrderBy ≠ OrderByDetails

HTML-Logik ≠ Server-Sicherheitslogik

Normale Webstandards werden direkt verwendet.

MCDMS-spezifische Erweiterungen kommen nur dort hinzu, wo sie tatsächlich benötigt werden.