Zuletzt bearbeitet vor 2 Jahren
von Meikel Bisping

Entwicklerschulung

Allgemeine Themen

„graphisches Arbeiten“ vs „SQL“ als Arbeitsgrundlage

Vorteile "graphisches Arbeiten“
relativ intuitiv zu bedienen
weniger Hintergrundwissen zu Datenmodell nötig

Nachteile „SQL“
SQL/Freemarker Kenntnisse nötig
Hintergrundwissen zu Datenmodell nötig

Nachteile "graphisches Arbeiten“
kann weniger "intuitiv" sein, als gedacht
sehr spezielle Anforderungen nicht umsetzbar
Vorteile „SQL“
auch sehr spezielle Anforderungen umsetzbar

Berichtstabellen

Berichte werden in der Datenbank abgelegt
Berichte in der Datenbank.png

Webanwendungsmanager

Unten im Themenbaum, "Maskensicherung" -> zum Sichern, aber auch Einspielen Meldung (in rot) unkritisch: Keine Fehler aufgefallen (09:30:46) HINWEIS: Kein Inhalt für maskeninfo select_stmt tid=77770000 (vor CDATA kein Leerzeichen o Umbruch!)

xupdate-Format enthält auch Themenbaumeintrag, klassische Form 5 Dateien nicht

Grundlegender Berichtsaufbau

Ein erster minimaler Bericht

Anzahl Studierende (Fälle) für ein festes Semester ausgeben select_stmt

 select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=20201; 

Auswahlfeld Semester

Feld Semester, integer, obligatorisch relation

 <<SQL>> select tid, eintrag from semester order by tid DESC; 

defaultwert

 <<SQL>> select tid,eintrag from semester where today() between sem_beginn  and sem_ende; 

select_stmt

 select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>; 

XIL-Proplist Studierende Fälle

Auswahlfeld Geschlecht

Feld suchen Testbericht -> freie tid-Nummer Feld suchen Studierende nach Alter 16351 Feld kopieren -> select_stmt

 select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
/* and geschlecht=<<Geschlecht>> */
 ; 

Geschlecht in den Spalten

Feld Geschlecht auf 999 select_stmt

create temp table tmp_erg (gesamt integer, maennlich integer,weiblich integer);
insert into tmp_erg (gesamt)
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>;
insert into tmp_erg (maennlich)
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>> and geschlecht=1;
insert into tmp_erg (weiblich)
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
and geschlecht=2;

select gesamt,maennlich,weiblich from tmp_erg;

cleanup statement : drop table tmp_erg;

XIl Proplist anpassen

Geschlecht in Spalten 2

Damit keine leeren Zellen, mit update

create temp table tmp_erg (gesamt integer, maennlich integer,weiblich integer);
insert into tmp_erg (gesamt)
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>;
update tmp_erg set maennlich=(
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>> and geschlecht=1);
update tmp_erg set weiblich=(select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
and geschlecht=2);

select gesamt,maennlich,weiblich from tmp_erg;

Feld Zählart (Köpfe oder Fälle)

Wunsch - Arbeit auch mit WENN-Bedingung -> Freemarker -> Erläuterung s.. Feld kopieren Benutzer -> Zählart

 <<SQL>> select 'koepfe','Köpfe' from xdummy union select 'faelle','Fälle' from xdummy; 

select_stmt

