Zuletzt bearbeitet vor einem Monat
von Daniel Quathamer

Masken- und Tabellengestaltung: Unterschied zwischen den Versionen

Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
Zeile 24: Zeile 24:


=Ergebnistabellen anpassen=
=Ergebnistabellen anpassen=
==Detailansicht verlinken==
Es ist möglich die Werte einer bestimmten Spalte als Links auszugeben, sodass mit einem Klick auf diesen weitere Details in einer zweiten Ergebnistabelle gezeigt werden. Dabei wird über Klick auf diesen Link eine zweite Maske aufgerufen, die Maskenfelder dieser Maske mit den übergebenen Parametern gefüllt und die Ergebnistabelle dieser Maske ausgegeben.
</br>
Im Folgenden eine Erläuterung anhand eines Beispiels mit Prüfungsanmeldungen. Die Tabelle listet pro Modul die Anzahl der Anmeldung und in einer weiteren Spalte die Anzahl der Studierenden, welche zu ihrem dritten Prüfungsversuch antreten. Die Werte der letzten Spalte mit den Drittversuchen wird verlinkt:
{{ImagePara |imgsrc=Links_in_Ergebnistabelle.png|width=600|caption=Links in Ergebnistabelle}}
Nach Klick auf einen der Links erscheint eine weitere Tabelle, welche statt der Anzahl die einzelnen Matrikelnummern inklusive Studiengang ausgibt:
{{ImagePara |imgsrc=Detailansicht.png|width=600|caption=Detailansicht}}
</br>
In diesem Falle fungieren die Werte der Spalte drittversuch als Link. Um dies umzusetzen geben wir eine weitere Spalte hidden_drittversuch aus. Durch hidden wird diese nicht dargestellt und _drittversuch dient als Referenz auf die Spalte drittversuch. Die Spalte hidden_drittversuch enthält den Teil der URL, welcher die Parameter beim Maskenaufruf definiert. Das sieht beispielsweise so aus:
'?tid=30610360&Prüfungskurztext='||pktxt||'&&cachingcontrol=clearmask' as hidden_drittversuch
'||pktxt||' wird ersetzt durch den Wert des Feldes pktxt derselben Zeile:
select
pktxt,
pdtxt,
(case when pstatus='AN' then 1 else 0 end) as anmeldung,
(case when pversuch=3 then 1 else 0 end) as drittversuch,
'?tid=30610360&Prüfungskurztext='||pktxt||'&&cachingcontrol=clearmask' as hidden_drittversuch
into temp tmp_ergebnis
Werden beim Maskenaufruf der Detailansicht weitere Felder benötigt, wird für diese eine Variable angelegt:
#assign stg=""/>
<#if "<<Studiengang>>"!=""><#assign stg="&Studiengang=<<Studiengang>>"?replace("'","")?replace("|",",")/></#if>
So ist gewährleistet, dass der Parameter nicht in die URL übernommen wird, falls das Maskenfeld leer ist. Zudem werden einfache Hochkommata ' und Pipes | ersetzt, um zugewährleisten, dass die URL funktioniert. Einfache Hochkommata ' könnten beispielsweise bei Schlüsseln, welche als charakter definiert sind übergeben werden und Pipes | bei Aufzählungen. Die Variable wird in den select der Spalte hidden_drittversuch eingebunden:
'?tid=30610360&Prüfungskurztext='||pktxt||'${stg}&&cachingcontrol=clearmask' as hidden_drittversuch
Sonderfall: Falls eine Maske in einem Link auf sich selbst verweist wird empfohlen statt der Maskennummer die automatisch gefüllte Freemarker-Variable ${Maskennummer} zu benutzen:
'?tid=${Maskennummer}&Prüfungskurztext='||pktxt||'${stg}&&cachingcontrol=clearmask' as hidden_drittversuch
Hintergrund: Falls man eine Kopie des entsprechenden Berichtes angelegt hat, um diesen mit eingeschränkten Funktionen (bspw. für User mit eingeschränkten Rechten) bereitzustellen, bietet sich die [https://wiki.his.de/mediawiki/index.php/SXimport_zur_Maskengestaltung_verwerden-HISinOne-BI sximport-Funktion] an. Würde dann statt ${Maskennummer} die tid verwandt, so würde der Link in der Berichtskopie auf den Hauptbericht verweisen, was für User mit eingeschränkten Rechten nicht erwünscht ist.
=Exporte anpassen=
=Baumdarstellung=
=Baumdarstellung=


Zeile 375: Zeile 331:
bewirkt, dass die Spalte plan_soll einstellig dargestellt wird.
bewirkt, dass die Spalte plan_soll einstellig dargestellt wird.
{{Achtung|Dies klappt nicht bei verschachtelten Spaltenlayouts}}
{{Achtung|Dies klappt nicht bei verschachtelten Spaltenlayouts}}
==Detailansicht verlinken==
Es ist möglich die Werte einer bestimmten Spalte als Links auszugeben, sodass mit einem Klick auf diesen weitere Details in einer zweiten Ergebnistabelle gezeigt werden. Dabei wird über Klick auf diesen Link eine zweite Maske aufgerufen, die Maskenfelder dieser Maske mit den übergebenen Parametern gefüllt und die Ergebnistabelle dieser Maske ausgegeben.
</br>
Im Folgenden eine Erläuterung anhand eines Beispiels mit Prüfungsanmeldungen. Die Tabelle listet pro Modul die Anzahl der Anmeldung und in einer weiteren Spalte die Anzahl der Studierenden, welche zu ihrem dritten Prüfungsversuch antreten. Die Werte der letzten Spalte mit den Drittversuchen wird verlinkt:
{{ImagePara |imgsrc=Links_in_Ergebnistabelle.png|width=600|caption=Links in Ergebnistabelle}}
Nach Klick auf einen der Links erscheint eine weitere Tabelle, welche statt der Anzahl die einzelnen Matrikelnummern inklusive Studiengang ausgibt:
{{ImagePara |imgsrc=Detailansicht.png|width=600|caption=Detailansicht}}
</br>
In diesem Falle fungieren die Werte der Spalte drittversuch als Link. Um dies umzusetzen geben wir eine weitere Spalte hidden_drittversuch aus. Durch hidden wird diese nicht dargestellt und _drittversuch dient als Referenz auf die Spalte drittversuch. Die Spalte hidden_drittversuch enthält den Teil der URL, welcher die Parameter beim Maskenaufruf definiert. Das sieht beispielsweise so aus:
'?tid=30610360&Prüfungskurztext='||pktxt||'&&cachingcontrol=clearmask' as hidden_drittversuch
'||pktxt||' wird ersetzt durch den Wert des Feldes pktxt derselben Zeile:
select
pktxt,
pdtxt,
(case when pstatus='AN' then 1 else 0 end) as anmeldung,
(case when pversuch=3 then 1 else 0 end) as drittversuch,
'?tid=30610360&Prüfungskurztext='||pktxt||'&&cachingcontrol=clearmask' as hidden_drittversuch
into temp tmp_ergebnis
Werden beim Maskenaufruf der Detailansicht weitere Felder benötigt, wird für diese eine Variable angelegt:
#assign stg=""/>
<#if "<<Studiengang>>"!=""><#assign stg="&Studiengang=<<Studiengang>>"?replace("'","")?replace("|",",")/></#if>
So ist gewährleistet, dass der Parameter nicht in die URL übernommen wird, falls das Maskenfeld leer ist. Zudem werden einfache Hochkommata ' und Pipes | ersetzt, um zugewährleisten, dass die URL funktioniert. Einfache Hochkommata ' könnten beispielsweise bei Schlüsseln, welche als charakter definiert sind übergeben werden und Pipes | bei Aufzählungen. Die Variable wird in den select der Spalte hidden_drittversuch eingebunden:
'?tid=30610360&Prüfungskurztext='||pktxt||'${stg}&&cachingcontrol=clearmask' as hidden_drittversuch
Sonderfall: Falls eine Maske in einem Link auf sich selbst verweist wird empfohlen statt der Maskennummer die automatisch gefüllte Freemarker-Variable ${Maskennummer} zu benutzen:
'?tid=${Maskennummer}&Prüfungskurztext='||pktxt||'${stg}&&cachingcontrol=clearmask' as hidden_drittversuch
Hintergrund: Falls man eine Kopie des entsprechenden Berichtes angelegt hat, um diesen mit eingeschränkten Funktionen (bspw. für User mit eingeschränkten Rechten) bereitzustellen, bietet sich die [https://wiki.his.de/mediawiki/index.php/SXimport_zur_Maskengestaltung_verwerden-HISinOne-BI sximport-Funktion] an. Würde dann statt ${Maskennummer} die tid verwandt, so würde der Link in der Berichtskopie auf den Hauptbericht verweisen, was für User mit eingeschränkten Rechten nicht erwünscht ist.
=Exporte anpassen=


=Schriftgröße des PDF-Exportes anpassen=
=Schriftgröße des PDF-Exportes anpassen=

Version vom 27. Juli 2023, 07:48 Uhr

Selektionsmasken anpassen

Checkboxen und Querabhängigkeiten

Checkboxen können mit Feldart 10 definiert werden. Bei einfachen Masken, kann felderinfo.relation leer bleiben und in felderinfo.default auch ein fester Wert stehen wie true. Wenn es auf der Maske dynamische Felder gibt, in deren SQL z.B. <<UserID>> steht, ist es wichtig, dass auch für Checkboxen in relation und default datenbanktypische Definitionen der auswählbaren Werte stehen, z.B.

<<SQL>> select 'true','Ja' from xdummy union select 'false','Nein' from xdummy
<<SQL>> select 'false','Nein' from xdummy

Felder auf der Maske verstecken

Wenn Felder auf der Maske versteckt werden sollen, gibt es zwei Möglichkeiten:

  • Feldart 13 -> das Feld ist versteckt und wird intern nicht aufgebaut, im Masken-XML ist es aber enthalten
  • Feldart beliebig, Eintrag in Spalte attribut: hidden
    Das Feld wird intern aufgebaut und kann auch im Masken-SQL per FreeMarker benutzt werden, es wird aber keine Auswahlmöglichkeit auf der Maske angezeigt (benutzt bisher für Feld Kostenstelle, das nicht angezeigt werden sollte, im Masken-SQL aber schon für Rechtekontrollen benutzt wird)
  • Feldart 999 (ab SuperX3.5rc2): Feld wird gar nicht erst aus Datenbank eingelesen, also ob nicht existent

Bei Benutzung der erweiterten kameralen Rechte SxFinRechte:
Auch wenn auf der Maske nicht alle kameralen Felder benötigt werden (z.B. Titel) müssen diese als versteckte Felder vorhanden sein, damit Querabhängigkeiten in Maskenbuttons z.B. FB SxFinRechte(..,"<<Titel>>",....) aufgelöst werden können!

Bei sehr vielen versteckten Feldern rutscht der Abschicken-Button nach unten, da auch versteckte Felder (noch) für die absolute Positionierung berücksichtigt werden. Trick: versteckte Felder in felderinfo auf y=-1 setzen, dann kommen sie nicht in Reihenzählung.


Ergebnistabellen anpassen

Baumdarstellung

Um im XML-Frontend eine Baumstruktur (Treetable) zu erhalten die auf- und zugeklappt werden kann, muss nur in dem letzten select als erstes Feld die Spalte "ebene" angegeben werden. Dieses Feld soll Zahlen enthalten, welche die Ebene angeben (1= erste Ebene, 2= zweite Ebene …). Dabei ist darauf zu achten, dass es keine Sprünge zur übernächsten höheren Ebene gibt, z.B. nicht von Ebene 2 auf Ebene 4 gesprungen wird. Andersherum ist dies kein Problem, also z.B. von Ebene 4 auf Ebene 2. Wenn es nun zuerst eine Spalte mit Ebene 1 gibt und darauf mehrere mit der Ebene 2 sind diese alle unter der Spalte der Ebene 1. Die Reihenfolge der Auflistung entscheidet dabei den übergeordneten Knoten und nicht nur die Ebene.

Die Baumdarstellung lässt sich auch dynamisch mit Sichtenzugriff erstellen. Dazu kann mit .elements auf Sichten zugegriffen werden. Für Studiengangssichten also Studiengang.elements:

create table tmp_aggr (
	Ebene integer,
	strukturStr varchar(255),
	name varchar (255),
	key varchar(255),
	anzahl integer,
	nextsem integer,
	anteil float,
	inzweisem integer,
	anteilzwei float,
	abschlussarbeit integer
	);

<#foreach einElement in Studiengang.elements>
insert into tmp_aggr(Ebene,strukturStr, name, key,anzahl,nextsem,anteil,inzweisem,anteilzwei,abschlussarbeit) 
select
	${einElement.level}::smallint,
	'${einElement.strukturStr}'::char(50),
	'${einElement.name}'::char(200), 
	'${einElement.key}'::char(10),
	count(E.matrikel_nr),
	sum(E.nextsem),
	(sum(E.nextsem)*100/count(E.matrikel_nr))::integer,
	sum(E.inzweisem),
	(sum(E.inzweisem)*100/count(E.matrikel_nr))::integer,
 	sum(E.abschlussarbeit)
from tmp_ergebnis E
where E.tid in ${einElement.subkeys}
order by 1,2,3,4
;
</#foreach>

Aufruf eines Stylesheets

Wenn Sie ein Stylesheet (egal ob JasperReport oder XSLT) der Maske als alleiniges Tabellenstylesheet zuweisen, wird dieses direkt im Ergebnis aufgerufen. Wenn Sie dann noch in der Maske ein Feld "Ausgabeformat" integrieren, können die Anwender zwischen HTML, Excel, PDF etc. wählen (s.u.).

Sie können auch eine Maske mit den Feldern "Bericht" und "Ausgabeformat" versehen, in dem die Anwender das entsprechende Layout (d.h. den JasperReport) auswählen kann. Ein funktionierendes Beispiel wäre z.B. die Maske "Studierende Datenblatt". Um so etwas zu erzeugen gehen Sie wie folgt vor:

Es muss auf der Maske ein Feld der Feldart 1 geben mit dem Namen tablestylesheet und der relation

<<SQL>> select distinct filename,X.caption from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=<<Maskennummer>>

und zum Beispiel für Defaultwert:

<<SQL>> select distinct filename,X.caption
from sx_stylesheets X,sx_mask_style S
where X.tid=S.stylesheet_id
and S.maskeninfo_id=<<Maskennummer>>
and S.ord=2
order by 2                                                                                                            

Für das Feld tablestylesheet wird automatisch eine Beschriftung hinterlegt, damit auf der Maske als Anzeige "Bericht" erscheint.

Außerdem müssen Sie ein Feld "Ausgabeformat" in der Maske ergänzen, ebenfalls Feldart=1:
relation:

<<SQL>> select element_value,description from menu_element where element='Ausgabeformat' and nature::smallint<100 order by nature::smallint

Beispiel für Excel als defaultwert:

<<SQL>> select element_value,description from menu_element where element='Ausgabeformat' and description='Excel'

Navigationsspalten im XML-Frontend

Wenn die Ergebnistabelle an das XML-Frontend übergeben wird, dann können spezielle Spalten für die Navigation eingesetzt werden. Die Spaltennamen werden im letzten select des select_stmt einer Maske übergeben.

  • nexttable: Link auf eine andere SuperX-Tabelle; der Inhalt des Feldes wird dann um den Pfad zum Servlet, (optional auch den String der Sessionid) und den Passus "SuperXmlTabelle?tid=" ergänzt, d.h. dem Servlet wird als erster Parameter die maskeninfo-tid übergeben.
    So wird z.B. aus dem Inhalt: 20010&id=2044
    der Link http://<URL der Webapplikation>>/servlet/SuperXmlTabelle?tid=20010&id=2044
    Die Ergebnisseite wird dann um einen Button ergänzt.
  • nextwindowtable: Das gleiche wie "nexttable", nur es wird ein neues Fenster geöffnet.
  • nextpage: Link auf eine andere SuperX-Tabelle wie nexttable, es wird nur ein anderes Icon und ein anderer Target genutzt.
  • nextmask: Link auf eine andere SuperX-Maske; der Inhalt des Feldes wird dann um den Pfad zum Servlet, (optional auch den String der Sessionid) und den Passus "SuperXmlMaske?tid=" ergänzt.
    So wird z.B. aus dem Inhalt: 20010&id=2044
    der Link http://<URL der Webapplikation>>/servlet/SuperXmlMaske?tid=20010&id=2044
    Die Ergebnisseite wird dann um einen Button ergänzt.
  • nextdelete: Link auf eine andere SuperX-Maske; Im Unterschied zu nextmask wird hier ein anderes Icon gewählt: Auf der Ergbnisseite erscheint ein Delete-Button.
  • nextedit: Link auf ein DBForms-Formular relativ zur URL des Servlets. Auf der Ergbnisseite erscheint ein Bearbeiten-Button.
  • nextmail: Feldinhalte werden um einen Mailto-Tag ergänzt.
    z.B. info@superx-projekt.de
    wird zu <a mailto:" info@superx-projekt.de"> info@superx-projekt.de</a>
  • url: Feldinhalte werden um einen href-Tag, sowie wenn nötig um ein "http" ergänzt.
    z.B. www.superx-projekt.de
    wird zu <a href="http://www.superx-projekt.de">www@superx-projekt.de</a>
  • nextlink: Link auf eine externe Seite oder eine andere SuperX-Tabelle; anders als bei nexttable wird ein frei wählbarer textueller Link angegeben, wobei der Volltext des Links und der eigentliche Link durch ein Trennzeichen "|" getrennt sind.
    So wird z.B. der Feldwert "SuperX-Projekt|http://www.superx-projekt.de" wie folgt ersetzt:
    <a href="http://www.superx-projekt.de">SuperX-Projekt</a>
    Wenn nach dem Trennzeichen keine externe Web-Adresse angeboten wird (erkennbar am vorangestellten "http:"), dann wird der Inhalt des Feldes um den Pfad zum Tabellen-Servlet ergänzt:
    So wird z.B. aus dem Inhalt: Details zur Hochschule|20010&id=2044
    der Link <a href=../servlet/SuperXmlTabelle?tid=20010&id=2044>Details zur Hochschule</a>

Standardabfragen mit hochschulspezifischen Details versehen

Bei Standardabfragen, bei denen nur Kleinigkeiten hochschulspezifisch angepasst werden sollen, wird ein Block eingebaut, z.B.

<#if K_hs_nr=6850> --HFT Stuttgart
      update tmp_erg set fest=0 where jahr!=year(today()); --Festlegungen nur bei aktuellem Haushaltsjahr
</#if>

Freemarker greift mit K_hs_nr auf die Hochschulnr. aus der Tabelle hochschulinfo zu, der update wird in diesem Beispiel also nur an der HFT Stuttgart gemacht.

Dies ist erweiterbar, indem ein Repository-Objekt CUSTOM_xxxxxx (Maskennummer) angelegt wird. Beispiel: FIN-Abfrage zeigt standardmäßig Festlegungen immer an, aber einige Hochschulen wollen Festlegungen nur für aktuelles Haushaltsjahr. Es wird in CUSTOM_xxxxxx eine Variable definiert:

<#assign FestlegungenNurAktuellesJahr=true/> 

Im masken-sql der Maske definiert man dann zunächst einen default-wert

<#assign FestlegungenNurAktuellesJahr=false/> -- default alle festelegungen
<#if CUSTOM_xxxxxx?exists> - falls custom_xxxxxx für die maske exisiert wird es aufgerufen
      <#assign inlineTemplate=CUSTOM_xxxxxx?interpret>
      <@inlineTemplate/>
      -- ausführen der Definition überschreibt default-wert von FestlegungenNurAktuellesJahr   mit <#assign FestlegungenNurAktuellesJahr=true/>
</#if>
<#if   FestlegungenNurAktuellesJahr>
      update tmp_erg set fest=0 where jahr!=year(today());
</#if> 

you#re welcome!

Spaltenlayout in Ergebnistabellen

Wie im Tutorial gezeigt, wird das Spaltenlayout (Überschriften, Breite) in der sog. "xil_proplist" gesteuert (der Name stammt übrigens vom früher im SuperX-Windows-Client eingesetzten XVT-Compiler zur Layoutdarstellung). Das Format ist etwas eigenwillig und soll hier erläutert werden.

Die Attribute in der xil_proplist

Zunächst ein Beispiel: der Code für die Maske "Bewerbungsprozess nach Fach/Studiengang" im ZUL-Modul beginnt wie folgt:

XIL List
    sizable_columns horizontal_scrolling
  drop_and_delete movable_columns  
  white_space_color=COLOR_WHITE fixed_columns=2
    min_heading_height=55
Column CID=0 heading_text="Ebene" center_heading
    row_selectable heading_platform readonly
    width=5 text_size=20 explanation=""

Hier sehen Sie die Ausgabe:

Ergebnistabelle Spalte "Ebene"

Der Code stammt wie gesagt von einem alten Windows-Client und wurde nur aus Gründen der abwärtskompatibilität übernommen. Nur die fett hervorgehobenen Code-Teile werden überhaupt ausgewertet. Wichtig ist aber, daß die Absatzstruktur des vorhandenen Dokuments beibehalten wird (d.h. jede Spalte ist in einem Absatz definiert, der mit "Column" beginnt). Am Ende der gesamten Xil_proplist befindet sich die Endemarke "@@@" in einem neuen Absatz.
Hier eine Erläuterung der Attribute:

  • Column: Definiert eine neue Spalte. Achtung: die Anzahl der "Column"-Anweisungen muss mit der Anzahl der Spalten übereinstimmen, die beim select_stmt geliefert werden.
  • heading_text: Die Spaltenüberschrift in der Ergebnistabelle. Hier sind noch spezielle Layoutanweisungen möglich (s.u.), außerdem können Sie Glossare nutzen
  • width: Die Spaltenbreite in Zeichen. Diese Anweisung wird im HTML-Layout nicht ausgewertet. Im PDF-Layout wird sie relativ ausgewertet: Alle Spaltenbreiten werden addiert, und zum DIN-A-4-Querformat in Beziehung gesetzt, und dann werden alle Spalten prozentual auf cm heruntergerechnet. In Excel werden die Breiten in Zeichen umgesetzt.
  • explanation: Erläuterungstext, der zu der Ergebnistabelle in einem separation Fenster angezeigt werden kann. Achtung: Wenn Sie explanations einsetzen, müssen alle Spalten dieses Attribut haben. Bitte nicht nur einzelne Spalten dokumentieren. Im Notfall schreiben Sie nur die Spaltenüberschrift rein.

Im Attribut " heading_text " können auch mehrzeilige Spaltenüberschriften definiert werden. Fügen Sie den Zeilenumbruch aber nicht direkt ein, sondern codieren Sie diesen als "\n". Bei der Ausgabe wird dies als Umbruch umgesetzt.

Verknüpfte Spaltenüberschriften

Um Spaltenüberschriften zu verknüpfen, muss man wie folgt vorgehen:
Alle Zellen, die verknüpft werden sollen, müssen den gleichen Namen haben, und mit dem Steuerzeichen " \000 " sowie einem Zeilenumbruch " \n " enden.
Beispiel: Der Code

Column CID=4 heading_text="Bewerbungen \000\n gesamt"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10 explanation="Bewerberanzahl "
Column CID=4 heading_text="Bewerbungen \000\n weiblich"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10 explanation=""
Column CID=5 heading_text="Bewerbungen \000\n weibl. in %"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10 explanation=""

sieht in der Ausgabe so aus:

Verknüpfte Spaltenüberschriften

Dynamische Spaltenanzahl

Kann mit Freemarker realisiert werden, Einfaches Beispiel:
Nur bei FIN_Quellsystem 1 (MBS) Soll Ansatz ausgegeben werden.

Abschluss-Select im Masken-SQL:

select name,<#if K_FIN_Quellsystem=1> hhans</#if>, einnahmen, ausgaben from fin;

XIL:

Column CID=4 heading_text="Name"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10
<#if K_FIN_Quellsystem=1>
Column CID=4 heading_text="Ansatz"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10
</#if>
Column CID=4 heading_text="Einnahmen"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10
Column CID=4 heading_text="Einnahmen"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10

Ein weiteres Beispiel:
Spalte Bewilligung soll nur angezeigt werden, wenn werte größer 0

Im Masken-SQL:

...
<sqlvars>
<sqlvar bewilligungen>select sum(bewill) from fin where ins=<<Ins>> </sqlvar>
</sqlvars> 
...

Die im Masken-SQL definierten sqlvars (in diesem Falle bewilligungen) sind auch in der XIL-Proplist zur verfügbar.

Abschluss-Select im Masken-SQL:

select name,ansatz<#if bewilligungen>0> , bewill, </#if> , ausgaben,verfuegbar from tmp_erg;

XIL:

Column CID=4 heading_text="Name"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10
<#if   bewilligungen&gt>0 >
Column CID=4 heading_text="bewill"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10
</#if>
Column CID=4 heading_text="Ausgaben"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10
Column CID=4 heading_text="verfügbar"   center_heading
    row_selectable col_selectable rightJust heading_platform readonly
    width=10

Hochschulspezifische Einstellmöglichkeit

Ein Bericht sollte nur so viel Spalten haben wie maximal benötigt werden. In der Standardauslieferung werden alle Spalten gezeigt. Ein Beispiel für ein Standard-Schluss-select:

select name, akt_soll,einnahmen,aus,fest,verfuegbar from tmp_erg 

Wenn eine Hochschule nicht alle Spalten oder die Spalten in einer anderen Reihenfolge sehen möchte, wird in x_repository eine Variable CUSTOM_XXXXXX (Maskennummer) angelegt, welche einen customize-Hash und in diesem die Felder, welche angezeigt werden sollen, definiert. field ist Feldname in der tmp_erg-tabelle, caption Spaltenüberschrift, width für xil-proplist und bei Bedarf kann auch explanation ergänzt werden:

<#assign customize={"resulttable":[
{"field":"name","caption":"Gliederung","width":14},
{"field":"akt_soll","caption":"Ansatz","width":15,"explanation":"Haushaltsansatz inkl.Einnahmen und Reste (Haushalterisch: Aktuelles Soll)"},
{"field":"einnahmen","caption":"Einnahmen","width":10},
{"field":"aus","caption":"Ausgaben","width":10},
{"field":"fest","caption":"Festgelegt","width":10},
{"field":"verfuegbar","caption":"verfügbar","width":12,"explanation":"@@@fin_verfuegbar@@@"}
]}/> 

