<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://superxhosting.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danielq</id>
	<title>SuperX - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://superxhosting.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Danielq"/>
	<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php/Spezial:Beitr%C3%A4ge/Danielq"/>
	<updated>2026-08-03T21:10:52Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.11</generator>
	<entry>
		<id>https://superxhosting.de/wiki/index.php?title=Kernmodul_Regelbetrieb&amp;diff=16377</id>
		<title>Kernmodul Regelbetrieb</title>
		<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php?title=Kernmodul_Regelbetrieb&amp;diff=16377"/>
		<updated>2026-08-01T09:55:39Z</updated>

		<summary type="html">&lt;p&gt;Danielq: /* Migration auf die Webapp-Struktur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=BI Maintenance=&lt;br /&gt;
[[image:logobutton_maintenance2b.png|200px]]&lt;br /&gt;
&lt;br /&gt;
==Ziel und Überblick==&lt;br /&gt;
Die hier bereitgestellten Skripte ermöglichen es, in der BI-Umgebung von HISinOne und in Zukunft auch von SuperX (aktuell können die Scripte in SuperX leider noch nicht verwendet werden) Modul-Updates und -Upgrades zuverlässig über die Shell auszuführen – automatisiert per Cronjob oder manuell.  Sie orientieren sich bewusst am bisherigen Vorgehen aus SuperX, wurden jedoch erweitert:&lt;br /&gt;
&lt;br /&gt;
* Ausführung der BI-Modul-Updates/-Upgrades über Java (&#039;&#039;ComponentAdminCLI&#039;&#039;).&lt;br /&gt;
* Vollständige Protokollierung in Logdateien.&lt;br /&gt;
* Optional: Protokollierung der Läufe in der Tabelle &amp;lt;code&amp;gt;update_prot&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Automatischer Mailversand über ein konfigurierbares Mailprogramm.&lt;br /&gt;
* Optional: Erkennen interner Fehler im Batch-Job (auch wenn Java Exitcode 0 liefert).&lt;br /&gt;
* Möglichkeit, Logdateien automatisch an Mails anzuhängen (erfolgreiche und fehlerhafte Module).&lt;br /&gt;
&lt;br /&gt;
==Installation aus dem git Repository==&lt;br /&gt;
&lt;br /&gt;
Führen Sie folgenden Shell-Befehl aus:&lt;br /&gt;
&lt;br /&gt;
 git clone https://git.campussource.de/git/SuperX/BI_Maintenance.git&lt;br /&gt;
&lt;br /&gt;
Die weitere Konfiguration wird im Folgenden beschrieben. Alle Einstellungen erfolgen zentral in der Datei &amp;lt;code&amp;gt;BI_ENV&amp;lt;/code&amp;gt;, die als Template &amp;lt;code&amp;gt;BI_ENV.sam&amp;lt;/code&amp;gt; ausgeliefert wird.&lt;br /&gt;
&lt;br /&gt;
==Umgebungsvariablen in der BI_ENV==&lt;br /&gt;
&lt;br /&gt;
===BI_ENV.sam – Template und lokale BI_ENV===&lt;br /&gt;
Die Datei &amp;lt;code&amp;gt;BI_ENV.sam&amp;lt;/code&amp;gt; wird als Muster ausgeliefert. &lt;br /&gt;
&lt;br /&gt;
Sie muss vor Ort:&lt;br /&gt;
&lt;br /&gt;
# in &amp;lt;code&amp;gt;BI_ENV&amp;lt;/code&amp;gt; kopiert/umbenannt werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp BI_ENV.sam BI_ENV&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# an die lokalen Gegebenheiten angepasst werden (Pfade, Module, Mailadressen usw.).&lt;br /&gt;
# mit restriktiven Rechten versehen werden:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chmod 600 BI_ENV&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Skripte binden diese Datei später mit&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
. /pfad/zu/BI_ENV&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
ein.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
===Bedeutung der Variablen===&lt;br /&gt;
Im Folgenden die wichtigsten Variablen, die angepasst werden müssen.&lt;br /&gt;
&lt;br /&gt;
====Java-Konfiguration====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64&lt;br /&gt;
export JAVA_HOME&lt;br /&gt;
&lt;br /&gt;
JRE_HOME=$JAVA_HOME&lt;br /&gt;
export JRE_HOME&lt;br /&gt;
&lt;br /&gt;
PATH=$JAVA_HOME/bin:$PATH&lt;br /&gt;
export PATH&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Variablen stellen sicher, dass die BI-Jobs mit dem vorgesehenen Java (empfohlen: Java 17) ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
Java-Optionen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
JAVA_OPTS=&amp;quot;-Xmx1520M -Djava.awt.headless=true ... --add-opens ...&amp;quot;&lt;br /&gt;
export JAVA_OPTS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pfade zur SuperX-BI-Installation====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
WEBAPP=/var/lib/tomcat10/webapps/superx&lt;br /&gt;
export WEBAPP&lt;br /&gt;
&lt;br /&gt;
SUPERX_DIR=$WEBAPP/WEB-INF/conf/edustore&lt;br /&gt;
export SUPERX_DIR&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Pfade müssen an lokale Tomcat-Installation und SuperX-Verzeichnisstruktur angepasst werden.&lt;br /&gt;
&lt;br /&gt;
====Modulsteuerung====&lt;br /&gt;
Für die Update- und Upgrade-Skripte werden die zu bearbeitenden Module festgelegt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export BI_UPDATE_MODULES=&amp;quot;sos kenn zul&amp;quot;&lt;br /&gt;
export BI_UPGRADE_MODULES=&amp;quot;kenn&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis:  &lt;br /&gt;
Die Modulkürzel müssen klein geschrieben sein (z. B. &amp;lt;code&amp;gt;sos&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;kenn&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;zul&amp;lt;/code&amp;gt;) und mit Leerzeichen getrennt aufgelistet werden.&lt;br /&gt;
&lt;br /&gt;
====Logging====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
LOGPFAD=$WEBAPP/WEB-INF/logs&lt;br /&gt;
export LOGPFAD&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Logpfad werden u. a. folgende Dateien erzeugt:&lt;br /&gt;
* &amp;lt;code&amp;gt;bi_update.log&amp;lt;/code&amp;gt; – Sammellog des Updates&lt;br /&gt;
* &amp;lt;code&amp;gt;bi_upgrade.log&amp;lt;/code&amp;gt; – Sammellog des Upgrades&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;modul&amp;amp;gt;_update.log&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;modul&amp;amp;gt;_upgrade.log&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Java-Batch-Jobs erzeugen ergänzende Logs in:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;$WEBAPP/WEB-INF/logs/jobs&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Mailversand====&lt;br /&gt;
Folgende Variablen steuern Empfänger und Format der Benachrichtigungen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export ERRORMAIL=&amp;quot;admin@hs.de&amp;quot;&lt;br /&gt;
export LOGMAIL=&amp;quot;$ERRORMAIL&amp;quot;&lt;br /&gt;
#export LOGMAIL=&amp;quot;admin@hs.de kollege@hs.de&amp;quot;   # mehrere Empfänger möglich&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ERRORMAIL&amp;lt;/code&amp;gt; – Empfänger für Fehlermails  &lt;br /&gt;
* &amp;lt;code&amp;gt;LOGMAIL&amp;lt;/code&amp;gt; – Empfänger für Erfolgs- und Statusmails  &lt;br /&gt;
Mehrere Adressen werden per Leerzeichen getrennt.&lt;br /&gt;
&lt;br /&gt;
Mailprogramm:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export MAILPROG=&amp;quot;s-nail --account=test1 -S ttycharset=utf-8 -S sendcharset=utf-8&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Betreffzeilen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export MAIL_BETREFF_UPDATE=&amp;quot;BI Job Update&amp;quot;&lt;br /&gt;
export MAIL_BETREFF_UPGRADE=&amp;quot;BI Job Upgrade&amp;quot;&lt;br /&gt;
export MAIL_BETREFF_SUFFIX_ERFOLGREICH=&amp;quot; - Erfolgreich&amp;quot;&lt;br /&gt;
export MAIL_BETREFF_SUFFIX_FEHLER=&amp;quot; - Fehler&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Datei:Kernmodul Regelbetrieb Mailversand.png|rand|links]]&lt;br /&gt;
&lt;br /&gt;
So könnten die Mails aussehen.&lt;br /&gt;
&lt;br /&gt;
====Steuerung der Log-Anhänge====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# error  = Logs nur bei Fehlern anhängen&lt;br /&gt;
# always = Logs immer anhängen (Erfolg + Fehler)&lt;br /&gt;
export MAIL_ATTACH_LOGS_MODE=&amp;quot;error&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Optionale Prüfung der Modul-Logs====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# true  = zusätzlich Modul-Log auf interne Fehler prüfen&lt;br /&gt;
# false = nur Exitcode des Java-Calls verwenden&lt;br /&gt;
export CHECK_JOBLOG_FOR_ERRORS=&amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gerade bei dem Java Aufruf von ComponentAdminCLI empfehlenswert, da dieser aktuell noch trotz &amp;lt;code&amp;gt;status: FAILED&amp;lt;/code&amp;gt; oft Exitcode 0 liefert.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=Module Updates=&lt;br /&gt;
&lt;br /&gt;
==modules_update.sh – Hauptskript==&lt;br /&gt;
Dieses Skript führt alle Module aus &amp;lt;code&amp;gt;BI_UPDATE_MODULES&amp;lt;/code&amp;gt; nacheinander aus.&lt;br /&gt;
&lt;br /&gt;
Ablauf:&lt;br /&gt;
&lt;br /&gt;
# Startcheck: Sind &amp;lt;code&amp;gt;WEBAPP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LOGPFAD&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;BI_UPDATE_MODULES&amp;lt;/code&amp;gt; gesetzt?&lt;br /&gt;
# Falls verfügbar: DB-Protokollierung via &amp;lt;code&amp;gt;DOQUERY&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Für jedes Modul:&lt;br /&gt;
## Logdatei anlegen&lt;br /&gt;
## Start in &amp;lt;code&amp;gt;update_prot&amp;lt;/code&amp;gt; protokollieren (update_id = -10000)&lt;br /&gt;
## Java-Update starten:  &lt;br /&gt;
   &amp;lt;code&amp;gt;ComponentAdminCLI -e &amp;amp;lt;modul&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
## Optional: Modul-Logdatei nach internen Fehlern durchsuchen&lt;br /&gt;
## Erfolg:&lt;br /&gt;
### Modul-Log in &amp;lt;code&amp;gt;SUCCESS_LOG_FILES&amp;lt;/code&amp;gt;&lt;br /&gt;
### DB-Update (update_id = -10000)&lt;br /&gt;
## Fehler:&lt;br /&gt;
### Modul-Log in &amp;lt;code&amp;gt;ERROR_LOG_FILES&amp;lt;/code&amp;gt;&lt;br /&gt;
### DB-Update (update_id = -10001)&lt;br /&gt;
## Zuletzt: Java-Joblogs aus &amp;lt;code&amp;gt;$WEBAPP/WEB-INF/logs/jobs&amp;lt;/code&amp;gt; ermitteln&lt;br /&gt;
&lt;br /&gt;
# Nach Abschluss aller Module:&lt;br /&gt;
## Erfolgs- oder Fehlermail versenden&lt;br /&gt;
## Anhänge abhängig von &amp;lt;code&amp;gt;MAIL_ATTACH_LOGS_MODE&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==modules_update_cron.sh – Wrapper für Cron==&lt;br /&gt;
Damit Updates regelmäßig durchgeführt werden können, existiert ein einfaches Wrapper-Skript.&lt;br /&gt;
&lt;br /&gt;
Vorgehen:&lt;br /&gt;
&lt;br /&gt;
# Beispieldatei kopieren:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp modules_update_cron.sh.sam modules_update_cron.sh&lt;br /&gt;
chmod +x modules_update_cron.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
# Pfade zur &amp;lt;code&amp;gt;BI_ENV&amp;lt;/code&amp;gt; und zum Update-Skript anpassen.&lt;br /&gt;
# Cronjob eintragen, z. B. werktags um 18 Uhr:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
0 18 * * 1-5 /pfad/zu/modules_update_cron.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inhaltlich:&lt;br /&gt;
* Laden der &amp;lt;code&amp;gt;BI_ENV&amp;lt;/code&amp;gt;&lt;br /&gt;
* Start des Skripts &amp;lt;code&amp;gt;modules_update.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=Module Upgrades=&lt;br /&gt;
&lt;br /&gt;
==modules_upgrade.sh – Hauptskript==&lt;br /&gt;
Das Upgrade-Skript entspricht dem Update-Skript, unterscheidet sich aber in folgenden Punkten:&lt;br /&gt;
&lt;br /&gt;
* Es wird **manuell** ausgeführt – kein Cronjob vorgesehen.&lt;br /&gt;
* Es verwendet &amp;lt;code&amp;gt;BI_UPGRADE_MODULES&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Das eigentliche Upgrade erfolgt über:  &lt;br /&gt;
  &amp;lt;code&amp;gt;ComponentAdminCLI -u &amp;amp;lt;modul&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Nach Abschluss des Upgrades erfolgt ein Mailversand analog zum Update-Skript.&lt;br /&gt;
&lt;br /&gt;
Aufruf:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /var/lib/tomcat10/webapps/superx/WEB-INF/bin/BI-Maintenance/update&lt;br /&gt;
./modules_upgrade.sh&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vorher muss zu Beginn des Skripts der Pfad zur &amp;lt;code&amp;gt;BI_ENV&amp;lt;/code&amp;gt; eingetragen sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
. /pfad/zur/BI_ENV&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=Modulverwaltung=&lt;br /&gt;
&lt;br /&gt;
==Modulkürzel==&lt;br /&gt;
Die folgenden Modulkürzel sind in einer typischen BI-Installation relevant:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 kuerzel |                         name                          &lt;br /&gt;
---------+-------------------------------------------------------&lt;br /&gt;
 astat   | Amtliche Statistik                                &lt;br /&gt;
 bau     | Gebäude, Räume, Flächen                           &lt;br /&gt;
 cob     | Kostenrechnung                                    &lt;br /&gt;
 erfolg  | Studienverlauf                                    &lt;br /&gt;
 fin     | Finanzrechnung                                    &lt;br /&gt;
 gang    | Studiengänge                                      &lt;br /&gt;
 ivs     | Inventar                                          &lt;br /&gt;
 kenn    | Kennzahlen                                        &lt;br /&gt;
 kern    | Administration                                    &lt;br /&gt;
 lm      | Leistungsmonitoring                               &lt;br /&gt;
 man     | Management                                        &lt;br /&gt;
 prom    | Promovierende                                     &lt;br /&gt;
 res     | Forschung                                         &lt;br /&gt;
 sos     | Studierende, Prüfungen                            &lt;br /&gt;
 sva     | Personal, Stellen                                 &lt;br /&gt;
 zul     | Bewerbung, Zulassung                              &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die aktiven Module der eigenen Installation können mit folgendem SQL abgefragt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT V.his_system AS kuerzel,&lt;br /&gt;
       S.name&lt;br /&gt;
  FROM db_version V&lt;br /&gt;
  JOIN systeminfo S&lt;br /&gt;
    ON S.tid = V.systeminfo_id&lt;br /&gt;
 ORDER BY 1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Migration auf die Webapp-Struktur=&lt;br /&gt;
&lt;br /&gt;
Das bereitgestellte Migrationsskript ermöglicht die Umstellung einer bestehenden SuperX-Installation auf die empfohlene Webapp-Struktur.&lt;br /&gt;
&lt;br /&gt;
Dabei können sowohl klassische Installationen mit separatem DB-Verzeichnis als auch bestehende Webapp-Installationen migriert werden. Die Migration kann je nach Anwendungsfall vollständig oder ausschließlich für das DB-Verzeichnis durchgeführt werden.&lt;br /&gt;
Hier eine Anleitung &amp;quot;in short&amp;quot;, wenn Sie bisher das &amp;quot;klasssische&amp;quot; Layout genutzt haben (also Unix Benutzer &amp;quot;superx&amp;quot;, Installation in &amp;quot;/home/superx&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
 git clone https://git.campussource.de/git/SuperX/BI_Maintenance.git&lt;br /&gt;
 #Script ausführen und neues ENV laden:&lt;br /&gt;
 cd BI_Maintenance/webapps_migration&lt;br /&gt;
 ./migrate_superx_webapp.sh&lt;br /&gt;
&lt;br /&gt;
Das Skript liest die bestehende Installation anhand der vorhandenen SQL_ENV-Datei ein und erzeugt daraus die gewünschte Zielstruktur. Details können in der Konfigurationsdatei &lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
migrate_superx.conf&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
konfiguriert, siehe folgende Dokumentation.&lt;br /&gt;
&lt;br /&gt;
==Zielstruktur==&lt;br /&gt;
&lt;br /&gt;
Die Webapp wird standardmäßig nicht direkt im Tomcat-Webapp-Verzeichnis abgelegt, sondern unter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/home/superx/webapps/superx&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch bleibt die Installation unabhängig von der verwendeten Tomcat-Distribution und kann einfacher per Git, rsync oder Modulupdate gepflegt werden.&lt;br /&gt;
&lt;br /&gt;
Die zugehörige DB-Struktur befindet sich anschließend unter:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/home/superx/webapps/superx/WEB-INF/conf/edustore/db&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Tomcat-Anbindung==&lt;br /&gt;
&lt;br /&gt;
Für den Zugriff des Tomcat-Servers auf die Webapp gibt es grundsätzlich zwei Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
* Verwendung eines symbolischen Links vom Tomcat-Webapp-Verzeichnis auf die eigentliche Webapp.&lt;br /&gt;
* Anpassung der Tomcat-Konfiguration (z. B. appBase oder Context-Konfiguration).&lt;br /&gt;
&lt;br /&gt;
Empfohlen wird die Verwendung eines symbolischen Links.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/srv/tomcat/webapps/superx&lt;br /&gt;
 -&amp;gt; /home/superx/webapps/superx&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wichtige Variablen==&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Einstellungen erfolgen in der Datei:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
migrate_superx.conf&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TARGET_WEBAPP===&lt;br /&gt;
&lt;br /&gt;
Definiert das Zielverzeichnis der Webapp.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
TARGET_WEBAPP=&amp;quot;/home/superx/webapps/superx&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===WEBAPP_USER===&lt;br /&gt;
&lt;br /&gt;
Definiert den Besitzer der Ziel-Webapp.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
WEBAPP_USER=&amp;quot;superx&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===WEBAPP_GROUP===&lt;br /&gt;
&lt;br /&gt;
Definiert die Gruppe der Ziel-Webapp.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
WEBAPP_GROUP=&amp;quot;tomcat&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ergebnis:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Owner: superx&lt;br /&gt;
Group: tomcat&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===MIGRATION_MODE===&lt;br /&gt;
&lt;br /&gt;
Steuert die Art der Migration.&lt;br /&gt;
&lt;br /&gt;
Vollständige Migration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MIGRATION_MODE=&amp;quot;full&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nur Migration des DB-Verzeichnisses:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
MIGRATION_MODE=&amp;quot;db_only&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Migration des DB-Verzeichnisses==&lt;br /&gt;
&lt;br /&gt;
Das DB-Verzeichnis kann entweder kopiert oder verschoben werden.&lt;br /&gt;
&lt;br /&gt;
===DB_TRANSFER_MODE=copy===&lt;br /&gt;
&lt;br /&gt;
Das bestehende DB-Verzeichnis bleibt erhalten.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DB_TRANSFER_MODE=&amp;quot;copy&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intern wird hierfür rsync verwendet.&lt;br /&gt;
&lt;br /&gt;
===DB_TRANSFER_MODE=move===&lt;br /&gt;
&lt;br /&gt;
Das DB-Verzeichnis wird verschoben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DB_TRANSFER_MODE=&amp;quot;move&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Intern wird hierfür mv verwendet.&lt;br /&gt;
&lt;br /&gt;
Dies kann insbesondere bei großen Installationen sinnvoll sein, um unnötigen zusätzlichen Speicherbedarf zu vermeiden.&lt;br /&gt;
&lt;br /&gt;
==Automatische Anpassung der SQL_ENV==&lt;br /&gt;
&lt;br /&gt;
Nach der Migration kann die SQL_ENV-Datei automatisch angepasst werden.&lt;br /&gt;
&lt;br /&gt;
Dabei werden insbesondere folgende Variablen aktualisiert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SUPERX_DIR&lt;br /&gt;
WEBAPP&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird sichergestellt, dass folgende Einstellung vorhanden ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
umask 002&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vor der Änderung wird automatisch eine Sicherungskopie der SQL_ENV-Datei angelegt.&lt;br /&gt;
&lt;br /&gt;
==Benutzer und Gruppen==&lt;br /&gt;
&lt;br /&gt;
Die folgenden Variablen steuern, welchem Benutzer und welcher Gruppe die Ziel-Webapp nach der Migration zugeordnet wird.&lt;br /&gt;
&lt;br /&gt;
===WEBAPP_USER===&lt;br /&gt;
&lt;br /&gt;
Definiert den Besitzer der Ziel-Webapp.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
WEBAPP_USER=&amp;quot;superx&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alle Dateien und Verzeichnisse der Ziel-Webapp werden diesem Benutzer zugeordnet, sofern die Rechteverwaltung aktiviert ist.&lt;br /&gt;
&lt;br /&gt;
===WEBAPP_GROUP===&lt;br /&gt;
&lt;br /&gt;
Definiert die Gruppe der Ziel-Webapp.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
WEBAPP_GROUP=&amp;quot;tomcat&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Gruppe wird für alle Dateien und Verzeichnisse der Ziel-Webapp verwendet.&lt;br /&gt;
&lt;br /&gt;
Durch das gesetzte setgid-Bit auf den Verzeichnissen erben neu angelegte Dateien und Unterverzeichnisse automatisch diese Gruppe.&lt;br /&gt;
&lt;br /&gt;
==Automatische Rechtebehandlung==&lt;br /&gt;
&lt;br /&gt;
Die Migration kann sowohl als root als auch – unter bestimmten Voraussetzungen – direkt als Anwendungsbenutzer ausgeführt werden.&lt;br /&gt;
&lt;br /&gt;
===SET_OWNER=auto===&lt;br /&gt;
&lt;br /&gt;
Dies ist die empfohlene Standardeinstellung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
SET_OWNER=&amp;quot;auto&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Skript entscheidet abhängig vom aktuellen Benutzer automatisch, ob ein Besitzerwechsel erforderlich ist.&lt;br /&gt;
&lt;br /&gt;
====Ausführung als root====&lt;br /&gt;
&lt;br /&gt;
Wird das Skript als root ausgeführt, werden Besitzer und Gruppe der Ziel-Webapp auf die konfigurierten Werte gesetzt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
chown -R $WEBAPP_USER:$WEBAPP_GROUP ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird auch das übergeordnete Verzeichnis der Webapp (z. B. /home/superx/webapps) auf die gleichen Besitz- und Gruppenrechte gesetzt.&lt;br /&gt;
&lt;br /&gt;
====Ausführung als WEBAPP_USER====&lt;br /&gt;
&lt;br /&gt;
Wird das Skript direkt als der konfigurierte WEBAPP_USER ausgeführt und ist dieser Benutzer Mitglied der konfigurierten WEBAPP_GROUP, wird kein chown ausgeführt.&lt;br /&gt;
&lt;br /&gt;
Stattdessen verwendet das Skript bei Bedarf ein chgrp, um die Gruppenzugehörigkeit der Dateien anzupassen.&lt;br /&gt;
&lt;br /&gt;
In diesem Fall kann die Migration häufig vollständig ohne root-Rechte durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
====Ausführung als anderer Benutzer====&lt;br /&gt;
&lt;br /&gt;
Wird das Skript weder als root noch als WEBAPP_USER mit passender Gruppenmitgliedschaft ausgeführt, bricht das Skript mit einer entsprechenden Fehlermeldung ab.&lt;br /&gt;
&lt;br /&gt;
===ADD_WEBAPP_USER_TO_GROUP===&lt;br /&gt;
&lt;br /&gt;
Optional kann das Skript die Gruppenmitgliedschaft des Zielbenutzers automatisch anpassen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ADD_WEBAPP_USER_TO_GROUP=&amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierfür sind root-Rechte erforderlich.&lt;br /&gt;
&lt;br /&gt;
==Tomcat-Symlink==&lt;br /&gt;
&lt;br /&gt;
Optional kann das Skript den Symlink für den Tomcat automatisch erzeugen.&lt;br /&gt;
&lt;br /&gt;
===CREATE_TOMCAT_SYMLINK===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
CREATE_TOMCAT_SYMLINK=&amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOMCAT_WEBAPPS_DIR===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
TOMCAT_WEBAPPS_DIR=&amp;quot;/srv/tomcat/webapps&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===TOMCAT_CONTEXT_NAME===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
TOMCAT_CONTEXT_NAME=&amp;quot;superx&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===REPLACE_EXISTING_SYMLINK===&lt;br /&gt;
&lt;br /&gt;
Bestehende Symlinks können bei Bedarf automatisch ersetzt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
REPLACE_EXISTING_SYMLINK=&amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Normale Dateien oder Verzeichnisse werden dabei niemals automatisch gelöscht.&lt;br /&gt;
&lt;br /&gt;
==Sicherheitsprüfungen==&lt;br /&gt;
&lt;br /&gt;
Vor Beginn der Migration werden verschiedene Sicherheitsprüfungen durchgeführt.&lt;br /&gt;
&lt;br /&gt;
Unter anderem wird geprüft:&lt;br /&gt;
&lt;br /&gt;
* Existiert die SQL_ENV-Datei?&lt;br /&gt;
* Existiert der konfigurierte Benutzer?&lt;br /&gt;
* Existiert die konfigurierte Gruppe?&lt;br /&gt;
* Sind Quell- und Zielverzeichnis identisch?&lt;br /&gt;
* Würde eine Verzeichnisverschachtelung entstehen?&lt;br /&gt;
* Befindet sich SUPERX_DIR bereits innerhalb von WEBAPP?&lt;br /&gt;
&lt;br /&gt;
Wird erkannt, dass die Installation bereits der neuen Struktur entspricht, bricht das Skript standardmäßig ab.&lt;br /&gt;
&lt;br /&gt;
===FORCE_ALREADY_MIGRATED===&lt;br /&gt;
&lt;br /&gt;
In Ausnahmefällen kann diese Prüfung übersteuert werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
FORCE_ALREADY_MIGRATED=&amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies sollte nur verwendet werden, wenn die Auswirkungen bekannt sind.&lt;br /&gt;
&lt;br /&gt;
==Typischer Ablauf==&lt;br /&gt;
&lt;br /&gt;
# Laden der migrate_superx.conf&lt;br /&gt;
# Laden der bestehenden SQL_ENV&lt;br /&gt;
# Ermitteln von SUPERX_DIR, WEBAPP und DB-Verzeichnis&lt;br /&gt;
# Sicherheitsprüfungen&lt;br /&gt;
# Optionales Stoppen des Tomcat-Dienstes&lt;br /&gt;
# Kopieren der Webapp&lt;br /&gt;
# Kopieren oder Verschieben des DB-Verzeichnisses&lt;br /&gt;
# Anpassen der SQL_ENV&lt;br /&gt;
# Setzen von Besitzern, Gruppen und Rechten&lt;br /&gt;
# Optionales Erzeugen des Tomcat-Symlinks&lt;br /&gt;
# Optionales Starten des Tomcat-Dienstes&lt;br /&gt;
&lt;br /&gt;
==Empfohlene Standardkonfiguration==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
TARGET_WEBAPP=&amp;quot;/home/superx/webapps/superx&amp;quot;&lt;br /&gt;
&lt;br /&gt;
WEBAPP_USER=&amp;quot;superx&amp;quot;&lt;br /&gt;
WEBAPP_GROUP=&amp;quot;tomcat&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MIGRATION_MODE=&amp;quot;full&amp;quot;&lt;br /&gt;
DB_TRANSFER_MODE=&amp;quot;copy&amp;quot;&lt;br /&gt;
&lt;br /&gt;
SET_OWNER=&amp;quot;auto&amp;quot;&lt;br /&gt;
SET_RIGHTS=&amp;quot;true&amp;quot;&lt;br /&gt;
SET_CHMOD=&amp;quot;true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CREATE_TOMCAT_SYMLINK=&amp;quot;true&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hinweise==&lt;br /&gt;
&lt;br /&gt;
* Standardziel ist /home/superx/webapps/superx.&lt;br /&gt;
* Die Tomcat-Anbindung kann über einen Symlink erfolgen.&lt;br /&gt;
* Bei WEBAPP_USER=superx und WEBAPP_GROUP=tomcat kann die Migration häufig ohne root erfolgen, sofern der Benutzer Mitglied der Gruppe tomcat ist.&lt;br /&gt;
* Root wird nur benötigt, wenn Besitzer geändert, Benutzer oder Gruppen angepasst oder Systemkonfigurationen verändert werden müssen.&lt;/div&gt;</summary>
		<author><name>Danielq</name></author>
	</entry>
	<entry>
		<id>https://superxhosting.de/wiki/index.php?title=Masken-Tutorial&amp;diff=15958</id>
		<title>Masken-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php?title=Masken-Tutorial&amp;diff=15958"/>
		<updated>2026-06-27T08:10:43Z</updated>

		<summary type="html">&lt;p&gt;Danielq: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Orientierung=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Die Abfragemasken liefern die Daten aus den Basissystemen an das SuperX-Frontend aus. Einige Abfragen zur Administration sind im Kernmodul enthalten, die Abfragen zu den Basissystemen sind in den jeweiligen Modulen enthalten. Die Abfragen in der Administration erlauben es, neue Masken anzulegen, zu kopieren und zu löschen. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Um den Austausch von Abfragen innerhalb der Hochschulen zu erleichtern (&amp;quot;Abfragen-Pooling&amp;quot; über die SuperX-Website), sollten die Masken immer im Nummernkreis 1xxxx0000 bis 1xxxx9970 liegen, wobei xxxx der von DESTATIS verwandten Hochschulnummer entspricht (bei dreistelligen Nummern mit führender 0), also z.B. 1&#039;&#039;&#039;1810&#039;&#039;&#039;0000 für die erste Maske der Uni Mannheim. Es sind Dreißigerschritte zu wählen, da die dazwischen liegenden Nummern für die Maskenfelder (Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;]) reserviert sind. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Im Folgenden finden Sie allgemeine Hinweise für die Verwaltung der Masken. Die Masken lassen sich browserbasiert, über UNIX-Shellscripte, und über Access administrieren. Weitergehende Möglichkeiten bietet aber das XML-Frontend (Möglichkeit der Editierung von großen text -Feldern bei Postgres als Datenbanksystem). Nach der Anmeldung haben Administratoren das Recht, Masken zu löschen, zu kopieren und erzeugen. Die einzelnen Felder der Masken lassen sich direkt in der Datenbank oder z.B. mit MS Access verändern. Im Applet sind nur grundlegende Verwaltungsoperationen möglich. Sie sind als Ersatz für die UNIX- Scripte gedacht. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Maske kopieren: Wie im [https://super-ics.de/superx/doku/entwicklerhandbuch/EineMaskeneueinfgen.htm#sxinsertmask UNIX - Script] wir eine Maske in eine neue Maske kopiert, und alle zugehörigen Tabellen werden aktualisiert. Zusätzlich wird auch der Eintrag im Themenbaum gemacht. Bei der Nummer der Maske (tid) sollten Sie das Nummernschema von SuperX einhalten, um in Zukunft Abfragen-Pooling zu ermöglichen.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Maske löschen: Wie im [https://super-ics.de/superx/doku/entwicklerhandbuch/EineMaskelschen.htm#sxDeleteMask UNIX-Script] werden Masken aus allen dazugehörigen Tabellen entfernt. Zusätzlich wird auch der Eintrag im Themenbaum gelöscht. Zur Sicherheit muss die Nummer der Maske manuell eingegeben werden.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Maske suchen: Sie können Masken suchen und im XML-Frontend komfortabel editieren. Schränken Sie Ihre Auswahl auf ein Sachgebiet ein, und drücken Sie &amp;quot;Abschicken&amp;quot;. Sie erhalten eine Liste mit &amp;quot;Treffern&amp;quot;, und rechts befinden sich jeweils Buttons zum ansehen bzw. editieren einer Maske.&lt;br /&gt;
Die Maske läuft nur unter Postgres, weil Informix kein direktes Bearbeiten von Blob-Feldern mit sql unterstützt.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Analog können Felder kopiert, gelöscht oder gesucht werden.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abfragen sind selbsterklärend; das Erzeugen neuer Masken, Löschen vorhandener Masken und Kopieren vorhandener Masken ist nur für Userkennungen möglich, die in der Tabelle userinfo im Feld administration den Wert 1 haben. Natürlich sollten die Abfragen sehr vorsichtig benutzt werden, sie sind die einzigen Abfragen in SuperX, die tatsächlich Änderungen an der Datenbank vornehmen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
In den folgenden Abschnitten werden die Grundlagen der Maskenentwicklung erläutert. Beginnend beim Abruf einer Ergebnistabelle aus einer Maske, über die Definition der Felder dieser Maske, bis hin zur Definition der dahinterliegenden SQL-Anweisungen.&lt;br /&gt;
&lt;br /&gt;
==Abrufen einer Ergebnistabelle==&lt;br /&gt;
Der Ausgangspunkt ist ein Beispiel aus dem SOS-Modul. Auf der folgenden Abbildung ist der Themenbaum ersichtlich, welcher sich in verschiedene Bereiche gliedert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Themenbaum.PNG|width=600|caption=Themenbaum}}&lt;br /&gt;
&lt;br /&gt;
Wählt man aus der Navigation auf der linken Seite einen Bereich aus, werden Abfragen sichtbar. In diesem Fall ist der Bereich &amp;quot;Bewerbung, Zulassung&amp;quot; ausgewählt und es wird unter anderem die Abfrage &amp;quot;Bewerbungsprozess nach Fach/Studiengang&amp;quot; sichtbar. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Maske.PNG|width=600|caption=Maske}}&lt;br /&gt;
&lt;br /&gt;
Wählt man eine Abfrage aus, erscheint eine Maske, welche verschiedene Möglichkeiten zur Parametrisierung bietet.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Ergebnistabelle.PNG|width=600|caption=Ergebnistabelle}}&lt;br /&gt;
&lt;br /&gt;
Nach einem Klick auf &amp;quot;Abschicken&amp;quot; erscheint die entsprechende Ergebnistabelle.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Felddefinitionen==&lt;br /&gt;
Gehen wir kurz zurück zur Auswahlmaske. Jedes Feld der Maske, z.B. &amp;quot;Semester&amp;quot;, ist ein Datensatz in der Tabelle &#039;felderinfo&#039; . Dort finden Sie Angaben zum Namen, Inhalt und Layout des Feldes. Gehen wir zunächst zum Inhalt des Feldes: Die Liste der Semester. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskenfeldSemester.png|width=400|caption=MaskenfeldSemester}}&lt;br /&gt;
&lt;br /&gt;
Beim Klick auf das Feld Semester erhalten wir eine Reihe von Semestern zur Auswahl. Die Liste ist absteigend sortiert. Sie wird durch die SQL Anweisung [&amp;lt;&amp;lt;SQL&amp;gt;&amp;gt; select tid, eintrag from zul_semester order by tid DESC;] erzeugt. Die SQL-Anweisung liefert aus der Tabelle &#039;zul_semester&#039; die Felder &#039;tid&#039; (&amp;quot;Tupelidentifier&amp;quot;) und &#039;eintrag&#039; (der Volltext des Semesters). Der Schlüssel des Feldes &#039;tid&#039; ist unsichtbar, sorgt aber dafür, dass die Sortierung richtig erfolgt. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=DatenbanktabelleZulSemester.png|width=400|caption=DatenbanktabelleZulSemester}}&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie einen Screenshot der Tabelle &#039;zul_semester&#039; direkt in der Datenbank. Die Nummerierung ist fünfstellig und besteht aus Jahr (vier Stellen) und 1 für Sommer- und 2 für Wintersemester.  &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Speichern der Felddefinition==&lt;br /&gt;
Wo wird nun in SuperX die Felddefinition gespeichert? Viele Scripte in SuperX werden selbst in Datenbanktabellen abgelegt, die Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo felderinfo] enthält die relevanten Angaben für die Felder. &amp;lt;br/&amp;gt; Um dies zu sehen, öffnen wir ein Formular im XML-Frontend. Dort befinden sich Bearbeitungsformulare für Felder und Masken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchen.png|width=600|caption=FeldSuchen}}&lt;br /&gt;
&lt;br /&gt;
Im Themenbaum des XML-Frontends finden wir den Menüpunkt &#039;&#039;&#039;Administration &amp;amp;rarr; Felder &amp;amp;rarr; Feld suchen&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchenMaske.png|width=600|caption=FeldSuchenMaske}}&lt;br /&gt;
&lt;br /&gt;
In dem Formular wählen wir die Abfrage &amp;quot;Bewerbungsprozess nach Fach/Studiengang&amp;quot; aus. Zusätzlich sehen wir auch die Nummer der Maske (26020), was bei der Maskenbearbeitung ganz nützlich ist. Mit einem Klick auf &amp;quot;Abschicken&amp;quot; werden die Eingaben bestätigt und abgeschickt.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchenErgebnis.png|width=600|caption=FeldSuchenErgebnis}}&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste mit den vorhandenen Feldern geliefert. Wir sehen die Nummer des Feldes und den Namen. Rechts daneben befindet sich ein Knopf zum Bearbeiten des Feldes.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleiner Hinweis an dieser Stelle: Die Felder werden in der Tabelle masken_felder_bez der Maske Nr. 26020 zugeordnet. Wir zählen also bei Feldnummern in Einer-Schritten von der Maskennummer aus hoch. Aus diesem Grunde wählen wir bei Maskennummern größere Intervalle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=BearbeitungsformularFeld.png|width=600|caption=BearbeitungsformularFeld}}&lt;br /&gt;
&lt;br /&gt;
Wir wählen nun das Feld &amp;quot;Semester&amp;quot; und gelangen in ein Bearbeitungsformular der Tabelle &#039;felderinfo&#039; . Wir sehen Name, Nummer, Position auf der Maske, Breite und Typ des Feldes (ganzzahlig). Das Feld ist obligatorisch und von der Art Nr. 1 (Nummer + Text, mit Dialog). Im Feld &#039;relation&#039; steht nach dem Steuerungszeichen &amp;amp;lt;&amp;amp;lt;SQL&amp;amp;gt;&amp;amp;gt; der SQL-Befehl. Unten ist noch der Defaultwert für das Feld angegeben, ebenfalls ein SQL-Ausdruck. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SuperX liest also aus der Datenbank die Scripte für eine Maske bzw. für ein Feld aus einer Tabelle, und führt Sie dann in der Datenbank aus.&lt;br /&gt;
&lt;br /&gt;
==Änderung einer Felddefinition==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldBearbeiten.png|width=600|caption=FeldBearbeiten}}&lt;br /&gt;
&lt;br /&gt;
Um die Felddefinition zu ändern, kann nun beispielsweise beim SQL-Befehl DESC durch ASC ersetzt und gespeichert werden. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskenfeldSemesterASC.png|width=400|caption=MaskenfeldSemesterASC}}&lt;br /&gt;
&lt;br /&gt;
Um das neue Script aus der Datenbank zu laden, muss die Maske nun erneut über den Themebaum aufgerufen werden. Wenn wir dann in der Maske auf &amp;quot;Semester&amp;quot; klicken, erscheinen die Semester in aufsteigender Reihenfolge.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art und Weise können wir alle Maskenfelder bearbeiten. Die restlichen Attribute in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;] sind im [https://super-ics.de/superx/doku/kern_modul/admin/f_TabelleFelderinfo.htm Administrationshandbuch Kernmodul] erläutert.&lt;br /&gt;
&lt;br /&gt;
==Maskendefinition==&lt;br /&gt;
&lt;br /&gt;
So weit so gut, wir können nun also Felder ändern. Wie können wir nun die Ergebnistabellen bearbeiten?&amp;lt;br/&amp;gt;&lt;br /&gt;
SuperX arbeitet hier ebenfalls mit SQL-Scripten, die als Felder in einer Tabelle gespeichert sind. Die Tabelle lautet [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_maskeninfo &#039;maskeninfo&#039;]. Wir können uns diese Tabelle ebenfalls im XML-Frontend anschauen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenMaske.png|width=600|caption=MaskeSuchenMaske}}&lt;br /&gt;
&lt;br /&gt;
Im Themenbaum wählen wir &amp;quot;Administation &amp;amp;rarr; Masken verwalten &amp;amp;rarr; Maske suchen&amp;quot;. Es erscheint eine Auswahlmaske ohne Vorbelegung. Es lässt sich nun eine Maske anhand einer Auswahlliste oder Maskennummer suchen. Um das Feld für die Suche mit Maskennummer einzublenden, muss das Schlüsselsymbol geklickt werden. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenErgebnis.png|width=600|caption=MaskeSuchenErgebnis}}&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis sehen wir unsere Maske sowie mehrere Bearbeitungsbuttons. Wir wählen den ersten Button, &#039;&#039;&#039;Bearbeiten&#039;&#039;&#039;. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeninfoVerwalten.png|width=600|caption=MaskeninfoVerwalten}}&lt;br /&gt;
&lt;br /&gt;
Wir gelangen in das Bearbeitungsformular der Maske. Neben der Nummer der Maske sehen wir unter anderem den Namen und die Felder &#039;Select-Statement&#039; und &#039;Spaltenlayout&#039;. Das Feld &#039;Select-Statement&#039; enthält das SQL-Script und &#039;Spaltenlayout&#039; die Ergebnisdarstellung.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abfragen in Maskendefinitionen==&lt;br /&gt;
&lt;br /&gt;
Allgemein formuliert arbeiten wir so:&lt;br /&gt;
# Zunächst werden die Eingaben in den Auswahlfeldern ausgewertet und eine Ergebnismenge ermittelt, meist in Form einer temporären Tabelle.  &lt;br /&gt;
# Diese Tabelle wird mit den Hilfstabellen in der Datenbank gejoined, und es wir eine Ergebnistabelle berechnet. Ggf. werden noch Summen oder Prozente berechnet, meist benötigen wir dazu weitere temporäre Tabellen. &lt;br /&gt;
# Der letzte select im Feld &#039;Select-Statement&#039; enthält die Ergebnistabelle, die das Applet empfängt. Im Feld &#039;Spaltenlayout&#039; werden die Spaltenüberschriften- und Breiten gesetzt und das Ergebnis wird angezeigt. &lt;br /&gt;
# Direkt danach wird die letzte temporäre Tabelle gedroppt, und die Datenbankverbindung wird an das SuperX-Servlet zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenPruefungsstatistik.png|width=600|caption=MaskeSuchenPruefungsstatistik}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird als Beispiel der Bericht &amp;quot;Studierende, Prüfungen &amp;amp;rarr; Einzelprüfungen &amp;amp;rarr; Prüfungsstatistik&amp;quot; herangezogen. Das Script in &#039;Select-Statement&#039; ist relativ lang, wir wollen es daher nur Auszugsweise kommentieren.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement1.png|width=600|caption=SelectStatement1}}&lt;br /&gt;
&lt;br /&gt;
Zu Beginn des Select-Statements wird über &amp;lt;code&amp;gt;select ... into temp tmp_ergebnis&amp;lt;/code&amp;gt; die Ergebnismenge der temporären Tabelle &#039;tmp_ergebnis&#039; übergeben. Einige Felder unterliegen bestimmten Kriterien, wie bspw. das Feld &#039;bestanden&#039;: &amp;lt;code&amp;gt;(case when P.pstatus=&#039;BE&#039; then 1 else 0 end) as bestanden&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement2.png|width=600|caption=SelectStatement2}}&lt;br /&gt;
&lt;br /&gt;
In der folgenden where-Klausel werden verschiedene Bedingungen festgelegt. Hier finden sich Platzhalter wie &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;Seit Semester&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;. Diese Platzhalter entsprechen den Maskenfeldern und werden mit den Benutzereingaben gefüllt. Passagen innerhalb &amp;lt;code&amp;gt;/* ... */&amp;lt;/code&amp;gt; werden nur dann ausgeführt, wenn das entsprechende Maskenfeld gefüllt wurde. Da es sich bei &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;Seit Semester&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; um ein Pflichtfeld handelt, ist diese Einschränkung dort nicht nötig.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement3.png|width=600|caption=SelectStatement3}}&lt;br /&gt;
&lt;br /&gt;
Um diverse Berechnungen anzustellen werden, wird die Ergebnismenge in eine zweite temporäre Tabelle überführt: &amp;lt;code&amp;gt;select ... into temp tmp_ergebnis2&amp;lt;/code&amp;gt;. Die erste temporäre Ergebnistabelle wird gelöscht: &amp;lt;code&amp;gt;drop table tmp_ergebnis;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement4.png|width=600|caption=SelectStatement4}}&lt;br /&gt;
&lt;br /&gt;
Der letzte Select greift auf die zweite temporäre Tabelle zu und enthält die Ergebnistabelle.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Spaltenlayout.png|width=600|caption=Spaltenlayout}}&lt;br /&gt;
&lt;br /&gt;
Im Feld &#039;Spaltenlayout&#039; wird das Layout der Spalten der Ergebnistabelle festgelegt. Der markierte Bereich definiert das Layout der ersten Spalte. Spaltenüberschriften sind von 0 aufsteigend durchnummeriert, und die Überschriften selbst können durch &amp;quot;\n&amp;quot; mit Zeilenumbrüchen versehen werden. Pro Überschrift wird ein Absatz formuliert, u.a. auch die Breite der Spalte. Dabei ist zu beachten, dass die Darstellung in HTML vom verwandten Browser abhängt. &#039;Width&#039; beispielsweise hat auf die HTML-Darstellung keinen Einfluss.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=CleanupStatements.png|width=600|caption=CleanupStatements}}&lt;br /&gt;
&lt;br /&gt;
Wichtig ist außerdem, dass die zweite temporäre Tabelle gelöscht wird. Dies geschieht durch ein kurzes SQL-Statement in &#039;Cleanup Statements&#039;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Masken erstellen aus Kopien==&lt;br /&gt;
&lt;br /&gt;
Zur Maskenerstellung werden Kopien bereits existierender Masken erstellt. Es ist ratsam Masken zu kopieren, welche der neu zu erstellenden Masken thematisch ähneln. Das bringt den Vorteil, dass diverse Felder der Kopie weiterverwendet werden können. Unter {{Pfad3|Administration|Masken verwalten|Maske kopieren}} findet sich die entsprechende Maske.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es wird zunächst die zu kopierende Maske gewählt und anschließend eine tid und ein Name, sowie eine Erläuterung für die neue Maske vergeben. Nach Patch 2022-01-28 kann wahlweise die neue Maske direkt als Makro erstellt werden.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Maske_kopieren_1.png|width=600|caption=Auswahlmaske Maske kopieren}}&lt;br /&gt;
&lt;br /&gt;
Bei diesem Beispiel würde die Maske &amp;quot;Studierende nach Alter&amp;quot; kopiert und eine neue Masken &amp;quot;Studierende nach Geschlecht&amp;quot; mit der tid 15980 erstellt.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Bei der Vergabe der neuen tid unbedingt darauf achten, dass diese nicht bereits belegt ist.}}&lt;br /&gt;
&lt;br /&gt;
Bei der Vergabe der neuen tid wird mindestens in Dreißigerintervallen vorgegangen, damit für die Felder der Masken ausreichend tids verfügbar sind. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Um die belegten Masken-tid zu ermitteln eignet sich {{Pfad3|Administration|Masken verwalten|Maske suchen}}, da dort beim Feld Maske die Masken nach tids aufsteigend sortiert sind.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Masken_tids.png|width=600|caption=Auswahlmaske Maske suchen}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Feld-tids werden beginnend ab der Masken-tid direkt aufeinanderfolgend vergeben. Ein Dreißigerintervall zwischen den Masken-tids ermöglicht es somit dreißig Felder pro Maske zu vergeben. Trotzdem sollte immer geprüft werden, ob die vorherige Maske gegebenenfalls mehr als dreißig Felder besitzt und entsprechend ein größeres Intervall zu wählen ist. Hierfür eignet sich {{Pfad4|Administration|Masken verwalten|Felder|Feld suchen}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Feld_suchen_1.png|width=600|caption=Auswahlmaske Felder suchen}}&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Feld_suchen_2.png|width=400|caption=Ergebnistabelle Felder suchen}}&lt;br /&gt;
&lt;br /&gt;
Die Maske &amp;quot;16340-Studierende nach Alter&amp;quot; besitzt 17 Felder. Ein Dreißigerintervall wäre somit ausreichend.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Masken oder Felder löschen==&lt;br /&gt;
&lt;br /&gt;
Masken und Felder werden über {{Pfad4|Administration|Masken verwalten|Felder|Feld löschen}} und {{Pfad3|Administration|Masken verwalten|Maske löschen}} gelöscht. Dies hat den Vorteil, dass anhand der entsprechenden tid die Einträge für diese Maske oder dieses Feld aus sämtlichen Tabellen gelöscht wird. Falls die Einträge für ein Feld oder eine Maske nur in den Tabellen maskeninfo und felderinfo gelöscht würden, wären beispielsweise in der Feldverwaltung leere Felder zu finden. Um den Datenbestand sauber zu halten wird daher empfohlen, die angesprochenen Formulare &amp;quot;Feld löschen&amp;quot; und &amp;quot;Maske löschen&amp;quot; zu nutzen.&lt;br /&gt;
&lt;br /&gt;
==Konventionen==&lt;br /&gt;
&lt;br /&gt;
Für die Erstellung von SQL-Abfragen gibt es ein paar wichtige Konventionen: &lt;br /&gt;
* wenn Sie Abfragen schreiben, sollten Sie temporäre Tabellen immer mit &amp;quot;tmp_&amp;quot; vorab benennen. Grund: es könnte mal sein, dass wir die Tabelle auch als statische Tabelle nutzen. Dann gibt es einen SQL-Fehler.&lt;br /&gt;
* vermeiden Sie bei temporären Tabellen Umlaute in Spaltennamen   (z.B. &amp;quot;Fakultät&amp;quot;). Das klappt zwar unter Informix, aber nicht unter Postgres.&lt;br /&gt;
* Nutzen Sie, wenn möglich, die ANSI-SQL-Standards.&lt;br /&gt;
&lt;br /&gt;
=Abfragenentwurf mit SuperX-Sichten=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
In SuperX können bei Auswahldialogen verschiedene Sichten angeboten werden (vgl. [[SuperX-Benutzungshandbuch_Basics#Alternative_Hierarchien_zur_Datenselektion|Alternative Hierarchien zur Datenselektion]]). &amp;lt;br/&amp;gt; Alternative Hierarchien bzw. Auswertungshierarchien aus COB werden automatisiert übernommen. Jede Hierarchie bekommt einen Eintrag in der Sichtentabelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;SichtenAuswahl&amp;quot;&amp;gt;{{ImagePara |imgsrc=SichtenAuswahl.png|width=600|caption=SichtenAuswahl}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Die Inhalte und Rechte der Sichten werden gecached. Nach einer Änderung der Inhalte einer Sicht im laufenden Betrieb musst man im SuperXManager den Cache leeren und sich neu anmelden.}}&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Sichten werden in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten &#039;sichten&#039;] definiert. Eine Übersicht über die Tabellenstruktur inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten hier].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Die Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten sichten] lässt sich wie auch die Masken und Felder (s. Abschnitt [[Masken-Tutorial#Maskendefinition|Maskendefinition]] und [[Masken-Tutorial#Speichern_der_Felddefinition|Speichern der Felddefinition]])  in SuperX über ein Bearbeitungsformular manipulieren.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=SichtSuchen.png|width=600|caption=SichtSuchen}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Sicht &amp;quot;FB/Fak, Lehreinheit, Fach/Abschluss&amp;quot; näher betrachtet.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=SichtFachAbschluss.png|width=600|caption=SichtFachAbschluss}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Bei &amp;lt;code&amp;gt;sos_org_lehre_fach_absch_ude&amp;lt;/code&amp;gt; handelt es sich um eine &amp;quot;View&amp;quot;. Diese &amp;quot;View&amp;quot; beinhaltet mehrere Select-Statements, welche quasi die verschiedenen Ebenen der Sicht &amp;quot;FB/Fak, Lehreinheit, Fach/Abschluss&amp;quot; darstellen.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=ViewFachAbschUDE.png|width=600|caption=ViewFachAbschUDE}}&lt;br /&gt;
&lt;br /&gt;
Das Organigramm stellt eine integrierende Sicht für verschiedene Datenquellen zusammen und ist somit die Voraussetzung für eine integrierte Betrachtung. Alle Einrichtungen, Institutionen und Projekte sind im Organigramm hierarchisch angeordnet (vgl. [https://super-ics.de/superx/doku/kern_modul/admin/f_DasOrganigramm.htm Das Organigramm]). Das Feld &#039;lehre&#039; wird entweder mit 1 oder 0 gefüllt, um festzustellen ob die Institution relevant für Auswertungen im Bereich Lehre ist (1=ja, 0=nein).&lt;br /&gt;
&lt;br /&gt;
Erläuterung des parent-Felds:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Das Parent-Feld gibt die key_apnr der übergeordneten organisatorischen Einheit an. Das root-Element des Baums besitzt als parent einen null-Wert. Das Organigramm darf demenstprechend nur ein Element haben, dass keinen parent besitzt. Hier sollte grundsätzlich die Hochschulnummer eingetragen werden die auch in anderen HIS-Programmen verwendet wird. In Duisburg ist dies z.B. der Basiseintrag key_apnr = &amp;quot;70&amp;quot; ( GMU Duisburg ). Es ist praktisch der oberste &amp;quot;Knoten&amp;quot; im Baum. Dann werden alle Einträge in der Tabelle organigramm gesucht, die parent=&amp;quot;70&amp;quot; haben – also direkte Kinder des Basiseintrags.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Hier findet sich u.a. Einrichtungen Forschung und Lehre (key_apnr=&amp;quot;7&amp;quot;, parent=&amp;quot;70&amp;quot;). Dieser Eintrag hat wiederum u.a. folgende Kinder:&lt;br /&gt;
*Fakultät 1 (key_apnr=&amp;quot;1100&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
*Fakultät 2 (key_apnr=&amp;quot;1200&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
*Faktultät 3 (key_apnr=&amp;quot;1300&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
usw.&lt;br /&gt;
&lt;br /&gt;
Die weiteren Äste des Baums werden rekursiv abgefragt. &amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Struktur der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_organigramm &#039;organigramm&#039;] inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_organigramm hier]. &amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Tabelle [https://super-ics.de/superx/doku/sos_modul/sos.html#tab_dim_studiengang &#039;dim_studiengang&#039;] enthält Datensätze zu Studiengängen (Die Struktur der Tabelle inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/sos_modul/sos.html#tab_dim_studiengang hier]).&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Für alle Sichten wird erwartet, dass mindestens die drei Felder name, key und parent geliefert werden (der konkrete Name der Spalten ist irrelevant).&lt;br /&gt;
Anschließend können optional noch Strukturinformationen folgen (entweder Integer oder String).&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Beispiel:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;code&amp;gt;sp_fin_inst_hier(&amp;lt;&amp;lt;UserID&amp;gt;&amp;gt;,&amp;lt;&amp;lt;Stand&amp;gt;&amp;gt;,&amp;lt;&amp;lt;Sicht&amp;gt;&amp;gt;);select name,key,parent,strukturint from tmp_hier order by name; drop table tmp_hier;&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;strukturint (gefüllt aus fin_inst.orgstruktur) gibt mit Zahlen an, ob ein Eintrag eine Lehreinheit oder ein Fachbereich ist.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Auf diese Information kann später in Abfragen mit FreeMarker zugegriffen werden.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Beispiel:&lt;br /&gt;
{{ImagePara |imgsrc=FreemarkerStrukturInt.png|width=500|caption=FreemarkerStrukturInt}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einträge verstecken oder nicht-selektierbar machen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es kann gewünscht sein, dass Einträge versteckt hinterlegt werden. Betrachtet sei weiterhin die Sicht [[#SichtenAuswahl|&#039;FB/Fak, Lehreinheit, Fach/Abschluss&#039;]]. Die unterste sichtbare Ebene ist Fach/Abschluss. Man könnte also annehmen, es würde genügen, diese Sicht bis zur Ebene Fach/Abschluss aufzubauen. Dem ist allerdings nicht so. Es benötigt eine weitere, darunterliegende, aber nicht sichtbare Ebene &amp;quot;Studiengang&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;ViewFachAbschUDESichtbarUnsichtbar&amp;quot;&amp;gt;{{ImagePara |imgsrc=ViewFachAbschUDESichtbarUnsichtbar.png|width=600|caption=ViewFachAbschUDESichtbarUnsichtbar}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Zum Verständnis ein Beispiel anhand der Auswertung &amp;quot;Studierende nach Alter&amp;quot;. Zunächst wird eine Kombination &amp;quot;Fach/Abschluss&amp;quot; ausgewählt.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=AuswahlSichtBWLBA.png|width=400|caption=AuswahlSichtBWLBA}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es erscheint folgende Ergebnistabelle:&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=ErgebnistabelleStudierendeNachAlter.png|width=600|caption=ErgebnistabelleStudierendeNachAlter}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Im SQL erfolgt die Einschränkung auf den im Sichtenbaum ausgewählten Eintrag durch &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in &amp;lt;@printkeys Studiengang.allNeededKeysList/&amp;gt; ... &amp;lt;/code&amp;gt;. &amp;lt;/br&amp;gt;Für unser Beispiel sieht diese Passage nach der Freemarker-Transformation folgendermaßen aus: &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in   (&#039;_LE-WI_021_BS&#039;,&#039;s_3&#039;,&#039;s_36&#039;,&#039;s_33&#039;,&#039;s_65&#039;,&#039;s_270&#039;,&#039;s_87&#039;) ...&amp;lt;/code&amp;gt;.&amp;lt;/br&amp;gt; Würde die unterste, unsichtbare Ebene &#039;Studiengang&#039; entfallen (s. View [[#ViewFachAbschUDESichtbarUnsichtbar|&#039;sos_org_lehre_fach_absch_ude&#039;]]), sähe der SQL stattdessen so aus:&amp;lt;/br&amp;gt; &amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in   (&#039;_LE-WI_021_BS&#039;) ...&amp;lt;/code&amp;gt;. &amp;lt;/br&amp;gt;Das hätte zur Folge, dass keine Einträge gefunden würden, denn es wird nach dem Muster &#039;s_tid&#039; gesucht.&lt;br /&gt;
&lt;br /&gt;
Um eine Ebene unsichtbar zu machen benötigt es das Attribut &#039;nodeattrib&#039;. Wird diesem der Wert 1 übergeben, so ist die Ebene unsichtbar. Mit dem Wert 0 bleibt die Ebene sichtbar (s. View [[#ViewFachAbschUDESichtbarUnsichtbar|&#039;sos_org_lehre_fach_absch_ude&#039;]], Zeile 21 und 30).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Weiterhin kann es gewünscht sein, dass man in einer Sicht nur spezielle Einträge auswählen kann. &amp;lt;/br&amp;gt; So können man eine Lehreinheitsauswahl vielleicht so darstellen:&lt;br /&gt;
&lt;br /&gt;
Uni XY&lt;br /&gt;
* Fak 1&lt;br /&gt;
** Lehreinheit A&lt;br /&gt;
** Lehreinheit B&lt;br /&gt;
* Fak 2&lt;br /&gt;
** Lehreinheit C&lt;br /&gt;
** Lehreinheit D&lt;br /&gt;
&lt;br /&gt;
Die Kategorisierung Fak 1/2 dient der Klarheit der Darstellung, für eine Abfrage soll aber vielleicht nur eine konkrete Lehreinheit auswählbar sein. In dem Fall kann wie oben das nodeattrib 2 vergeben werden. Dadurch wird ein Eintrag als nicht-selektierbar markiert.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User-/Gruppenrechte==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Außer Administratoren dürfen normale User zunächst einmal keine der nicht-internen Sichten benutzen.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;In den Tabellen user_sichten und user_sichtarten kann hinterlegt werden, dass ein User eine einzelne Sicht (z.B. name_intern Kostenstellen-Hauptsicht) oder eine ganze Sichtart (z.B. Kostenarten) benutzen darf.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Für Gruppen gibt es analog die Tabellen group_sichten und group_sichtarten.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Außerdem sachgeb_sichten und sachgeb_sichtarten, wenn Leute die ganze Sachgebiete sehen dürfen auch Sicht sehen sollen.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Pflege dieser Tabellen kann bequem über Administrationsformular im XML-Frontend vorgenommen werden.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;blockquote&amp;gt; Achtung:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Nach Änderungen muss der Server-Cache aktualisiert werden und der User muss sich neu anmelden.&amp;lt;/br&amp;gt; Alternativ könnte auch Tomcat neu gestartet werden. &amp;lt;/blockquote&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Im Dateisystem unter $SUPERX_DIR/db/bin gibt es zwei Skripte userrechte_sichern.x und userrechte_einspielen.x.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Die entladen alle usertabellen (userinfo,groupinfo,user_sachgeb_bez etc) und spielen sie wieder ein.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Diese können z.B. dafür benutzt werden um alle Einstellungen von Test auf Echtrechner zu übernehmen.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Benutzen der Sichten in Masken==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
In [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;] (s. [[Masken-Tutorial#Speichern_der_Felddefinition|Speichern der Felddefinition]]) muss als Art 12-Sicht eingetragen werden.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Im Feld Relation muss ein Select stehen, der die &#039;tids&#039; der gewünschten Sichten zurückliefert.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=FeldBearbeitenArtSicht.png|width=600|caption=FeldBearbeitenArtSicht}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die aktiv-Einschränkung ist praktisch für Entwicklungs- und Wartungszwecke, weil man dann leicht einzelne Sichten de/aktivieren kann - Sortierung nach type, damit erst Hauptsichten und dann alternative Hierarchien angezeigt werden, dann nach Name.&amp;lt;/blockquote&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Der select sollte alle Sichtentids liefern, die ein Adminstrator sehen darf.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Wenn ein User für einzelne Sichten keine Berechtigung hat, filtert der Server diese automatisch raus.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danielq</name></author>
	</entry>
	<entry>
		<id>https://superxhosting.de/wiki/index.php?title=Datei:uoh_rechte_fgb.png&amp;diff=15950</id>
		<title>Datei:uoh rechte fgb.png</title>
		<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php?title=Datei:uoh_rechte_fgb.png&amp;diff=15950"/>
		<updated>2026-06-25T13:28:16Z</updated>

		<summary type="html">&lt;p&gt;Danielq: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Danielq</name></author>
	</entry>
	<entry>
		<id>https://superxhosting.de/wiki/index.php?title=Masken-Tutorial&amp;diff=15949</id>
		<title>Masken-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php?title=Masken-Tutorial&amp;diff=15949"/>
		<updated>2026-06-25T07:01:56Z</updated>

		<summary type="html">&lt;p&gt;Danielq: /* Orientierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Orientierung=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Die Abfragemasken liefern die Daten aus den Basissystemen an das SuperX-Frontend aus. Einige Abfragen zur Administration sind im Kernmodul enthalten, die Abfragen zu den Basissystemen sind in den jeweiligen Modulen enthalten. Die Abfragen in der Administration erlauben es, neue Masken anzulegen, zu kopieren und zu löschen. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Um den Austausch von Abfragen innerhalb der Hochschulen zu erleichtern (&amp;quot;Abfragen-Pooling&amp;quot; über die SuperX-Website), sollten die Masken immer im Nummernkreis 1xxxx0000 bis 1xxxx9970 liegen, wobei xxxx der von DESTATIS verwandten Hochschulnummer entspricht (bei dreistelligen Nummern mit führender 0), also z.B. 1&#039;&#039;&#039;1810&#039;&#039;&#039;0000 für die erste Maske der Uni Mannheim. Es sind Dreißigerschritte zu wählen, da die dazwischen liegenden Nummern für die Maskenfelder (Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;]) reserviert sind. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Im Folgenden finden Sie allgemeine Hinweise für die Verwaltung der Masken. Die Masken lassen sich browserbasiert, über UNIX-Shellscripte, und über Access administrieren. Weitergehende Möglichkeiten bietet aber das XML-Frontend (Möglichkeit der Editierung von großen text -Feldern bei Postgres als Datenbanksystem). Nach der Anmeldung haben Administratoren das Recht, Masken zu löschen, zu kopieren und erzeugen. Die einzelnen Felder der Masken lassen sich direkt in der Datenbank oder z.B. mit MS Access verändern. Im Applet sind nur grundlegende Verwaltungsoperationen möglich. Sie sind als Ersatz für die UNIX- Scripte gedacht. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Maske kopieren: Wie im [https://super-ics.de/superx/doku/entwicklerhandbuch/EineMaskeneueinfgen.htm#sxinsertmask UNIX - Script] wir eine Maske in eine neue Maske kopiert, und alle zugehörigen Tabellen werden aktualisiert. Zusätzlich wird auch der Eintrag im Themenbaum gemacht. Bei der Nummer der Maske (tid) sollten Sie das Nummernschema von SuperX einhalten, um in Zukunft Abfragen-Pooling zu ermöglichen.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Maske löschen: Wie im [https://super-ics.de/superx/doku/entwicklerhandbuch/EineMaskelschen.htm#sxDeleteMask UNIX-Script] werden Masken aus allen dazugehörigen Tabellen entfernt. Zusätzlich wird auch der Eintrag im Themenbaum gelöscht. Zur Sicherheit muss die Nummer der Maske manuell eingegeben werden.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Maske suchen: Sie können Masken suchen und im XML-Frontend komfortabel editieren. Schränken Sie Ihre Auswahl auf ein Sachgebiet ein, und drücken Sie &amp;quot;Abschicken&amp;quot;. Sie erhalten eine Liste mit &amp;quot;Treffern&amp;quot;, und rechts befinden sich jeweils Buttons zum ansehen bzw. editieren einer Maske.&lt;br /&gt;
Die Maske läuft nur unter Postgres, weil Informix kein direktes Bearbeiten von Blob-Feldern mit sql unterstützt.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Analog können Felder kopiert, gelöscht oder gesucht werden.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abfragen sind selbsterklärend; das Erzeugen neuer Masken, Löschen vorhandener Masken und Kopieren vorhandener Masken ist nur für Userkennungen möglich, die in der Tabelle userinfo im Feld administration den Wert 1 haben. Natürlich sollten die Abfragen sehr vorsichtig benutzt werden, sie sind die einzigen Abfragen in SuperX, die tatsächlich Änderungen an der Datenbank vornehmen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
In den folgenden Abschnitten werden die Grundlagen der Maskenentwicklung erläutert. Beginnend beim Abruf einer Ergebnistabelle aus einer Maske, über die Definition der Felder dieser Maske, bis hin zur Definition der dahinterliegenden SQL-Anweisungen.&lt;br /&gt;
&lt;br /&gt;
==Abrufen einer Ergebnistabelle==&lt;br /&gt;
Der Ausgangspunkt ist ein Beispiel aus dem SOS-Modul. Auf der folgenden Abbildung ist der Themenbaum ersichtlich, welcher sich in verschiedene Bereiche gliedert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Themenbaum.PNG|width=600|caption=Themenbaum}}&lt;br /&gt;
&lt;br /&gt;
Wählt man aus der Navigation auf der linken Seite einen Bereich aus, werden Abfragen sichtbar. In diesem Fall ist der Bereich &amp;quot;Bewerbung, Zulassung&amp;quot; ausgewählt und es wird unter anderem die Abfrage &amp;quot;Bewerbungsprozess nach Fach/Studiengang&amp;quot; sichtbar. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Maske.PNG|width=600|caption=Maske}}&lt;br /&gt;
&lt;br /&gt;
Wählt man eine Abfrage aus, erscheint eine Maske, welche verschiedene Möglichkeiten zur Parametrisierung bietet.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Ergebnistabelle.PNG|width=600|caption=Ergebnistabelle}}&lt;br /&gt;
&lt;br /&gt;
Nach einem Klick auf &amp;quot;Abschicken&amp;quot; erscheint die entsprechende Ergebnistabelle.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Felddefinitionen==&lt;br /&gt;
Gehen wir kurz zurück zur Auswahlmaske. Jedes Feld der Maske, z.B. &amp;quot;Semester&amp;quot;, ist ein Datensatz in der Tabelle &#039;felderinfo&#039; . Dort finden Sie Angaben zum Namen, Inhalt und Layout des Feldes. Gehen wir zunächst zum Inhalt des Feldes: Die Liste der Semester. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskenfeldSemester.png|width=400|caption=MaskenfeldSemester}}&lt;br /&gt;
&lt;br /&gt;
Beim Klick auf das Feld Semester erhalten wir eine Reihe von Semestern zur Auswahl. Die Liste ist absteigend sortiert. Sie wird durch die SQL Anweisung [&amp;lt;&amp;lt;SQL&amp;gt;&amp;gt; select tid, eintrag from zul_semester order by tid DESC;] erzeugt. Die SQL-Anweisung liefert aus der Tabelle &#039;zul_semester&#039; die Felder &#039;tid&#039; (&amp;quot;Tupelidentifier&amp;quot;) und &#039;eintrag&#039; (der Volltext des Semesters). Der Schlüssel des Feldes &#039;tid&#039; ist unsichtbar, sorgt aber dafür, dass die Sortierung richtig erfolgt. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=DatenbanktabelleZulSemester.png|width=400|caption=DatenbanktabelleZulSemester}}&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie einen Screenshot der Tabelle &#039;zul_semester&#039; direkt in der Datenbank. Die Nummerierung ist fünfstellig und besteht aus Jahr (vier Stellen) und 1 für Sommer- und 2 für Wintersemester.  &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Speichern der Felddefinition==&lt;br /&gt;
Wo wird nun in SuperX die Felddefinition gespeichert? Viele Scripte in SuperX werden selbst in Datenbanktabellen abgelegt, die Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo felderinfo] enthält die relevanten Angaben für die Felder. &amp;lt;br/&amp;gt; Um dies zu sehen, öffnen wir ein Formular im XML-Frontend. Dort befinden sich Bearbeitungsformulare für Felder und Masken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchen.png|width=600|caption=FeldSuchen}}&lt;br /&gt;
&lt;br /&gt;
Im Themenbaum des XML-Frontends finden wir den Menüpunkt &#039;&#039;&#039;Administration &amp;amp;rarr; Felder &amp;amp;rarr; Feld suchen&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchenMaske.png|width=600|caption=FeldSuchenMaske}}&lt;br /&gt;
&lt;br /&gt;
In dem Formular wählen wir die Abfrage &amp;quot;Bewerbungsprozess nach Fach/Studiengang&amp;quot; aus. Zusätzlich sehen wir auch die Nummer der Maske (26020), was bei der Maskenbearbeitung ganz nützlich ist. Mit einem Klick auf &amp;quot;Abschicken&amp;quot; werden die Eingaben bestätigt und abgeschickt.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchenErgebnis.png|width=600|caption=FeldSuchenErgebnis}}&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste mit den vorhandenen Feldern geliefert. Wir sehen die Nummer des Feldes und den Namen. Rechts daneben befindet sich ein Knopf zum Bearbeiten des Feldes.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleiner Hinweis an dieser Stelle: Die Felder werden in der Tabelle masken_felder_bez der Maske Nr. 26020 zugeordnet. Wir zählen also bei Feldnummern in Einer-Schritten von der Maskennummer aus hoch. Aus diesem Grunde wählen wir bei Maskennummern größere Intervalle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=BearbeitungsformularFeld.png|width=600|caption=BearbeitungsformularFeld}}&lt;br /&gt;
&lt;br /&gt;
Wir wählen nun das Feld &amp;quot;Semester&amp;quot; und gelangen in ein Bearbeitungsformular der Tabelle &#039;felderinfo&#039; . Wir sehen Name, Nummer, Position auf der Maske, Breite und Typ des Feldes (ganzzahlig). Das Feld ist obligatorisch und von der Art Nr. 1 (Nummer + Text, mit Dialog). Im Feld &#039;relation&#039; steht nach dem Steuerungszeichen &amp;amp;lt;&amp;amp;lt;SQL&amp;amp;gt;&amp;amp;gt; der SQL-Befehl. Unten ist noch der Defaultwert für das Feld angegeben, ebenfalls ein SQL-Ausdruck. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SuperX liest also aus der Datenbank die Scripte für eine Maske bzw. für ein Feld aus einer Tabelle, und führt Sie dann in der Datenbank aus.&lt;br /&gt;
&lt;br /&gt;
==Änderung einer Felddefinition==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldBearbeiten.png|width=600|caption=FeldBearbeiten}}&lt;br /&gt;
&lt;br /&gt;
Um die Felddefinition zu ändern, kann nun beispielsweise beim SQL-Befehl DESC durch ASC ersetzt und gespeichert werden. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskenfeldSemesterASC.png|width=400|caption=MaskenfeldSemesterASC}}&lt;br /&gt;
&lt;br /&gt;
Um das neue Script aus der Datenbank zu laden, muss die Maske nun erneut über den Themebaum aufgerufen werden. Wenn wir dann in der Maske auf &amp;quot;Semester&amp;quot; klicken, erscheinen die Semester in aufsteigender Reihenfolge.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art und Weise können wir alle Maskenfelder bearbeiten. Die restlichen Attribute in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;] sind im [https://super-ics.de/superx/doku/kern_modul/admin/f_TabelleFelderinfo.htm Administrationshandbuch Kernmodul] erläutert.&lt;br /&gt;
&lt;br /&gt;
==Maskendefinition==&lt;br /&gt;
&lt;br /&gt;
So weit so gut, wir können nun also Felder ändern. Wie können wir nun die Ergebnistabellen bearbeiten?&amp;lt;br/&amp;gt;&lt;br /&gt;
SuperX arbeitet hier ebenfalls mit SQL-Scripten, die als Felder in einer Tabelle gespeichert sind. Die Tabelle lautet [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_maskeninfo &#039;maskeninfo&#039;]. Wir können uns diese Tabelle ebenfalls im XML-Frontend anschauen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenMaske.png|width=600|caption=MaskeSuchenMaske}}&lt;br /&gt;
&lt;br /&gt;
Im Themenbaum wählen wir &amp;quot;Administation &amp;amp;rarr; Masken verwalten &amp;amp;rarr; Maske suchen&amp;quot;. Es erscheint eine Auswahlmaske ohne Vorbelegung. Es lässt sich nun eine Maske anhand einer Auswahlliste oder Maskennummer suchen. Um das Feld für die Suche mit Maskennummer einzublenden, muss das Schlüsselsymbol geklickt werden. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenErgebnis.png|width=600|caption=MaskeSuchenErgebnis}}&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis sehen wir unsere Maske sowie mehrere Bearbeitungsbuttons. Wir wählen den ersten Button, &#039;&#039;&#039;Bearbeiten&#039;&#039;&#039;. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeninfoVerwalten.png|width=600|caption=MaskeninfoVerwalten}}&lt;br /&gt;
&lt;br /&gt;
Wir gelangen in das Bearbeitungsformular der Maske. Neben der Nummer der Maske sehen wir unter anderem den Namen und die Felder &#039;Select-Statement&#039; und &#039;Spaltenlayout&#039;. Das Feld &#039;Select-Statement&#039; enthält das SQL-Script und &#039;Spaltenlayout&#039; die Ergebnisdarstellung.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abfragen in Maskendefinitionen==&lt;br /&gt;
&lt;br /&gt;
Allgemein formuliert arbeiten wir so:&lt;br /&gt;
# Zunächst werden die Eingaben in den Auswahlfeldern ausgewertet und eine Ergebnismenge ermittelt, meist in Form einer temporären Tabelle.  &lt;br /&gt;
# Diese Tabelle wird mit den Hilfstabellen in der Datenbank gejoined, und es wir eine Ergebnistabelle berechnet. Ggf. werden noch Summen oder Prozente berechnet, meist benötigen wir dazu weitere temporäre Tabellen. &lt;br /&gt;
# Der letzte select im Feld &#039;Select-Statement&#039; enthält die Ergebnistabelle, die das Applet empfängt. Im Feld &#039;Spaltenlayout&#039; werden die Spaltenüberschriften- und Breiten gesetzt und das Ergebnis wird angezeigt. &lt;br /&gt;
# Direkt danach wird die letzte temporäre Tabelle gedroppt, und die Datenbankverbindung wird an das SuperX-Servlet zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenPruefungsstatistik.png|width=600|caption=MaskeSuchenPruefungsstatistik}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird als Beispiel der Bericht &amp;quot;Studierende, Prüfungen &amp;amp;rarr; Einzelprüfungen &amp;amp;rarr; Prüfungsstatistik&amp;quot; herangezogen. Das Script in &#039;Select-Statement&#039; ist relativ lang, wir wollen es daher nur Auszugsweise kommentieren.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement1.png|width=600|caption=SelectStatement1}}&lt;br /&gt;
&lt;br /&gt;
Zu Beginn des Select-Statements wird über &amp;lt;code&amp;gt;select ... into temp tmp_ergebnis&amp;lt;/code&amp;gt; die Ergebnismenge der temporären Tabelle &#039;tmp_ergebnis&#039; übergeben. Einige Felder unterliegen bestimmten Kriterien, wie bspw. das Feld &#039;bestanden&#039;: &amp;lt;code&amp;gt;(case when P.pstatus=&#039;BE&#039; then 1 else 0 end) as bestanden&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement2.png|width=600|caption=SelectStatement2}}&lt;br /&gt;
&lt;br /&gt;
In der folgenden where-Klausel werden verschiedene Bedingungen festgelegt. Hier finden sich Platzhalter wie &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;Seit Semester&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;. Diese Platzhalter entsprechen den Maskenfeldern und werden mit den Benutzereingaben gefüllt. Passagen innerhalb &amp;lt;code&amp;gt;/* ... */&amp;lt;/code&amp;gt; werden nur dann ausgeführt, wenn das entsprechende Maskenfeld gefüllt wurde. Da es sich bei &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;Seit Semester&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; um ein Pflichtfeld handelt, ist diese Einschränkung dort nicht nötig.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement3.png|width=600|caption=SelectStatement3}}&lt;br /&gt;
&lt;br /&gt;
Um diverse Berechnungen anzustellen werden, wird die Ergebnismenge in eine zweite temporäre Tabelle überführt: &amp;lt;code&amp;gt;select ... into temp tmp_ergebnis2&amp;lt;/code&amp;gt;. Die erste temporäre Ergebnistabelle wird gelöscht: &amp;lt;code&amp;gt;drop table tmp_ergebnis;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement4.png|width=600|caption=SelectStatement4}}&lt;br /&gt;
&lt;br /&gt;
Der letzte Select greift auf die zweite temporäre Tabelle zu und enthält die Ergebnistabelle.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Spaltenlayout.png|width=600|caption=Spaltenlayout}}&lt;br /&gt;
&lt;br /&gt;
Im Feld &#039;Spaltenlayout&#039; wird das Layout der Spalten der Ergebnistabelle festgelegt. Der markierte Bereich definiert das Layout der ersten Spalte. Spaltenüberschriften sind von 0 aufsteigend durchnummeriert, und die Überschriften selbst können durch &amp;quot;\n&amp;quot; mit Zeilenumbrüchen versehen werden. Pro Überschrift wird ein Absatz formuliert, u.a. auch die Breite der Spalte. Dabei ist zu beachten, dass die Darstellung in HTML vom verwandten Browser abhängt. &#039;Width&#039; beispielsweise hat auf die HTML-Darstellung keinen Einfluss.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=CleanupStatements.png|width=600|caption=CleanupStatements}}&lt;br /&gt;
&lt;br /&gt;
Wichtig ist außerdem, dass die zweite temporäre Tabelle gelöscht wird. Dies geschieht durch ein kurzes SQL-Statement in &#039;Cleanup Statements&#039;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Masken erstellen aus Kopien==&lt;br /&gt;
&lt;br /&gt;
Zur Maskenerstellung werden Kopien bereits existierender Masken erstellt. Es ist ratsam Masken zu kopieren, welche der neu zu erstellenden Masken thematisch ähneln. Das bringt den Vorteil, dass diverse Felder der Kopie weiterverwendet werden können. Unter {{Pfad3|Administration|Masken verwalten|Maske kopieren}} findet sich die entsprechende Maske.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es wird zunächst die zu kopierende Maske gewählt und anschließend eine tid und ein Name, sowie eine Erläuterung für die neue Maske vergeben. Nach Patch 2022-01-28 kann wahlweise die neue Maske direkt als Makro erstellt werden.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Maske_kopieren_1.png|width=600|caption=Auswahlmaske Maske kopieren}}&lt;br /&gt;
&lt;br /&gt;
Bei diesem Beispiel würde die Maske &amp;quot;Studierende nach Alter&amp;quot; kopiert und eine neue Masken &amp;quot;Studierende nach Geschlecht&amp;quot; mit der tid 15980 erstellt.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Bei der Vergabe der neuen tid unbedingt darauf achten, dass diese nicht bereits belegt ist.}}&lt;br /&gt;
&lt;br /&gt;
Bei der Vergabe der neuen tid wird mindestens in Dreißigerintervallen vorgegangen, damit für die Felder der Masken ausreichend tids verfügbar sind. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Um die belegten Masken-tid zu ermitteln eignet sich {{Pfad3|Administration|Masken verwalten|Maske suchen}}, da dort beim Feld Maske die Masken nach tids aufsteigend sortiert sind.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Masken_tids.png|width=600|caption=Auswahlmaske Maske suchen}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Feld-tids werden beginnend ab der Masken-tid direkt aufeinanderfolgend vergeben. Ein Dreißigerintervall zwischen den Masken-tids ermöglicht es somit dreißig Felder pro Maske zu vergeben. Trotzdem sollte immer geprüft werden, ob die vorherige Maske gegebenenfalls mehr als dreißig Felder besitzt und entsprechend ein größeres Intervall zu wählen ist. Hierfür eignet sich {{Pfad4|Administration|Masken verwalten|Felder|Feld suchen}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Feld_suchen_1.png|width=600|caption=Auswahlmaske Felder suchen}}&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Feld_suchen_2.png|width=400|caption=Ergebnistabelle Felder suchen}}&lt;br /&gt;
&lt;br /&gt;
Die Maske &amp;quot;16340-Studierende nach Alter&amp;quot; besitzt 17 Felder. Ein Dreißigerintervall wäre somit ausreichend.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Masken oder Felder löschen==&lt;br /&gt;
&lt;br /&gt;
Masken und Felder werden über {{Pfad4|Administration|Masken verwalten|Felder|Feld löschen}} und {{Pfad3|Administration|Masken verwalten|Maske löschen}} gelöscht. Dies hat den Vorteil, dass anhand der entsprechenden tid die Einträge für diese Maske oder dieses Feld aus sämtlichen Tabellen gelöscht wird. Falls die Einträge für ein Feld oder eine Maske nur in den Tabellen maskeninfo und felderinfo gelöscht würden, wären beispielsweise in der Feldverwaltung leere Felder zu finden. Um den Datenbestand sauber zu halten wird daher empfohlen, die angesprochenen Formulare &amp;quot;Feld löschen&amp;quot; und &amp;quot;Maske löschen&amp;quot; zu nutzen.&lt;br /&gt;
&lt;br /&gt;
==Konventionen==&lt;br /&gt;
&lt;br /&gt;
Für die Erstellung von SQL-Abfragen gibt es ein paar wichtige Konventionen: &lt;br /&gt;
* wenn Sie Abfragen schreiben, sollten Sie temporäre Tabellen immer mit &amp;quot;tmp_&amp;quot; vorab benennen. Grund: es könnte mal sein, dass wir die Tabelle auch als statische Tabelle nutzen. Dann gibt es einen SQL-Fehler.&lt;br /&gt;
* vermeiden Sie bei temporären Tabellen Umlaute in Spaltennamen   (z.B. &amp;quot;Fakultät&amp;quot;). Das klappt zwar unter Informix, aber nicht unter Postgres.&lt;br /&gt;
* Nutzen Sie, wenn möglich, die ANSI-SQL-Standards.&lt;br /&gt;
&lt;br /&gt;
=Abfragenentwurf mit SuperX-Sichten=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
In SuperX können bei Auswahldialogen verschiedene Sichten angeboten werden (vgl. [[SuperX-Benutzungshandbuch_Basics#Alternative_Hierarchien_zur_Datenselektion|Alternative Hierarchien zur Datenselektion]]). &amp;lt;br/&amp;gt; Alternative Hierarchien bzw. Auswertungshierarchien aus COB werden automatisiert übernommen. Jede Hierarchie bekommt einen Eintrag in der Sichtentabelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;SichtenAuswahl&amp;quot;&amp;gt;{{ImagePara |imgsrc=SichtenAuswahl.png|width=600|caption=SichtenAuswahl}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Die Inhalte und Rechte der Sichten werden gecached. Nach einer Änderung der Inhalte einer Sicht im laufenden Betrieb musst man im SuperXManager den Cache leeren und sich neu anmelden.}}&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Sichten werden in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten &#039;sichten&#039;] definiert. Eine Übersicht über die Tabellenstruktur inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten hier].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Die Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten sichten] lässt sich wie auch die Masken und Felder (s. Abschnitt [[Masken-Tutorial#Maskendefinition|Maskendefinition]] und [[Masken-Tutorial#Speichern_der_Felddefinition|Speichern der Felddefinition]])  in SuperX über ein Bearbeitungsformular manipulieren.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=SichtSuchen.png|width=600|caption=SichtSuchen}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Sicht &amp;quot;FB/Fak, Lehreinheit, Fach/Abschluss&amp;quot; näher betrachtet.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=SichtFachAbschluss.png|width=600|caption=SichtFachAbschluss}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Das Feld {{Feld|quelle}} in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten sichten] ist auf 255 Zeichen begrenzt. Falls mehr Zeichen benötigt werden, kann in den Feldern {{Feld|cacheapplet}} und {{Feld|cachexml}} der SQL fortgeführt werden. Die beiden genannten Felder waren historisch für andere Zwecke geplant, werden für diese aber nicht mehr benötigt.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Bei &amp;lt;code&amp;gt;sos_org_lehre_fach_absch_ude&amp;lt;/code&amp;gt; handelt es sich um eine &amp;quot;View&amp;quot;. Diese &amp;quot;View&amp;quot; beinhaltet mehrere Select-Statements, welche quasi die verschiedenen Ebenen der Sicht &amp;quot;FB/Fak, Lehreinheit, Fach/Abschluss&amp;quot; darstellen.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=ViewFachAbschUDE.png|width=600|caption=ViewFachAbschUDE}}&lt;br /&gt;
&lt;br /&gt;
Das Organigramm stellt eine integrierende Sicht für verschiedene Datenquellen zusammen und ist somit die Voraussetzung für eine integrierte Betrachtung. Alle Einrichtungen, Institutionen und Projekte sind im Organigramm hierarchisch angeordnet (vgl. [https://super-ics.de/superx/doku/kern_modul/admin/f_DasOrganigramm.htm Das Organigramm]). Das Feld &#039;lehre&#039; wird entweder mit 1 oder 0 gefüllt, um festzustellen ob die Institution relevant für Auswertungen im Bereich Lehre ist (1=ja, 0=nein).&lt;br /&gt;
&lt;br /&gt;
Erläuterung des parent-Felds:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Das Parent-Feld gibt die key_apnr der übergeordneten organisatorischen Einheit an. Das root-Element des Baums besitzt als parent einen null-Wert. Das Organigramm darf demenstprechend nur ein Element haben, dass keinen parent besitzt. Hier sollte grundsätzlich die Hochschulnummer eingetragen werden die auch in anderen HIS-Programmen verwendet wird. In Duisburg ist dies z.B. der Basiseintrag key_apnr = &amp;quot;70&amp;quot; ( GMU Duisburg ). Es ist praktisch der oberste &amp;quot;Knoten&amp;quot; im Baum. Dann werden alle Einträge in der Tabelle organigramm gesucht, die parent=&amp;quot;70&amp;quot; haben – also direkte Kinder des Basiseintrags.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Hier findet sich u.a. Einrichtungen Forschung und Lehre (key_apnr=&amp;quot;7&amp;quot;, parent=&amp;quot;70&amp;quot;). Dieser Eintrag hat wiederum u.a. folgende Kinder:&lt;br /&gt;
*Fakultät 1 (key_apnr=&amp;quot;1100&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
*Fakultät 2 (key_apnr=&amp;quot;1200&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
*Faktultät 3 (key_apnr=&amp;quot;1300&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
usw.&lt;br /&gt;
&lt;br /&gt;
Die weiteren Äste des Baums werden rekursiv abgefragt. &amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Struktur der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_organigramm &#039;organigramm&#039;] inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_organigramm hier]. &amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Tabelle [https://super-ics.de/superx/doku/sos_modul/sos.html#tab_dim_studiengang &#039;dim_studiengang&#039;] enthält Datensätze zu Studiengängen (Die Struktur der Tabelle inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/sos_modul/sos.html#tab_dim_studiengang hier]).&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Für alle Sichten wird erwartet, dass mindestens die drei Felder name, key und parent geliefert werden (der konkrete Name der Spalten ist irrelevant).&lt;br /&gt;
Anschließend können optional noch Strukturinformationen folgen (entweder Integer oder String).&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Beispiel:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;code&amp;gt;sp_fin_inst_hier(&amp;lt;&amp;lt;UserID&amp;gt;&amp;gt;,&amp;lt;&amp;lt;Stand&amp;gt;&amp;gt;,&amp;lt;&amp;lt;Sicht&amp;gt;&amp;gt;);select name,key,parent,strukturint from tmp_hier order by name; drop table tmp_hier;&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;strukturint (gefüllt aus fin_inst.orgstruktur) gibt mit Zahlen an, ob ein Eintrag eine Lehreinheit oder ein Fachbereich ist.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Auf diese Information kann später in Abfragen mit FreeMarker zugegriffen werden.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Beispiel:&lt;br /&gt;
{{ImagePara |imgsrc=FreemarkerStrukturInt.png|width=500|caption=FreemarkerStrukturInt}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einträge verstecken oder nicht-selektierbar machen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es kann gewünscht sein, dass Einträge versteckt hinterlegt werden. Betrachtet sei weiterhin die Sicht [[#SichtenAuswahl|&#039;FB/Fak, Lehreinheit, Fach/Abschluss&#039;]]. Die unterste sichtbare Ebene ist Fach/Abschluss. Man könnte also annehmen, es würde genügen, diese Sicht bis zur Ebene Fach/Abschluss aufzubauen. Dem ist allerdings nicht so. Es benötigt eine weitere, darunterliegende, aber nicht sichtbare Ebene &amp;quot;Studiengang&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;ViewFachAbschUDESichtbarUnsichtbar&amp;quot;&amp;gt;{{ImagePara |imgsrc=ViewFachAbschUDESichtbarUnsichtbar.png|width=600|caption=ViewFachAbschUDESichtbarUnsichtbar}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Zum Verständnis ein Beispiel anhand der Auswertung &amp;quot;Studierende nach Alter&amp;quot;. Zunächst wird eine Kombination &amp;quot;Fach/Abschluss&amp;quot; ausgewählt.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=AuswahlSichtBWLBA.png|width=400|caption=AuswahlSichtBWLBA}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es erscheint folgende Ergebnistabelle:&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=ErgebnistabelleStudierendeNachAlter.png|width=600|caption=ErgebnistabelleStudierendeNachAlter}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Im SQL erfolgt die Einschränkung auf den im Sichtenbaum ausgewählten Eintrag durch &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in &amp;lt;@printkeys Studiengang.allNeededKeysList/&amp;gt; ... &amp;lt;/code&amp;gt;. &amp;lt;/br&amp;gt;Für unser Beispiel sieht diese Passage nach der Freemarker-Transformation folgendermaßen aus: &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in   (&#039;_LE-WI_021_BS&#039;,&#039;s_3&#039;,&#039;s_36&#039;,&#039;s_33&#039;,&#039;s_65&#039;,&#039;s_270&#039;,&#039;s_87&#039;) ...&amp;lt;/code&amp;gt;.&amp;lt;/br&amp;gt; Würde die unterste, unsichtbare Ebene &#039;Studiengang&#039; entfallen (s. View [[#ViewFachAbschUDESichtbarUnsichtbar|&#039;sos_org_lehre_fach_absch_ude&#039;]]), sähe der SQL stattdessen so aus:&amp;lt;/br&amp;gt; &amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in   (&#039;_LE-WI_021_BS&#039;) ...&amp;lt;/code&amp;gt;. &amp;lt;/br&amp;gt;Das hätte zur Folge, dass keine Einträge gefunden würden, denn es wird nach dem Muster &#039;s_tid&#039; gesucht.&lt;br /&gt;
&lt;br /&gt;
Um eine Ebene unsichtbar zu machen benötigt es das Attribut &#039;nodeattrib&#039;. Wird diesem der Wert 1 übergeben, so ist die Ebene unsichtbar. Mit dem Wert 0 bleibt die Ebene sichtbar (s. View [[#ViewFachAbschUDESichtbarUnsichtbar|&#039;sos_org_lehre_fach_absch_ude&#039;]], Zeile 21 und 30).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Weiterhin kann es gewünscht sein, dass man in einer Sicht nur spezielle Einträge auswählen kann. &amp;lt;/br&amp;gt; So können man eine Lehreinheitsauswahl vielleicht so darstellen:&lt;br /&gt;
&lt;br /&gt;
Uni XY&lt;br /&gt;
* Fak 1&lt;br /&gt;
** Lehreinheit A&lt;br /&gt;
** Lehreinheit B&lt;br /&gt;
* Fak 2&lt;br /&gt;
** Lehreinheit C&lt;br /&gt;
** Lehreinheit D&lt;br /&gt;
&lt;br /&gt;
Die Kategorisierung Fak 1/2 dient der Klarheit der Darstellung, für eine Abfrage soll aber vielleicht nur eine konkrete Lehreinheit auswählbar sein. In dem Fall kann wie oben das nodeattrib 2 vergeben werden. Dadurch wird ein Eintrag als nicht-selektierbar markiert.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User-/Gruppenrechte==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Außer Administratoren dürfen normale User zunächst einmal keine der nicht-internen Sichten benutzen.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;In den Tabellen user_sichten und user_sichtarten kann hinterlegt werden, dass ein User eine einzelne Sicht (z.B. name_intern Kostenstellen-Hauptsicht) oder eine ganze Sichtart (z.B. Kostenarten) benutzen darf.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Für Gruppen gibt es analog die Tabellen group_sichten und group_sichtarten.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Außerdem sachgeb_sichten und sachgeb_sichtarten, wenn Leute die ganze Sachgebiete sehen dürfen auch Sicht sehen sollen.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Pflege dieser Tabellen kann bequem über Administrationsformular im XML-Frontend vorgenommen werden.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;blockquote&amp;gt; Achtung:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Nach Änderungen muss der Server-Cache aktualisiert werden und der User muss sich neu anmelden.&amp;lt;/br&amp;gt; Alternativ könnte auch Tomcat neu gestartet werden. &amp;lt;/blockquote&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Im Dateisystem unter $SUPERX_DIR/db/bin gibt es zwei Skripte userrechte_sichern.x und userrechte_einspielen.x.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Die entladen alle usertabellen (userinfo,groupinfo,user_sachgeb_bez etc) und spielen sie wieder ein.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Diese können z.B. dafür benutzt werden um alle Einstellungen von Test auf Echtrechner zu übernehmen.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Benutzen der Sichten in Masken==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
In [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;] (s. [[Masken-Tutorial#Speichern_der_Felddefinition|Speichern der Felddefinition]]) muss als Art 12-Sicht eingetragen werden.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Im Feld Relation muss ein Select stehen, der die &#039;tids&#039; der gewünschten Sichten zurückliefert.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=FeldBearbeitenArtSicht.png|width=600|caption=FeldBearbeitenArtSicht}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die aktiv-Einschränkung ist praktisch für Entwicklungs- und Wartungszwecke, weil man dann leicht einzelne Sichten de/aktivieren kann - Sortierung nach type, damit erst Hauptsichten und dann alternative Hierarchien angezeigt werden, dann nach Name.&amp;lt;/blockquote&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Der select sollte alle Sichtentids liefern, die ein Adminstrator sehen darf.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Wenn ein User für einzelne Sichten keine Berechtigung hat, filtert der Server diese automatisch raus.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danielq</name></author>
	</entry>
	<entry>
		<id>https://superxhosting.de/wiki/index.php?title=Masken-Tutorial&amp;diff=15948</id>
		<title>Masken-Tutorial</title>
		<link rel="alternate" type="text/html" href="https://superxhosting.de/wiki/index.php?title=Masken-Tutorial&amp;diff=15948"/>
		<updated>2026-06-25T06:56:39Z</updated>

		<summary type="html">&lt;p&gt;Danielq: /* Orientierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Orientierung=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Die Abfragemasken liefern die Daten aus den Basissystemen an das SuperX-Frontend aus. Einige Abfragen zur Administration sind im Kernmodul enthalten, die Abfragen zu den Basissystemen sind in den jeweiligen Modulen enthalten. Die Abfragen in der Administration erlauben es, neue Masken anzulegen, zu kopieren und zu löschen. &amp;lt;br&amp;gt; &amp;lt;/br&amp;gt;Um den Austausch von Abfragen innerhalb der Hochschulen zu erleichtern (&amp;quot;Abfragen-Pooling&amp;quot; über die SuperX-Website), sollten die Masken immer im Nummernkreis 1xxxx0000 bis 1xxxx9970 liegen, wobei xxxx der von DESTATIS verwandten Hochschulnummer entspricht (bei dreistelligen Nummern mit führender 0), also z.B. 1&#039;&#039;&#039;1810&#039;&#039;&#039;0000 für die erste Maske der Uni Mannheim. Es sind Dreißigerschritte zu wählen, da die dazwischen liegenden Nummern für die Maskenfelder (Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;]) reserviert sind. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Im Folgenden finden Sie allgemeine Hinweise für die Verwaltung der Masken. Die Masken lassen sich browserbasiert, über UNIX-Shellscripte, und über Access administrieren. Weitergehende Möglichkeiten bietet aber das XML-Frontend (Möglichkeit der Editierung von großen text -Feldern bei Postgres als Datenbanksystem). Nach der Anmeldung haben Administratoren das Recht, Masken zu löschen, zu kopieren und erzeugen. Die einzelnen Felder der Masken lassen sich direkt in der Datenbank oder z.B. mit MS Access verändern. Im Applet sind nur grundlegende Verwaltungsoperationen möglich. Sie sind als Ersatz für die UNIX- Scripte gedacht. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Maske kopieren: Wie im [https://super-ics.de/superx/doku/entwicklerhandbuch/EineMaskeneueinfgen.htm#sxinsertmask UNIX - Script] wir eine Maske in eine neue Maske kopiert, und alle zugehörigen Tabellen werden aktualisiert. Zusätzlich wird auch der Eintrag im Themenbaum gemacht. Bei der Nummer der Maske (tid) sollten Sie das Nummernschema von SuperX einhalten, um in Zukunft Abfragen-Pooling zu ermöglichen.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Maske löschen: Wie im [https://super-ics.de/superx/doku/entwicklerhandbuch/EineMaskelschen.htm#sxDeleteMask UNIX-Script] werden Masken aus allen dazugehörigen Tabellen entfernt. Zusätzlich wird auch der Eintrag im Themenbaum gelöscht. Zur Sicherheit muss die Nummer der Maske manuell eingegeben werden.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Maske suchen: Sie können Masken suchen und im XML-Frontend komfortabel editieren. Schränken Sie Ihre Auswahl auf ein Sachgebiet ein, und drücken Sie &amp;quot;Abschicken&amp;quot;. Sie erhalten eine Liste mit &amp;quot;Treffern&amp;quot;, und rechts befinden sich jeweils Buttons zum ansehen bzw. editieren einer Maske.&lt;br /&gt;
Die Maske läuft nur unter Postgres, weil Informix kein direktes Bearbeiten von Blob-Feldern mit sql unterstützt.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Analog können Felder kopiert, gelöscht oder gesucht werden.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Abfragen sind selbsterklärend; das Erzeugen neuer Masken, Löschen vorhandener Masken und Kopieren vorhandener Masken ist nur für Userkennungen möglich, die in der Tabelle userinfo im Feld administration den Wert 1 haben. Natürlich sollten die Abfragen sehr vorsichtig benutzt werden, sie sind die einzigen Abfragen in SuperX, die tatsächlich Änderungen an der Datenbank vornehmen können.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Grundlagen=&lt;br /&gt;
&lt;br /&gt;
In den folgenden Abschnitten werden die Grundlagen der Maskenentwicklung erläutert. Beginnend beim Abruf einer Ergebnistabelle aus einer Maske, über die Definition der Felder dieser Maske, bis hin zur Definition der dahinterliegenden SQL-Anweisungen.&lt;br /&gt;
&lt;br /&gt;
==Abrufen einer Ergebnistabelle==&lt;br /&gt;
Der Ausgangspunkt ist ein Beispiel aus dem SOS-Modul. Auf der folgenden Abbildung ist der Themenbaum ersichtlich, welcher sich in verschiedene Bereiche gliedert. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Themenbaum.PNG|width=600|caption=Themenbaum}}&lt;br /&gt;
&lt;br /&gt;
Wählt man aus der Navigation auf der linken Seite einen Bereich aus, werden Abfragen sichtbar. In diesem Fall ist der Bereich &amp;quot;Bewerbung, Zulassung&amp;quot; ausgewählt und es wird unter anderem die Abfrage &amp;quot;Bewerbungsprozess nach Fach/Studiengang&amp;quot; sichtbar. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Maske.PNG|width=600|caption=Maske}}&lt;br /&gt;
&lt;br /&gt;
Wählt man eine Abfrage aus, erscheint eine Maske, welche verschiedene Möglichkeiten zur Parametrisierung bietet.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Ergebnistabelle.PNG|width=600|caption=Ergebnistabelle}}&lt;br /&gt;
&lt;br /&gt;
Nach einem Klick auf &amp;quot;Abschicken&amp;quot; erscheint die entsprechende Ergebnistabelle.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Die Felddefinitionen==&lt;br /&gt;
Gehen wir kurz zurück zur Auswahlmaske. Jedes Feld der Maske, z.B. &amp;quot;Semester&amp;quot;, ist ein Datensatz in der Tabelle &#039;felderinfo&#039; . Dort finden Sie Angaben zum Namen, Inhalt und Layout des Feldes. Gehen wir zunächst zum Inhalt des Feldes: Die Liste der Semester. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskenfeldSemester.png|width=400|caption=MaskenfeldSemester}}&lt;br /&gt;
&lt;br /&gt;
Beim Klick auf das Feld Semester erhalten wir eine Reihe von Semestern zur Auswahl. Die Liste ist absteigend sortiert. Sie wird durch die SQL Anweisung [&amp;lt;&amp;lt;SQL&amp;gt;&amp;gt; select tid, eintrag from zul_semester order by tid DESC;] erzeugt. Die SQL-Anweisung liefert aus der Tabelle &#039;zul_semester&#039; die Felder &#039;tid&#039; (&amp;quot;Tupelidentifier&amp;quot;) und &#039;eintrag&#039; (der Volltext des Semesters). Der Schlüssel des Feldes &#039;tid&#039; ist unsichtbar, sorgt aber dafür, dass die Sortierung richtig erfolgt. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=DatenbanktabelleZulSemester.png|width=400|caption=DatenbanktabelleZulSemester}}&lt;br /&gt;
&lt;br /&gt;
Hier sehen Sie einen Screenshot der Tabelle &#039;zul_semester&#039; direkt in der Datenbank. Die Nummerierung ist fünfstellig und besteht aus Jahr (vier Stellen) und 1 für Sommer- und 2 für Wintersemester.  &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Speichern der Felddefinition==&lt;br /&gt;
Wo wird nun in SuperX die Felddefinition gespeichert? Viele Scripte in SuperX werden selbst in Datenbanktabellen abgelegt, die Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo felderinfo] enthält die relevanten Angaben für die Felder. &amp;lt;br/&amp;gt; Um dies zu sehen, öffnen wir ein Formular im XML-Frontend. Dort befinden sich Bearbeitungsformulare für Felder und Masken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchen.png|width=600|caption=FeldSuchen}}&lt;br /&gt;
&lt;br /&gt;
Im Themenbaum des XML-Frontends finden wir den Menüpunkt &#039;&#039;&#039;Administration &amp;amp;rarr; Felder &amp;amp;rarr; Feld suchen&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchenMaske.png|width=600|caption=FeldSuchenMaske}}&lt;br /&gt;
&lt;br /&gt;
In dem Formular wählen wir die Abfrage &amp;quot;Bewerbungsprozess nach Fach/Studiengang&amp;quot; aus. Zusätzlich sehen wir auch die Nummer der Maske (26020), was bei der Maskenbearbeitung ganz nützlich ist. Mit einem Klick auf &amp;quot;Abschicken&amp;quot; werden die Eingaben bestätigt und abgeschickt.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldSuchenErgebnis.png|width=600|caption=FeldSuchenErgebnis}}&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste mit den vorhandenen Feldern geliefert. Wir sehen die Nummer des Feldes und den Namen. Rechts daneben befindet sich ein Knopf zum Bearbeiten des Feldes.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein kleiner Hinweis an dieser Stelle: Die Felder werden in der Tabelle masken_felder_bez der Maske Nr. 26020 zugeordnet. Wir zählen also bei Feldnummern in Einer-Schritten von der Maskennummer aus hoch. Aus diesem Grunde wählen wir bei Maskennummern größere Intervalle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=BearbeitungsformularFeld.png|width=600|caption=BearbeitungsformularFeld}}&lt;br /&gt;
&lt;br /&gt;
Wir wählen nun das Feld &amp;quot;Semester&amp;quot; und gelangen in ein Bearbeitungsformular der Tabelle &#039;felderinfo&#039; . Wir sehen Name, Nummer, Position auf der Maske, Breite und Typ des Feldes (ganzzahlig). Das Feld ist obligatorisch und von der Art Nr. 1 (Nummer + Text, mit Dialog). Im Feld &#039;relation&#039; steht nach dem Steuerungszeichen &amp;amp;lt;&amp;amp;lt;SQL&amp;amp;gt;&amp;amp;gt; der SQL-Befehl. Unten ist noch der Defaultwert für das Feld angegeben, ebenfalls ein SQL-Ausdruck. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SuperX liest also aus der Datenbank die Scripte für eine Maske bzw. für ein Feld aus einer Tabelle, und führt Sie dann in der Datenbank aus.&lt;br /&gt;
&lt;br /&gt;
==Änderung einer Felddefinition==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=FeldBearbeiten.png|width=600|caption=FeldBearbeiten}}&lt;br /&gt;
&lt;br /&gt;
Um die Felddefinition zu ändern, kann nun beispielsweise beim SQL-Befehl DESC durch ASC ersetzt und gespeichert werden. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskenfeldSemesterASC.png|width=400|caption=MaskenfeldSemesterASC}}&lt;br /&gt;
&lt;br /&gt;
Um das neue Script aus der Datenbank zu laden, muss die Maske nun erneut über den Themebaum aufgerufen werden. Wenn wir dann in der Maske auf &amp;quot;Semester&amp;quot; klicken, erscheinen die Semester in aufsteigender Reihenfolge.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Auf diese Art und Weise können wir alle Maskenfelder bearbeiten. Die restlichen Attribute in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;] sind im [https://super-ics.de/superx/doku/kern_modul/admin/f_TabelleFelderinfo.htm Administrationshandbuch Kernmodul] erläutert.&lt;br /&gt;
&lt;br /&gt;
==Maskendefinition==&lt;br /&gt;
&lt;br /&gt;
So weit so gut, wir können nun also Felder ändern. Wie können wir nun die Ergebnistabellen bearbeiten?&amp;lt;br/&amp;gt;&lt;br /&gt;
SuperX arbeitet hier ebenfalls mit SQL-Scripten, die als Felder in einer Tabelle gespeichert sind. Die Tabelle lautet [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_maskeninfo &#039;maskeninfo&#039;]. Wir können uns diese Tabelle ebenfalls im XML-Frontend anschauen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenMaske.png|width=600|caption=MaskeSuchenMaske}}&lt;br /&gt;
&lt;br /&gt;
Im Themenbaum wählen wir &amp;quot;Administation &amp;amp;rarr; Masken verwalten &amp;amp;rarr; Maske suchen&amp;quot;. Es erscheint eine Auswahlmaske ohne Vorbelegung. Es lässt sich nun eine Maske anhand einer Auswahlliste oder Maskennummer suchen. Um das Feld für die Suche mit Maskennummer einzublenden, muss das Schlüsselsymbol geklickt werden. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenErgebnis.png|width=600|caption=MaskeSuchenErgebnis}}&lt;br /&gt;
&lt;br /&gt;
Als Ergebnis sehen wir unsere Maske sowie mehrere Bearbeitungsbuttons. Wir wählen den ersten Button, &#039;&#039;&#039;Bearbeiten&#039;&#039;&#039;. &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeninfoVerwalten.png|width=600|caption=MaskeninfoVerwalten}}&lt;br /&gt;
&lt;br /&gt;
Wir gelangen in das Bearbeitungsformular der Maske. Neben der Nummer der Maske sehen wir unter anderem den Namen und die Felder &#039;Select-Statement&#039; und &#039;Spaltenlayout&#039;. Das Feld &#039;Select-Statement&#039; enthält das SQL-Script und &#039;Spaltenlayout&#039; die Ergebnisdarstellung.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abfragen in Maskendefinitionen==&lt;br /&gt;
&lt;br /&gt;
Allgemein formuliert arbeiten wir so:&lt;br /&gt;
# Zunächst werden die Eingaben in den Auswahlfeldern ausgewertet und eine Ergebnismenge ermittelt, meist in Form einer temporären Tabelle.  &lt;br /&gt;
# Diese Tabelle wird mit den Hilfstabellen in der Datenbank gejoined, und es wir eine Ergebnistabelle berechnet. Ggf. werden noch Summen oder Prozente berechnet, meist benötigen wir dazu weitere temporäre Tabellen. &lt;br /&gt;
# Der letzte select im Feld &#039;Select-Statement&#039; enthält die Ergebnistabelle, die das Applet empfängt. Im Feld &#039;Spaltenlayout&#039; werden die Spaltenüberschriften- und Breiten gesetzt und das Ergebnis wird angezeigt. &lt;br /&gt;
# Direkt danach wird die letzte temporäre Tabelle gedroppt, und die Datenbankverbindung wird an das SuperX-Servlet zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=MaskeSuchenPruefungsstatistik.png|width=600|caption=MaskeSuchenPruefungsstatistik}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird als Beispiel der Bericht &amp;quot;Studierende, Prüfungen &amp;amp;rarr; Einzelprüfungen &amp;amp;rarr; Prüfungsstatistik&amp;quot; herangezogen. Das Script in &#039;Select-Statement&#039; ist relativ lang, wir wollen es daher nur Auszugsweise kommentieren.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement1.png|width=600|caption=SelectStatement1}}&lt;br /&gt;
&lt;br /&gt;
Zu Beginn des Select-Statements wird über &amp;lt;code&amp;gt;select ... into temp tmp_ergebnis&amp;lt;/code&amp;gt; die Ergebnismenge der temporären Tabelle &#039;tmp_ergebnis&#039; übergeben. Einige Felder unterliegen bestimmten Kriterien, wie bspw. das Feld &#039;bestanden&#039;: &amp;lt;code&amp;gt;(case when P.pstatus=&#039;BE&#039; then 1 else 0 end) as bestanden&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement2.png|width=600|caption=SelectStatement2}}&lt;br /&gt;
&lt;br /&gt;
In der folgenden where-Klausel werden verschiedene Bedingungen festgelegt. Hier finden sich Platzhalter wie &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;Seit Semester&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;. Diese Platzhalter entsprechen den Maskenfeldern und werden mit den Benutzereingaben gefüllt. Passagen innerhalb &amp;lt;code&amp;gt;/* ... */&amp;lt;/code&amp;gt; werden nur dann ausgeführt, wenn das entsprechende Maskenfeld gefüllt wurde. Da es sich bei &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;Seit Semester&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; um ein Pflichtfeld handelt, ist diese Einschränkung dort nicht nötig.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement3.png|width=600|caption=SelectStatement3}}&lt;br /&gt;
&lt;br /&gt;
Um diverse Berechnungen anzustellen werden, wird die Ergebnismenge in eine zweite temporäre Tabelle überführt: &amp;lt;code&amp;gt;select ... into temp tmp_ergebnis2&amp;lt;/code&amp;gt;. Die erste temporäre Ergebnistabelle wird gelöscht: &amp;lt;code&amp;gt;drop table tmp_ergebnis;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=SelectStatement4.png|width=600|caption=SelectStatement4}}&lt;br /&gt;
&lt;br /&gt;
Der letzte Select greift auf die zweite temporäre Tabelle zu und enthält die Ergebnistabelle.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Spaltenlayout.png|width=600|caption=Spaltenlayout}}&lt;br /&gt;
&lt;br /&gt;
Im Feld &#039;Spaltenlayout&#039; wird das Layout der Spalten der Ergebnistabelle festgelegt. Der markierte Bereich definiert das Layout der ersten Spalte. Spaltenüberschriften sind von 0 aufsteigend durchnummeriert, und die Überschriften selbst können durch &amp;quot;\n&amp;quot; mit Zeilenumbrüchen versehen werden. Pro Überschrift wird ein Absatz formuliert, u.a. auch die Breite der Spalte. Dabei ist zu beachten, dass die Darstellung in HTML vom verwandten Browser abhängt. &#039;Width&#039; beispielsweise hat auf die HTML-Darstellung keinen Einfluss.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=CleanupStatements.png|width=600|caption=CleanupStatements}}&lt;br /&gt;
&lt;br /&gt;
Wichtig ist außerdem, dass die zweite temporäre Tabelle gelöscht wird. Dies geschieht durch ein kurzes SQL-Statement in &#039;Cleanup Statements&#039;.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Masken erstellen aus Kopien==&lt;br /&gt;
&lt;br /&gt;
Zur Maskenerstellung werden Kopien bereits existierender Masken erstellt. Es ist ratsam Masken zu kopieren, welche der neu zu erstellenden Masken thematisch ähneln. Das bringt den Vorteil, dass diverse Felder der Kopie weiterverwendet werden können. Unter {{Pfad3|Administration|Masken verwalten|Maske kopieren}} findet sich die entsprechende Maske.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es wird zunächst die zu kopierende Maske gewählt und anschließend eine tid und ein Name, sowie eine Erläuterung für die neue Maske vergeben. Nach Patch 2022-01-28 kann wahlweise die neue Maske direkt als Makro erstellt werden.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Maske_kopieren_1.png|width=600|caption=Auswahlmaske Maske kopieren}}&lt;br /&gt;
&lt;br /&gt;
Bei diesem Beispiel würde die Maske &amp;quot;Studierende nach Alter&amp;quot; kopiert und eine neue Masken &amp;quot;Studierende nach Geschlecht&amp;quot; mit der tid 15980 erstellt.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Bei der Vergabe der neuen tid unbedingt darauf achten, dass diese nicht bereits belegt ist.}}&lt;br /&gt;
&lt;br /&gt;
Bei der Vergabe der neuen tid wird mindestens in Dreißigerintervallen vorgegangen, damit für die Felder der Masken ausreichend tids verfügbar sind. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Um die belegten Masken-tid zu ermitteln eignet sich {{Pfad3|Administration|Masken verwalten|Maske suchen}}, da dort beim Feld Maske die Masken nach tids aufsteigend sortiert sind.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Masken_tids.png|width=600|caption=Auswahlmaske Maske suchen}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Feld-tids werden beginnend ab der Masken-tid direkt aufeinanderfolgend vergeben. Ein Dreißigerintervall zwischen den Masken-tids ermöglicht es somit dreißig Felder pro Maske zu vergeben. Trotzdem sollte immer geprüft werden, ob die vorherige Maske gegebenenfalls mehr als dreißig Felder besitzt und entsprechend ein größeres Intervall zu wählen ist. Hierfür eignet sich {{Pfad4|Administration|Masken verwalten|Felder|Feld suchen}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
{{ImagePara |imgsrc=Feld_suchen_1.png|width=600|caption=Auswahlmaske Felder suchen}}&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=Feld_suchen_2.png|width=400|caption=Ergebnistabelle Felder suchen}}&lt;br /&gt;
&lt;br /&gt;
Die Maske &amp;quot;16340-Studierende nach Alter&amp;quot; besitzt 17 Felder. Ein Dreißigerintervall wäre somit ausreichend.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Masken oder Felder löschen==&lt;br /&gt;
&lt;br /&gt;
Masken und Felder werden über {{Pfad4|Administration|Masken verwalten|Felder|Feld löschen}} und {{Pfad3|Administration|Masken verwalten|Maske löschen}} gelöscht. Dies hat den Vorteil, dass anhand der entsprechenden tid die Einträge für diese Maske oder dieses Feld aus sämtlichen Tabellen gelöscht wird. Falls die Einträge für ein Feld oder eine Maske nur in den Tabellen maskeninfo und felderinfo gelöscht würden, wären beispielsweise in der Feldverwaltung leere Felder zu finden. Um den Datenbestand sauber zu halten wird daher empfohlen, die angesprochenen Formulare &amp;quot;Feld löschen&amp;quot; und &amp;quot;Maske löschen&amp;quot; zu nutzen.&lt;br /&gt;
&lt;br /&gt;
==Konventionen==&lt;br /&gt;
&lt;br /&gt;
Für die Erstellung von SQL-Abfragen gibt es ein paar wichtige Konventionen: &lt;br /&gt;
* wenn Sie Abfragen schreiben, sollten Sie temporäre Tabellen immer mit &amp;quot;tmp_&amp;quot; vorab benennen. Grund: es könnte mal sein, dass wir die Tabelle auch als statische Tabelle nutzen. Dann gibt es einen SQL-Fehler.&lt;br /&gt;
* vermeiden Sie bei temporären Tabellen Umlaute in Spaltennamen   (z.B. &amp;quot;Fakultät&amp;quot;). Das klappt zwar unter Informix, aber nicht unter Postgres.&lt;br /&gt;
* Nutzen Sie, wenn möglich, die ANSI-SQL-Standards.&lt;br /&gt;
&lt;br /&gt;
=Abfragenentwurf mit SuperX-Sichten=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
In SuperX können bei Auswahldialogen verschiedene Sichten angeboten werden (vgl. [[SuperX-Benutzungshandbuch_Basics#Alternative_Hierarchien_zur_Datenselektion|Alternative Hierarchien zur Datenselektion]]). &amp;lt;br/&amp;gt; Alternative Hierarchien bzw. Auswertungshierarchien aus COB werden automatisiert übernommen. Jede Hierarchie bekommt einen Eintrag in der Sichtentabelle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;SichtenAuswahl&amp;quot;&amp;gt;{{ImagePara |imgsrc=SichtenAuswahl.png|width=600|caption=SichtenAuswahl}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Die Inhalte und Rechte der Sichten werden gecached. Nach einer Änderung der Inhalte einer Sicht im laufenden Betrieb musst man im SuperXManager den Cache leeren und sich neu anmelden.}}&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Sichten werden in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten &#039;sichten&#039;] definiert. Eine Übersicht über die Tabellenstruktur inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten hier].&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Die Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten sichten] lässt sich wie auch die Masken und Felder (s. Abschnitt [[Masken-Tutorial#Maskendefinition|Maskendefinition]] und [[Masken-Tutorial#Speichern_der_Felddefinition|Speichern der Felddefinition]])  in SuperX über ein Bearbeitungsformular manipulieren.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=SichtSuchen.png|width=600|caption=SichtSuchen}}&lt;br /&gt;
&lt;br /&gt;
Im Folgenden wird die Sicht &amp;quot;FB/Fak, Lehreinheit, Fach/Abschluss&amp;quot; näher betrachtet.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=SichtFachAbschluss.png|width=600|caption=SichtFachAbschluss}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Achtung|Das Feld {{Feld|quelle}} in der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_sichten sichten] ist auf 255 Zeichen begrenzt. Falls mehr Zeichen benötigt werden, kann in den Feldern {{Feld|cacheapplet}} und {{Feld|cachexml}} der SQL fortgeführt werden. Die beiden genannten Felder waren historisch für andere Zwecke geplant, werden für diese aber nicht mehr benötigt.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Bei &amp;lt;code&amp;gt;sos_org_lehre_fach_absch_ude&amp;lt;/code&amp;gt; handelt es sich um eine &amp;quot;View&amp;quot;. Diese &amp;quot;View&amp;quot; beinhaltet mehrere Select-Statements, welche quasi die verschiedenen Ebenen der Sicht &amp;quot;FB/Fak, Lehreinheit, Fach/Abschluss&amp;quot; darstellen.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=ViewFachAbschUDE.png|width=600|caption=ViewFachAbschUDE}}&lt;br /&gt;
&lt;br /&gt;
Das Organigramm stellt eine integrierende Sicht für verschiedene Datenquellen zusammen und ist somit die Voraussetzung für eine integrierte Betrachtung. Alle Einrichtungen, Institutionen und Projekte sind im Organigramm hierarchisch angeordnet (vgl. [https://super-ics.de/superx/doku/kern_modul/admin/f_DasOrganigramm.htm Das Organigramm]). Das Feld &#039;lehre&#039; wird entweder mit 1 oder 0 gefüllt, um festzustellen ob die Institution relevant für Auswertungen im Bereich Lehre ist (1=ja, 0=nein).&lt;br /&gt;
&lt;br /&gt;
Erläuterung des parent-Felds:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Das Parent-Feld gibt die key_apnr der übergeordneten organisatorischen Einheit an. Das root-Element des Baums besitzt als parent einen null-Wert. Das Organigramm darf demenstprechend nur ein Element haben, dass keinen parent besitzt. Hier sollte grundsätzlich die Hochschulnummer eingetragen werden die auch in anderen HIS-Programmen verwendet wird. In Duisburg ist dies z.B. der Basiseintrag key_apnr = &amp;quot;70&amp;quot; ( GMU Duisburg ). Es ist praktisch der oberste &amp;quot;Knoten&amp;quot; im Baum. Dann werden alle Einträge in der Tabelle organigramm gesucht, die parent=&amp;quot;70&amp;quot; haben – also direkte Kinder des Basiseintrags.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Hier findet sich u.a. Einrichtungen Forschung und Lehre (key_apnr=&amp;quot;7&amp;quot;, parent=&amp;quot;70&amp;quot;). Dieser Eintrag hat wiederum u.a. folgende Kinder:&lt;br /&gt;
*Fakultät 1 (key_apnr=&amp;quot;1100&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
*Fakultät 2 (key_apnr=&amp;quot;1200&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
*Faktultät 3 (key_apnr=&amp;quot;1300&amp;quot;, parent=&amp;quot;7&amp;quot;)&lt;br /&gt;
usw.&lt;br /&gt;
&lt;br /&gt;
Die weiteren Äste des Baums werden rekursiv abgefragt. &amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Struktur der Tabelle [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_organigramm &#039;organigramm&#039;] inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_organigramm hier]. &amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Tabelle [https://super-ics.de/superx/doku/sos_modul/sos.html#tab_dim_studiengang &#039;dim_studiengang&#039;] enthält Datensätze zu Studiengängen (Die Struktur der Tabelle inklusive Beschreibung findet sich [https://super-ics.de/superx/doku/sos_modul/sos.html#tab_dim_studiengang hier]).&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Für alle Sichten wird erwartet, dass mindestens die drei Felder name, key und parent geliefert werden (der konkrete Name der Spalten ist irrelevant).&lt;br /&gt;
Anschließend können optional noch Strukturinformationen folgen (entweder Integer oder String).&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Beispiel:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;&amp;lt;code&amp;gt;sp_fin_inst_hier(&amp;lt;&amp;lt;UserID&amp;gt;&amp;gt;,&amp;lt;&amp;lt;Stand&amp;gt;&amp;gt;,&amp;lt;&amp;lt;Sicht&amp;gt;&amp;gt;);select name,key,parent,strukturint from tmp_hier order by name; drop table tmp_hier;&amp;lt;/code&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;strukturint (gefüllt aus fin_inst.orgstruktur) gibt mit Zahlen an, ob ein Eintrag eine Lehreinheit oder ein Fachbereich ist.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Auf diese Information kann später in Abfragen mit FreeMarker zugegriffen werden.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Beispiel:&lt;br /&gt;
{{ImagePara |imgsrc=FreemarkerStrukturInt.png|width=500|caption=FreemarkerStrukturInt}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Einträge verstecken oder nicht-selektierbar machen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es kann gewünscht sein, dass Einträge versteckt hinterlegt werden. Betrachtet sei weiterhin die Sicht [[#SichtenAuswahl|&#039;FB/Fak, Lehreinheit, Fach/Abschluss&#039;]]. Die unterste sichtbare Ebene ist Fach/Abschluss. Man könnte also annehmen, es würde genügen, diese Sicht bis zur Ebene Fach/Abschluss aufzubauen. Dem ist allerdings nicht so. Es benötigt eine weitere, darunterliegende, aber nicht sichtbare Ebene &amp;quot;Studiengang&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;ViewFachAbschUDESichtbarUnsichtbar&amp;quot;&amp;gt;{{ImagePara |imgsrc=ViewFachAbschUDESichtbarUnsichtbar.png|width=600|caption=ViewFachAbschUDESichtbarUnsichtbar}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Zum Verständnis ein Beispiel anhand der Auswertung &amp;quot;Studierende nach Alter&amp;quot;. Zunächst wird eine Kombination &amp;quot;Fach/Abschluss&amp;quot; ausgewählt.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=AuswahlSichtBWLBA.png|width=400|caption=AuswahlSichtBWLBA}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Es erscheint folgende Ergebnistabelle:&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=ErgebnistabelleStudierendeNachAlter.png|width=600|caption=ErgebnistabelleStudierendeNachAlter}}&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Im SQL erfolgt die Einschränkung auf den im Sichtenbaum ausgewählten Eintrag durch &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in &amp;lt;@printkeys Studiengang.allNeededKeysList/&amp;gt; ... &amp;lt;/code&amp;gt;. &amp;lt;/br&amp;gt;Für unser Beispiel sieht diese Passage nach der Freemarker-Transformation folgendermaßen aus: &amp;lt;/br&amp;gt;&amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in   (&#039;_LE-WI_021_BS&#039;,&#039;s_3&#039;,&#039;s_36&#039;,&#039;s_33&#039;,&#039;s_65&#039;,&#039;s_270&#039;,&#039;s_87&#039;) ...&amp;lt;/code&amp;gt;.&amp;lt;/br&amp;gt; Würde die unterste, unsichtbare Ebene &#039;Studiengang&#039; entfallen (s. View [[#ViewFachAbschUDESichtbarUnsichtbar|&#039;sos_org_lehre_fach_absch_ude&#039;]]), sähe der SQL stattdessen so aus:&amp;lt;/br&amp;gt; &amp;lt;code&amp;gt;where ... &#039;s_&#039; || L.tid in   (&#039;_LE-WI_021_BS&#039;) ...&amp;lt;/code&amp;gt;. &amp;lt;/br&amp;gt;Das hätte zur Folge, dass keine Einträge gefunden würden, denn es wird nach dem Muster &#039;s_tid&#039; gesucht.&lt;br /&gt;
&lt;br /&gt;
Um eine Ebene unsichtbar zu machen benötigt es das Attribut &#039;nodeattrib&#039;. Wird diesem der Wert 1 übergeben, so ist die Ebene unsichtbar. Mit dem Wert 0 bleibt die Ebene sichtbar (s. View [[#ViewFachAbschUDESichtbarUnsichtbar|&#039;sos_org_lehre_fach_absch_ude&#039;]], Zeile 21 und 30).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Weiterhin kann es gewünscht sein, dass man in einer Sicht nur spezielle Einträge auswählen kann. &amp;lt;/br&amp;gt; So können man eine Lehreinheitsauswahl vielleicht so darstellen:&lt;br /&gt;
&lt;br /&gt;
Uni XY&lt;br /&gt;
* Fak 1&lt;br /&gt;
** Lehreinheit A&lt;br /&gt;
** Lehreinheit B&lt;br /&gt;
* Fak 2&lt;br /&gt;
** Lehreinheit C&lt;br /&gt;
** Lehreinheit D&lt;br /&gt;
&lt;br /&gt;
Die Kategorisierung Fak 1/2 dient der Klarheit der Darstellung, für eine Abfrage soll aber vielleicht nur eine konkrete Lehreinheit auswählbar sein. In dem Fall kann wie oben das nodeattrib 2 vergeben werden. Dadurch wird ein Eintrag als nicht-selektierbar markiert.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==User-/Gruppenrechte==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Außer Administratoren dürfen normale User zunächst einmal keine der nicht-internen Sichten benutzen.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;In den Tabellen user_sichten und user_sichtarten kann hinterlegt werden, dass ein User eine einzelne Sicht (z.B. name_intern Kostenstellen-Hauptsicht) oder eine ganze Sichtart (z.B. Kostenarten) benutzen darf.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Für Gruppen gibt es analog die Tabellen group_sichten und group_sichtarten.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Außerdem sachgeb_sichten und sachgeb_sichtarten, wenn Leute die ganze Sachgebiete sehen dürfen auch Sicht sehen sollen.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Die Pflege dieser Tabellen kann bequem über Administrationsformular im XML-Frontend vorgenommen werden.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&amp;lt;blockquote&amp;gt; Achtung:&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Nach Änderungen muss der Server-Cache aktualisiert werden und der User muss sich neu anmelden.&amp;lt;/br&amp;gt; Alternativ könnte auch Tomcat neu gestartet werden. &amp;lt;/blockquote&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Im Dateisystem unter $SUPERX_DIR/db/bin gibt es zwei Skripte userrechte_sichern.x und userrechte_einspielen.x.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Die entladen alle usertabellen (userinfo,groupinfo,user_sachgeb_bez etc) und spielen sie wieder ein.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Diese können z.B. dafür benutzt werden um alle Einstellungen von Test auf Echtrechner zu übernehmen.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Benutzen der Sichten in Masken==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
In [https://super-ics.de/superx/doku/kern_modul/kern.html#tab_felderinfo &#039;felderinfo&#039;] (s. [[Masken-Tutorial#Speichern_der_Felddefinition|Speichern der Felddefinition]]) muss als Art 12-Sicht eingetragen werden.&amp;lt;/br&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Im Feld Relation muss ein Select stehen, der die &#039;tids&#039; der gewünschten Sichten zurückliefert.&lt;br /&gt;
&lt;br /&gt;
{{ImagePara |imgsrc=FeldBearbeitenArtSicht.png|width=600|caption=FeldBearbeitenArtSicht}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Die aktiv-Einschränkung ist praktisch für Entwicklungs- und Wartungszwecke, weil man dann leicht einzelne Sichten de/aktivieren kann - Sortierung nach type, damit erst Hauptsichten und dann alternative Hierarchien angezeigt werden, dann nach Name.&amp;lt;/blockquote&amp;gt;&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;Der select sollte alle Sichtentids liefern, die ein Adminstrator sehen darf.&amp;lt;/br&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;Wenn ein User für einzelne Sichten keine Berechtigung hat, filtert der Server diese automatisch raus.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Danielq</name></author>
	</entry>
</feed>