--freemarker template
create temp table tmp_erg (gesamt integer, maennlich integer,weiblich integer);
insert into tmp_erg (gesamt)
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
<#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>;
update tmp_erg set maennlich=(
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>> and geschlecht=1 <#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>);
update tmp_erg set weiblich=(select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
and geschlecht=2 <#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>);

select gesamt,maennlich,weiblich from tmp_erg;

Freemarker Makros

Makro
--freemarker template
create temp table tmp_erg (gesamt integer, maennlich integer,weiblich integer);
<#macro myselect>
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
<#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>
</#macro>

insert into tmp_erg ( gesamt)
<@myselect/>
;
update tmp_erg set maennlich=(<@myselect/> and geschlecht=1 );
update tmp_erg set weiblich=(<@myselect/>and geschlecht=2);

select gesamt,maennlich,weiblich from tmp_erg ;

SQLVars in Berichten

Variablen, die vor der Freemarker-Transformation ausgeführt werden. Beispiel: Bericht soll sich basierend auf einer Vorbedingung ganz anders verhalten, wenn keine Studierenden gefunden werden, Meldung ausgeben, ansonsten Tabelle. Vergl. SQLVar Kapitel unten

--freemarker template
<sqlvars>
<sqlvar name="countstudis">select count(*) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>></sqlvar>
</sqlvars>
<#if countstudis&gt;0>
create temp table tmp_erg (gesamt integer, maennlich integer,weiblich integer);
<#macro myselect>
select sum(summe) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
<#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>
</#macro>

insert into tmp_erg ( gesamt)
<@myselect/>
;
update tmp_erg set maennlich=(<@myselect/> and geschlecht=1 );
update tmp_erg set weiblich=(<@myselect/>and geschlecht=2);

select gesamt,maennlich,weiblich from tmp_erg ;
<#else>
create temp table tmp_erg (hinweis varchar(255));
insert into tmp_erg values ('Keine Studierenden gefunden');
select hinweis from tmp_erg;
</#if>

XIL-Proplist

XIL List
   drop_and_delete movable_columns sizable_columns horizontal_scrolling
   white_space_color=COLOR_WHITE fixed_columns=1
   min_heading_height=35
<#if countstudis&gt;0>
Column CID=0 heading_text="Gesamt" center_heading
   row_selectable col_selectable heading_platform readonly
   width=10 text_size=10
Column CID=0 heading_text="Männlich" center_heading
   row_selectable col_selectable heading_platform readonly
   width=10 text_size=10
Column CID=0 heading_text="Weiblich" center_heading
   row_selectable col_selectable heading_platform readonly
   width=10 text_size=10
<#else>
Column CID=0 heading_text="Hinweis" center_heading
   row_selectable col_selectable heading_platform readonly
   width=10 text_size=10
</#if>
@@@

Studiengang (Sicht) als Auswahlfeld

-> vergl. Kapitel BI-Sichten

Felder von Studierende nach Abschluss 16294 -> Feld kopieren als 77770003 select_stmt

--freemarker template
create temp table tmp_erg (gesamt integer, maennlich integer,weiblich integer);
<#macro myselect>
select sum(summe) from sos_stg_aggr S,lehr_stg_ab L where
S.tid_stg=L.tid
and  stichtag=6 and sem_rueck_beur_ein=<<Semester>>
<#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>
and  's_' || L.tid in <@printkeys Studiengang.allNeededKeysList/>
</#macro>

insert into tmp_erg ( gesamt)
<@myselect/>
;
update tmp_erg set maennlich=(<@myselect/> and geschlecht=1 );
update tmp_erg set weiblich=(<@myselect/>and geschlecht=2);

select gesamt,maennlich,weiblich from tmp_erg ;

XIL_Proplist countstudis raus

Studiengang in der 1. Spalte

-> Kapitel BI-Sichten


Erstmal nur Gesamtzahl

--freemarker template
create temp table tmp_erg (sortnr integer,ebene integer, key varchar(255),name varchar(255),gesamt integer, maennlich integer,weiblich integer);


<#assign sortnr=0/>
<#foreach stg in Studiengang.elements>
<#assign sortnr=sortnr+1/>
insert into tmp_erg (sortnr,ebene,key,name, gesamt)
select ${sortnr},${stg.level},'${stg.key}','${stg.name}',sum(summe) from sos_stg_aggr S,lehr_stg_ab L
where 
S.tid_stg=L.tid
and stichtag=6 and sem_rueck_beur_ein=<<Semester>>
<#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>
and  's_' || L.tid in ${stg.subkeys}
group by 1,2,3,4;
--update tmp_erg set maennlich=(<@myselect/> and geschlecht=1 );
--update tmp_erg set weiblich=(<@myselect/>and geschlecht=2);
</#foreach>
select ebene,name,gesamt,maennlich,weiblich from tmp_erg order by sortnr;

Studiengang in 1. Ergebnisspalte - Freemarker Makro mit Parametern (fortgeschritten)

--freemarker template
create temp table tmp_erg (sortnr integer,ebene integer, key varchar(255),name varchar(255),gesamt integer, maennlich integer,weiblich integer);
<#macro myfrom geschlechtvar studiengangvar >
from sos_stg_aggr S,lehr_stg_ab L
where 
S.tid_stg=L.tid
and stichtag=6 and sem_rueck_beur_ein=<<Semester>>
<#if Zählart='koepfe'> and studiengang_nr=1 and fach_nr=1</#if>
and  's_' || L.tid in ${studiengangvar.subkeys}
<#if geschlechtvar!=0> and geschlecht=${geschlechtvar} </#if>

</#macro>

<#assign sortnr=0/>
<#foreach stg in Studiengang.elements>
<#assign sortnr=sortnr+1/>
insert into tmp_erg (sortnr,ebene,key,name, gesamt)
select ${sortnr},${stg.level},'${stg.key}','${stg.name}',sum(summe) <@myfrom geschlechtvar=0 studiengangvar=stg/>
group by 1,2,3,4;
update tmp_erg set maennlich=(select sum(summe) <@myfrom geschlechtvar=1 studiengangvar=stg/>) where sortnr=${sortnr};
update tmp_erg set weiblich=(select sum(summe)  <@myfrom geschlechtvar=2 studiengangvar=stg/>) where sortnr=${sortnr};
</#foreach>
select ebene,name,gesamt,maennlich,weiblich from tmp_erg order by sortnr;

Repository

Im Repository können SQL-Codeschnipsel hinterlegt werden, die in Berichten dynamisch eingesetzt werden.
Beispiel: Studierende, Prüfungen | Administration Stud.Prüf.| Prüfprotkoll Studierende - Weitere Einstellungen: Filter Studierende
Nur 1-4. HS Semester Beispiel für Feldart 1 - Auswahl von Filter Studierende

 <<SQL>> SELECT id,caption from sx_repository where aktiv =1 and
  today() between gueltig_seit and gueltig_bis and art='SOS_STUD_FILTER' 
 order by 2;

Im select_stmt der Maske

 /* and ${<<Filter Studierende>>} */

Feld ist als optional ausgewählt, d.h. wenn auf der Maske kein Wert ausgewählt wurde, wird die Zeile entfernt. Ist z.B. wird durch die 1. klassische Transformation daraus

and  ${SOS_HSSEM_1_4}

Repository-Variablen stehen automatisch in Freemarker zur Verfügung. Es wird durch den Inhalt der Variablen ersetzt, im Beispiel also

and hssem <=4

Wenn Sie eigene Repository-Variablen mit art='SOS_STUD_FILTER' definieren, können Sie diese in allen Studierendenberichten mit Filterfeld nutzen.

Hochschulrepository Studierende oder via MaskeLesezeichen SOS_HSSEM_1_4 als SOS_HSSEM_5 definieren, nach einfügen ManagerCache leeren

Dynamische Generierung von SQL

1. Klassische Verarbeitung ohne Freemarker

Die einzelnen Abfragen (auch synonym Masken genannt) enthalten Platzhalter, wie beispielsweise:

select monat,sum(betrag) from cob_busa
where   monat=<<Monat>>; 

Auf der Maske gibt es ein Feld Monat. Vorm Abschicken des SQL wird <<Monat>> durch den gewählten Wert ersetzt. Falls eine Maske Felder enthält, welche optional gefüllt werden können, so wird der Ausdruck zwischen /* und */ gesetzt. Das hat zur Folge, dass dieser entfernt wird, falls kein Wert ausgewählt wurde. Aus beispielsweise

select monat,sum(betrag) from cob_busa
where   monat=<<Monat>>
/* and gege=<<Geldgeber>> */;

wird, falls kein Geldgeber ausgewählt wurde z. B.

select monat,sum(betrag) from cob_busa
where   monat=1;

, aber falls ein Geldgeber ausgewählt wurde z. B.

select monat,sum(betrag) from cob_busa
where   monat=1
and gege=3; 

Detail:
Der Ausdruck in <<XXX>> darf nur einmal in dem optionalen Block vorkommen. Falls er zweimal benötigt wird, müssen diese auf zwei Blöcke aufgeteilt werden. Z. B.:
/* and (dr in (<<Deckungsring>>) */
/* or dr2 in (<<Deckungsring>>) )*/

2. FreeMarker-Transformation

Nach der klassischen Transformation mit generateSql folgt ggfs. die FreeMarker Transformation. FreeMarker transformiert eine Vorlage (template) mit Hilfe eines Datenmodells (mit Java Objekten) zu einem Ausgabetext.

FreemarkerUebersicht

Sehr oft wird es zur Erzeugung von HTML benutzt, wir produzieren stattdessen SQL. Die Java-Objekte im Datenmodell sind die Felder, die auf der Maske zur Auswahl stehen.

Als einfachsten Anwendungsfall könnten wir also für eine Maske mit einem Monatsfeld statt des klassischen SuperX-Tags

select monat,sum(betrag) from tmp_busa where monat=<<Monat>> 

auch die FreeMarker Notation nehmen.

select monat,sum(betrag) from tmp_busa where monat=${Monat} 

Innerhalb von Freemarker kann ${} entfallen:

<#if Monat=1> ... </#if>

Ein komplexes Beispiel:

KomplexesBeispiel

SQLVars

--freemarker template
<sqlvars>
<sqlvar name="countstudis">
select count(*) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=<<Semester>>
</sqlvar>
</sqlvars>
<#if countstudis&gt;0>
BLOCK 1
<#else>
BLOCK 2
</#if>

1. (klassische) Transformation macht aus SQL in der SQLVar z.B.

a) select count(*) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=20201 oder
b) select count(*) from sos_stg_aggr where stichtag=6 and sem_rueck_beur_ein=20501