Dies wäre die gleich Ausgabe wie im Standard.

attention.svg Nach Eingabe/Änderung den Manager-Chache leeren

Möchte eine Hochschule beispielsweise verfügbar weiter vorne stehen haben und akt_soll gar nicht sehen, wird der Eintrag folgendermaßen geändert:

<#assign customize={"resulttable":[
{"field":"name","caption":"Gliederung","width":14},
{"field":"verfuegbar","caption":"verfügbar","width":12,"explanation":"@@@fin_verfuegbar@@@"},
{"field":"einnahmen","caption":"Einnahmen","width":10},
{"field":"aus","caption":"Ausgaben","width":10},
{"field":"fest","caption":"Festgelegt","width":10}
]}/>

Im Masken-sql gegen Ende baut man ein

<#if CUSTOM_xxxxxx?exists>
      <#assign inlineTemplate=CUSTOM_xxxxxx?interpret>
      <@inlineTemplate/>
</#if>

Falls eine Hochschule ein custom_xxxxxx angelegt hat, wird der Inhalt interpretiert und ein customize-Hash steht zur Verfügung.Das Abschluss-select prüft also

<#if customize?exists> --customize existiert, abschluss select daraus aufbauen
      select 
            <#foreach f in customize.resulttable>
                  ${f.field} <#if h_has_next>,</#if>
            </#foreach>
      from tmp_erg2 ;

<#else> -- kein customize objekt existiert, standard abschluss select
      select name,akt_soll,einnahmen,ausgaben,fest,verfügbar from tmp_erg;
</#if>

Für die XIL-Proplist muss es genauso laufen:

XIL List
--freemarker template
<#if CUSTOM_xxxx?exists>
      <#assign inlineTemplate=CUSTOM_xxxx?interpret>
      <@inlineTemplate/>
</#if>
<#if customize?exists>--wenn Hochschul-customizeobjekt exixtiert, dann xil dynamisch aufbauen
      <#foreach f in customize.resulttable>
            Column CID=0 heading_text="${f.caption}"   center_heading explanation="<#if f.explanation?exists>${f.explanation}</#if>"
            row_selectable col_selectable heading_platform readonly width=${f.width}
      </#foreach>
<#else> --standard xil list
Column CID=0 heading_text="Name explanation="" center_heading     row_selectable col_selectable heading_platform readonly width=9 text_size=0
Column CID=0 heading_text="aktsoll explanation="" center_heading     row_selectable col_selectable
..
</#if>

complex, but coool,

for the super nerds,

Technik kann man sogar mit eigenen Freemarker-Funktionen verbinden, z.B. dynamsiche Spalten nach customizing und Link-Spalten zur Einzelbuchung nur anzeigen, wenn Rechte für Einzelbuchungen da sind. Aus dem Kontext, XIL:

<#function isWanted field>
<#assign result=true>
<#if field?starts_with('linkbuch')&&Einzelbuchrecht?exists&&Einzelbuchrecht?is_number&&Einzelbuchrecht=0><#assign result=false/></#if>
<#if (field='einnahmen'||field?starts_with('linkbuchein')||field='offsoll_e'||field?starts_with('linkbuchoffsolle'))&&"<<Einnahmen anzeigen>>"="'nein'">
<#assign result=false/></#if>
<#return result>
<#if customize?exists>
<#foreach f in customize.resulttable>
<#if isWanted(f.field)>
Column CID=2 heading_text="${f.caption}"   center_heading explanation="<#if f.explanation?exists>${f.explanation}</#if>"
row_selectable col_selectable heading_platform readonly width=${f.width}
</#if>
</#foreach>
<#else>
...

Dezimalstellen variieren

Normalerweise werden Werte mit Dezimalstellen immer zweistellig wiedergegeben. Im Ausnahmefall kann man dies ändern, indem man eine Spalte mit dem Namensschema "hidden"+Spaltenname+"dp" hinter die jeweilige Spalte setzt, und der Inhalt der Spalte enthält die Zahl der Nachkommastellen (0-6 möglich):

select ... plan_soll ,
1::integer as hiddenplan_solldp,...