2. SQL wird ausgeführt und Ergebnis in Freemarker-Variable countstudis gespeichert
3. reguläre Freemarker Transformation wird durchgeführt, bei 1a) wird BLOCK1 ausgeführt, bei 1b) BLOCK2.
4. Entsprechender Teil wird ausgeführt.

sqlvars.png


Hinweise:

  • Statt <<Semester>> hätte man auch ${Semester} nehmen können
  • Wenn nach der klassischen Transformation < oder > Zeichen vorhanden sind, wird um den Text ein CDATA-Block benötigt, z.B.
    <sqlvar name="counter"><![CDATA[select count(*) from .. where anzahl>0; ]]></sqlvar>
  • Weitere Möglichkeiten unter https://super-ics.de/superx/doku/entwicklerhandbuch/f_Variablen.htm

Freemarker Spickzettel

  1. Innerhalb von SQL Zugrif auf Variabeln mit ${Varname} z.B. ${Semester}, in Befehlen ohne z.B. <#if Geschlecht=1>
    • Sind in Variabelnnamen Leer- oder Sonderzeichen enthalten Zugriff mit
    • ${.vars["Köpfe oder Fälle?"]} oder in Befehlen
    • <#if .vars["Köpfe oder Fälle?"]="xy">
  2. Variablen zuweisen mit assign, z.B. <#assign sortnr=0/> <#assign sortnr=sortnr+1/>
  3. IF-Befehle
    • <#if "<<Aggregierung>>"="stark">
    • insert into .. select ...
    • <#elseif "<<Aggregierung>>="mittel">
    • insert into .. select ...
    • <#else>
    • insert into .. select ...
    • </#if>
  4. Innerhalb von IF Größer- und Kleinerzeichen darstellen mit &gt; und &lt; z.B. <#if anzahl &gt; 0 >
  5. switch - statt vieler IF/ELSE-Bedinungen switch
  6. in SQLVars : wenn nach der klassischen Transformation < oder > Zeichen vorhanden sind, wird um den Text ein CDATA-Block benötigt, z.B. <sqlvar name="counter"><![CDATA[select count(*) from .. where anzahl>0; ]]></sqlvar>
  7. Schleifen
    1. einfach 10x durchführen <#list 1..10 as i> select ${i} .. </#list>
    2. über Ausgewählte Objekte <#foreach stg in Studiengang> </#foreach>
  8. Für Feldart 1 (Einfache Auswahlboxen) Zugriff auf das JavaObjekt und damit Methoden
    • <#if AggregierungObject.containsElements> oder ${AggregierungObject.allNeededKeys}