bewirkt, dass die Spalte plan_soll einstellig dargestellt wird.

attention.svg Dies klappt nicht bei verschachtelten Spaltenlayouts

Detailansicht verlinken

Es ist möglich die Werte einer bestimmten Spalte als Links auszugeben, sodass mit einem Klick auf diesen weitere Details in einer zweiten Ergebnistabelle gezeigt werden. Dabei wird über Klick auf diesen Link eine zweite Maske aufgerufen, die Maskenfelder dieser Maske mit den übergebenen Parametern gefüllt und die Ergebnistabelle dieser Maske ausgegeben.
Im Folgenden eine Erläuterung anhand eines Beispiels mit Prüfungsanmeldungen. Die Tabelle listet pro Modul die Anzahl der Anmeldung und in einer weiteren Spalte die Anzahl der Studierenden, welche zu ihrem dritten Prüfungsversuch antreten. Die Werte der letzten Spalte mit den Drittversuchen wird verlinkt:

Links in Ergebnistabelle

Nach Klick auf einen der Links erscheint eine weitere Tabelle, welche statt der Anzahl die einzelnen Matrikelnummern inklusive Studiengang ausgibt:

Detailansicht
In diesem Falle fungieren die Werte der Spalte drittversuch als Link. Um dies umzusetzen geben wir eine weitere Spalte hidden_drittversuch aus. Durch hidden wird diese nicht dargestellt und _drittversuch dient als Referenz auf die Spalte drittversuch. Die Spalte hidden_drittversuch enthält den Teil der URL, welcher die Parameter beim Maskenaufruf definiert. Das sieht beispielsweise so aus:

'?tid=30610360&Prüfungskurztext='||pktxt||'&&cachingcontrol=clearmask' as hidden_drittversuch

'||pktxt||' wird ersetzt durch den Wert des Feldes pktxt derselben Zeile:

select 
	pktxt,
	pdtxt,
	(case when pstatus='AN' then 1 else 0 end) as anmeldung,
	(case when pversuch=3 then 1 else 0 end) as drittversuch,
	'?tid=30610360&Prüfungskurztext='||pktxt||'&&cachingcontrol=clearmask' as hidden_drittversuch
into temp tmp_ergebnis

Werden beim Maskenaufruf der Detailansicht weitere Felder benötigt, wird für diese eine Variable angelegt:

#assign stg=""/>
<#if "<<Studiengang>>"!=""><#assign stg="&Studiengang=<<Studiengang>>"?replace("'","")?replace("|",",")/></#if> 

So ist gewährleistet, dass der Parameter nicht in die URL übernommen wird, falls das Maskenfeld leer ist. Zudem werden einfache Hochkommata ' und Pipes | ersetzt, um zugewährleisten, dass die URL funktioniert. Einfache Hochkommata ' könnten beispielsweise bei Schlüsseln, welche als charakter definiert sind übergeben werden und Pipes | bei Aufzählungen. Die Variable wird in den select der Spalte hidden_drittversuch eingebunden:

'?tid=30610360&Prüfungskurztext='||pktxt||'${stg}&&cachingcontrol=clearmask' as hidden_drittversuch

Sonderfall: Falls eine Maske in einem Link auf sich selbst verweist wird empfohlen statt der Maskennummer die automatisch gefüllte Freemarker-Variable ${Maskennummer} zu benutzen:

'?tid=${Maskennummer}&Prüfungskurztext='||pktxt||'${stg}&&cachingcontrol=clearmask' as hidden_drittversuch

Hintergrund: Falls man eine Kopie des entsprechenden Berichtes angelegt hat, um diesen mit eingeschränkten Funktionen (bspw. für User mit eingeschränkten Rechten) bereitzustellen, bietet sich die sximport-Funktion an. Würde dann statt ${Maskennummer} die tid verwandt, so würde der Link in der Berichtskopie auf den Hauptbericht verweisen, was für User mit eingeschränkten Rechten nicht erwünscht ist.

Exporte anpassen

Schriftgröße des PDF-Exportes anpassen

Bei Bedarf kann man die Schriftgröße des PDF-Exportes anpassen. Dazu einfach beim letzten Select des "select_stmts" der Maske noch angeben

select ...... , 6::smallint as hidden_pdf_fontsize from tmp_erg order by ...;