BI-Sichten

Sichten sind hierarchische Strukturen, intern JavaObjekte, die an Freemarker weitergegeben werden können.
Adminstration | Masken verwalten | Sicht suchen Beispiel: SOS-Studiengang-Sicht 

SOS-Studiengangs-Sichten sind ohne Rechtekontrolle, SOS-Kostenstellen-Sichten mit.

Rechte auf Sicht-Art oder einzelne Sicht möglich In dem Feld einer Maske mit Typ Sicht (12) muss ein SQL stehen, der die maximal anzuzeigenden Sichten auswählt.

 <<SQL>> select tid,name,sortnr from sichten where art in ('SOS-Kostenstellen-Sicht', 'SOS-Studiengang-Sicht') and aktiv=1 order by 3,2; 

Durch setzen von aktiv=0 kann man für alle User ausblenden

Besonderheiten im Bereich Studierende HisWiki

Captions - Felderläuterungen

Captions

"Quicklinks"/Deeplinks

Für die Nutzung in Portalen am besten ohne Navigation und Linkart "HISinOne SSO-Link für Portlets lokale Serverfunktion" z.B.

/rds?state=redirect&sso=superx&utarget=/superx/servlet/SuperXmlTabelle?%26tid%3D888881450%26Kennzahl%3DBEWERBER_K%26Jahr%3D2021%26Semester%3D20212%26Anzahl%2520Semester%3D10%26Anzahl%2520Jahre%3D5%26Ausgabe%3DInstitution%26Bericht%3DINTERN%26Zeitraumtyp%3DS%26offset%3D0%26_csrf.parameterName%3D_csrf.token%26_csrf%3D3a98e158-e101-4c88-95b5-f9cc6147ef0b%26contenttype%3Dtext%252Fhtml%26stylesheet%3Dtabelle_html_man_detail.xsl%26cachingcontrol%3Dclearmask 

Makroberichte

Makroberichte bedeutet nichts anderes als, dass nach dem Abschicken einer Maske zwei oder mehr Berichte hintereinander ausgeführt werden. Z.B: wählt man auf einer Studierenden(Makro) Maske Semester etc aus und dann wird sowohl "Studierende nach Alter" als auch "Studierende nach Fach-/Hochschulsemester" also zwei Ergebnistabellen ausgegeben.

vergl. Makros

Masken "klonen" Sx_import

Will man eine Maske wiederverwenden und z.B. nur ein paar optionale Felder in einer Kopie ausblenden, das select_stmt aber gleich bleibt, kann man eine Maske "klonen" bzw. in der kopierten Maske, Teile aus der Vorlage importieren.

vergl. SxImport

Studierende/Prüfungen

Komplexe Gewichtungen

https://wiki.his.de/mediawiki/index.php/Studierendengewichtungsregeln_-_HISinOne-BI
Anpassung von Berichten:
wenn Sie im Quelltext der Vorlage etwas sehen wie

<#assign lehr_stg_ab="lehr_stg_ab"/>
<#assign quelltabelle='sos_stg_aggr'/>
<#if "<<Köpfe oder Fälle ?>>"?index_of("S.gewichtung_id=")!=-1>
<#assign lehr_stg_ab="lehr_stg_ab_gew"/>
<#assign quelltabelle='sos_stud_gewichtung'/>
</#if>

Schauen Sie sich die Anleitung an unter https://wiki.his.de/mediawiki/index.php/Aenderung_von_Abfragen_zur_erweiterten_Gewichtung_-_HISinOne-BI

Weiterführende Informationen

Datenbankmodelle / Dokumentation

Datenmodell Stud. im HisWiki


http://www.superx-projekt.de/
Unter Module, dann jeweils LInk "Installations-, Upgradehinweise, Dokumentation und Versionshistorie" , Handbücher und Ressourcen, Datenbankbeschreibung

Entwicklerhandbuch

http://entwicklerhandbuch.superx-projekt.de/ bzw. ältere, aber umfangreichere Dokumentation http://www.superx-projekt.de/doku/entwicklerhandbuch/main.htm

JasperReports

Mit JasperReports kann man prinzipiell auch einfache Listen oder aggregierte Berichte wie in der BI selbst erzeugen, Grundlage ist allerdings immer die Bereitstellung von Daten via eines BI-Berichts auf den dann JasperReports-Weiterverarbeitung aufsetzt. Typische Anwendungsgebiete:

  1. komplexe Layouts oder optisch "hübsch" gestaltete Berichte
    Beispiel Stellenbewirtschaftungsbericht
    stellenbewirt jasper.png
  2. Charts/Grafiken
    Beispiel Studierende nach Geschlecht
    stud geschlecht torte.png
  3. (interaktive) Dashboards
    Beispiel:
    dashboard hhu1.png
  4. Booklets - Dokumente mit mehreren Seiten ggfs. Inhaltsverzeichnis

JasperHandbuch