und in der XIL-Proplist als Spalte "hidden_pdf_fontsize" hinterlegen.

Oder falls die Spalten über eine CUSTOM_ Variable im Repository definiert werden, kann man einfach ergänzen:

<#assign CUSTOM_1234={"resulttable":[
{"field":"ivst_invnr","caption":"Inventarnr","width":8},
{"field":"ivst_sernr","caption":"Seriennummer","width":9},
{"field":"ivst_gerbez","caption":"Bezeichnung","width":14},
{"field":"lieferant","caption":"Lieferant","width":10},
{"field":"ivst_hh_j","caption":"Jahr","width":6},
{"field":"ivst_betrdat","caption":"Inbetriebname","width":9},
{"field":"ivst_nutzd","caption":"Nutzungs-\ndauer","width":8},
{"field":"ivst_auftnr","caption":"Auftrags-\nnummer","width":8},
{"field":"ivst_preis","caption":"Preis","width":8},
{"field":"ivst_inst","caption":"Kosten-\nstelle","width":8},
{"field":"splitktr","caption":"Kosten-\nträger","width":8},
{"field":"ivst_nutzer","caption":"Nutzer","width":7},
{"field":"ivst_raum","caption":"Raum","width":8},
{"field":"8::smallint as hidden_pdf_fontsize","caption":"hidden_pdf_fontsize","width":1}
]}/>