From 200805cb3f0502ab86e0610a545cedf94a99f67e Mon Sep 17 00:00:00 2001
From: Imo John <john@memtext.de>
Date: Thu, 3 Apr 2025 14:00:45 +0200
Subject: [PATCH] JasperReport fuer Pruefungsergebnisse inkl Anpassungen
 Spaltenlayout; fm_templates-Eintrag fuer Spaltenverarbeitung

---
 .../module/rpta/masken/48110_felderinfo.unl   |   2 +
 .../rpta/masken/48110_masken_felder_bez.unl   |   1 +
 .../module/rpta/masken/48110_maskeninfo.unl   | 109 +----
 .../rpta/schluesseltabellen/fm_templates.unl  | 114 ++++-
 .../macro_masken_bez_fuellen.sql              |   2 +-
 ...exam_unit_dim_studiengang_note_fuellen.sql |  58 +++
 ...ang_note_fuellen_MIN_MAX_SEMESTER_TEST.sql | 443 ++++++++++++++++++
 .../sx_stylesheets_einfuegen.sql              |  14 +-
 .../48110_leistungen_und_studiengaenge.jrxml  | 414 ++++++++++++++++
 9 files changed, 1046 insertions(+), 111 deletions(-)
 create mode 100644 src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen_MIN_MAX_SEMESTER_TEST.sql
 mode change 100755 => 100644 src-modules/module/rpta/schluesseltabellen/sx_stylesheets_einfuegen.sql
 create mode 100644 superx/WEB-INF/reports/48110_leistungen_und_studiengaenge.jrxml

diff --git a/src-modules/module/rpta/masken/48110_felderinfo.unl b/src-modules/module/rpta/masken/48110_felderinfo.unl
index d52602c..32563c5 100644
--- a/src-modules/module/rpta/masken/48110_felderinfo.unl
+++ b/src-modules/module/rpta/masken/48110_felderinfo.unl
@@ -26,3 +26,5 @@ union select tid,name,sortnr from sichten where art in ('SOS-Kostenstellen-Sicht
 48133^Spalten^3001^0^0^150^190^10^char^30^0^1^<<SQL>>\
 select C.uniquename, C.caption ,L.layout_id from rpta_column C, rpta_column2layout L where C.tid=L.column_id and layout_id in\
 (select tid from rpta_column_layout where uniquename=<<Spaltenlayout>>) order by 2;^ ^ ^
+48134^tablestylesheet^19^0^0^100^150^1^char^200^1^1^<<SQL>>\
+select distinct filename,X.caption from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=48110^hidden^<<SQL>>select distinct filename,X.caption from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=48110 and ord=1^
diff --git a/src-modules/module/rpta/masken/48110_masken_felder_bez.unl b/src-modules/module/rpta/masken/48110_masken_felder_bez.unl
index 83c16dc..a64e9c6 100644
--- a/src-modules/module/rpta/masken/48110_masken_felder_bez.unl
+++ b/src-modules/module/rpta/masken/48110_masken_felder_bez.unl
@@ -13,3 +13,4 @@
 48110^48128^
 48110^48132^
 48110^48133^
+48110^48134^
diff --git a/src-modules/module/rpta/masken/48110_maskeninfo.unl b/src-modules/module/rpta/masken/48110_maskeninfo.unl
index e9e9a00..b72f9c6 100644
--- a/src-modules/module/rpta/masken/48110_maskeninfo.unl
+++ b/src-modules/module/rpta/masken/48110_maskeninfo.unl
@@ -90,114 +90,7 @@ and ${filter}\
 \
 \
 \
-select \
---zuerst die Basisdaten:\
-<#foreach column in columns>\
-<#if column.coltype="physicalColumn">\
-${column.srcfieldname} as ${column.srcfieldname},\
-<#elseif column.coltype="logicalColumn">\
-${column.colfunction} as ${column.targetfieldname},\
-<#elseif column.coltype="lookupColumn">\
-(${column.colfunction}) as ${column.targetfieldname},\
-<#elseif column.coltype="computedColumn" || column.coltype=="processingColumn">\
-null::decimal(19,6) as ${column.targetfieldname},\
-</#if>\
-</#foreach>\
-null::char(1) as dummycol\
-into temp tmp_stud\
-from ${basetable.runtime_tablename}\
-<#if rpta_column_layout.whereclause !="">\
-where ${rpta_column_layout.whereclause}\
-</#if>\
-;\
-\
---ergebnistabelle:\
-select \
---zuerst die nicht-Aggregate:\
-<#assign groupby=0 />\
-<#foreach column in columns>\
--- logicalColumns ausgeschlossen, da sie von processingColumns aggregiert werden\
--- computedColumns immer mitnehmen, da später verarbeitet\
-<#if column.is_aggregate==0 && column.coltype!="logicalColumn" && column.coltype!="processingColumn" || column.coltype="computedColumn"> \
-<#assign groupby=groupby+1 />\
-${column.targetfieldname},\
-<#elseif column.is_aggregate==0 && column.coltype="processingColumn"> \
-<#assign groupby=groupby+1 />\
-${column.srcfieldname} as ${column.targetfieldname},\
-</#if>\
-</#foreach>\
---dann die Aggregate:\
-<#foreach column in columns>\
--- logicalColumns ausgeschlossen, da sie von processingColumns aggregiert werden\
--- computedColumns ausgeschlossen, da später im finalen select verarbeitet\
-<#if column.is_aggregate==1 && column.coltype!="computedColumn" && column.coltype!="logicalColumn"> \
-${column.colfunction}(${column.srcfieldname}) as ${column.targetfieldname},\
-</#if>\
-</#foreach>\
-null::char(1) as dummycol\
-into temp tmp_stud2\
-from tmp_stud\
-where 1=1\
-/*  ${<<Zusatzfilter>>} */\
-group by\
-<#list 1..groupby as i>${i}\
-<#if i != groupby>\
-,\
-</#if>\
-</#list>\
-;\
---für Prozentwerte alle Aggregate summieren:\
-select <#foreach column in columns>\
-<#if column.is_aggregate==1 &&  column.coltype!="computedColumn" && column.coltype!="processingColumn">\
-sum(${column.targetfieldname})::float as ${column.targetfieldname},\
-</#if>\
-</#foreach>\
-null::char(1) as dummycol\
-into temp tmp_gesamt\
-from tmp_stud2\
-where 1=1\
-;\
-\
-<#assign number_of_visible_colums=0 />\
-<#foreach column in columns>\
-<#if column.is_visible!=0>\
-<#assign number_of_visible_colums=number_of_visible_colums+1 />\
-</#if>\
-</#foreach>\
-<#assign colnr=0 />\
-select \
-<#foreach column in columns>\
-<#if column.is_visible!=0>\
-<#assign colnr=colnr+1 />\
-<#assign format_sql="" />\
-<#if column.format_sql?string != "">\
-<#assign format_sql=column.format_sql />\
-</#if>\
-\
-<#if column.coltype=="computedColumn">\
-(${column.colfunction})${format_sql} as ${column.targetfieldname}\
-<#else>\
-${column.targetfieldname}${format_sql} as ${column.targetfieldname}\
-</#if>\
-\
-<#if colnr &lt; number_of_visible_colums>,</#if>\
-</#if> --wenn sichtbar\
-</#foreach>\
-from tmp_stud2\
-order by <#list 1..number_of_visible_colums as i>${i}\
-<#if i != number_of_visible_colums>\
-,\
-</#if>\
-</#list>\
-;\
-<#if basetable.is_virtual==1>\
-drop table if exists ${basetable.runtime_tablename};\
-</#if>\
-\
-\
-drop table if exists tmp_stud;\
-drop table if exists tmp_stud2;\
-drop table if exists tmp_gesamt;\
+<@rpta_interpret_column_layout />\
 \
 \
 </#if> --wenn columns?has_content^--Freemarker Template\
diff --git a/src-modules/module/rpta/schluesseltabellen/fm_templates.unl b/src-modules/module/rpta/schluesseltabellen/fm_templates.unl
index d4928ad..2583fa9 100644
--- a/src-modules/module/rpta/schluesseltabellen/fm_templates.unl
+++ b/src-modules/module/rpta/schluesseltabellen/fm_templates.unl
@@ -1,4 +1,4 @@
-84^RPTA-Makros^<#macro rpta_column_layout_fuellen>\
+91^RPTA-Makros^<#macro rpta_column_layout_fuellen>\
 CREATE temp TABLE tmp_rpta_column\
 (\
    uniquename       varchar(255)   NOT NULL,\
@@ -220,4 +220,116 @@ and L.resultset_id=T.resultset_id\
 drop table tmp_rpta_column;\
 drop TABLE tmp_rpta_column_layout;\
 drop TABLE tmp_rpta_column2layout;\
+</#macro>\
+\
+<#macro rpta_interpret_column_layout>\
+	select \
+		--zuerst die Basisdaten:\
+		<#foreach column in columns>\
+			<#if column.coltype="physicalColumn">\
+				${column.srcfieldname} as ${column.srcfieldname},\
+			<#elseif column.coltype="logicalColumn">\
+				${column.colfunction} as ${column.targetfieldname},\
+			<#elseif column.coltype="lookupColumn">\
+				(${column.colfunction}) as ${column.targetfieldname},\
+			<#elseif column.coltype="computedColumn" || column.coltype=="processingColumn">\
+				null::decimal(19,6) as ${column.targetfieldname},\
+			</#if>\
+		</#foreach>\
+		null::char(1) as dummycol\
+	into temp tmp_stud\
+	from ${basetable.runtime_tablename}\
+	<#if rpta_column_layout.whereclause !="">\
+	where ${rpta_column_layout.whereclause}\
+	</#if>\
+	;\
+	\
+	--ergebnistabelle:\
+	select \
+		--zuerst die nicht-Aggregate:\
+		<#assign groupby=0 />\
+		<#foreach column in columns>\
+			-- logicalColumns ausgeschlossen, da sie von processingColumns aggregiert werden\
+			-- computedColumns immer mitnehmen, da später verarbeitet\
+			<#if (column.is_aggregate==0 && column.coltype!="logicalColumn" && column.coltype!="processingColumn") || column.coltype="computedColumn"> \
+				<#assign groupby=groupby+1 />\
+				${column.targetfieldname},\
+			<#elseif column.is_aggregate==0 && column.coltype="processingColumn"> \
+				<#assign groupby=groupby+1 />\
+				${column.srcfieldname} as ${column.targetfieldname},\
+			</#if>\
+		</#foreach>\
+		--dann die Aggregate:\
+		<#foreach column in columns>\
+			-- logicalColumns ausgeschlossen, da sie von processingColumns aggregiert werden\
+			-- computedColumns ausgeschlossen, da später im finalen select verarbeitet\
+			<#if column.is_aggregate==1 && column.coltype!="computedColumn" && column.coltype!="logicalColumn"> \
+				${column.colfunction}(${column.srcfieldname}) as ${column.targetfieldname},\
+			</#if>\
+		</#foreach>\
+		null::char(1) as dummycol\
+	into temp tmp_stud2\
+	from tmp_stud\
+	where 1=1\
+	group by\
+		<#list 1..groupby as i>${i}\
+		<#if i != groupby>\
+		,\
+		</#if>\
+		</#list>\
+	;\
+	--für Prozentwerte alle Aggregate summieren:\
+	select \
+		<#foreach column in columns>\
+			<#if column.is_aggregate==1 &&  column.coltype!="computedColumn" && column.coltype!="processingColumn">\
+				sum(${column.targetfieldname})::float as ${column.targetfieldname},\
+			</#if>\
+		</#foreach>\
+		null::char(1) as dummycol\
+	into temp tmp_gesamt\
+	from tmp_stud2\
+	where 1=1\
+	;\
+	\
+	<#assign number_of_visible_colums=0 />\
+	<#foreach column in columns>\
+		<#if column.is_visible!=0>\
+			<#assign number_of_visible_colums=number_of_visible_colums+1 />\
+		</#if>\
+	</#foreach>\
+	<#assign colnr=0 />\
+	select \
+		<#foreach column in columns>\
+			<#if column.is_visible!=0>\
+				<#assign colnr=colnr+1 />\
+				<#assign format_sql="" />\
+				<#if column.format_sql?string != "">\
+					<#assign format_sql=column.format_sql />\
+				</#if>\
+	\
+				<#if column.coltype=="computedColumn">\
+					(${column.colfunction})${format_sql} as ${column.targetfieldname}\
+				<#else>\
+					${column.targetfieldname}${format_sql} as ${column.targetfieldname}\
+				</#if>\
+	\
+				<#if colnr &lt; number_of_visible_colums>,</#if>\
+			</#if> --wenn sichtbar\
+		</#foreach>\
+	from tmp_stud2\
+	order by \
+		<#list 1..number_of_visible_colums as i>${i}\
+		<#if i != number_of_visible_colums>\
+		,\
+		</#if>\
+		</#list>\
+	;\
+	\
+	<#if basetable.is_virtual==1>\
+		drop table if exists ${basetable.runtime_tablename};\
+	</#if>\
+	drop table if exists tmp_stud;\
+	drop table if exists tmp_stud2;\
+	drop table if exists tmp_gesamt;\
+	\
 </#macro>^Makros zum Umgang mit Spaltenlayouts^^1^
diff --git a/src-modules/module/rpta/schluesseltabellen/macro_masken_bez_fuellen.sql b/src-modules/module/rpta/schluesseltabellen/macro_masken_bez_fuellen.sql
index 774084d..9aa71cd 100644
--- a/src-modules/module/rpta/schluesseltabellen/macro_masken_bez_fuellen.sql
+++ b/src-modules/module/rpta/schluesseltabellen/macro_masken_bez_fuellen.sql
@@ -32,7 +32,7 @@ CREATE TEMP TABLE tmp_macro_masken_bez (
     maskeninfo_id2 integer NOT NULL,
     active integer DEFAULT 1 NOT NULL,
     sortnr smallint NOT NULL,
-    schleifenrelation character(255),
+    schleifenrelation text,
     schleifenfeldname character(255),
     alias character(255),
     schleifenfstand character(255),
diff --git a/src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen.sql b/src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen.sql
index 354c265..03b2bc8 100644
--- a/src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen.sql
+++ b/src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen.sql
@@ -18,6 +18,64 @@ select uniquename from rpta_resultset where uniquename='rpta_exam_unit_dim_studi
 
 <#assign rpta_columns = [
 
+{"uniquename":"dim_studiengang_stg",
+"srcfieldname":"dim_studiengang_stg",
+"column_type":"physicalColumn",
+"col_function":"",
+"format_code":"",
+"caption":"Fach",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":10,
+"description":""},
+
+{"uniquename":"dim_studiengang_abschluss",
+"srcfieldname":"dim_studiengang_abschluss",
+"column_type":"physicalColumn",
+"col_function":"",
+"format_code":"",
+"caption":"Abschluss",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":10,
+"description":""},
+
+  {"uniquename":"sem_der_pruefung",
+"srcfieldname":"sem_der_pruefung",
+"targetfieldname":"sem_der_pruefung",
+"column_type":"physicalColumn",
+"col_function":"",
+"format_code":"",
+"caption":"Semester der Prüfung (Schlüssel)",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":5,
+"description":""},
+
+{"uniquename":"sem_der_pruefung_str",
+"srcfieldname":"sem_der_pruefung",
+"targetfieldname":"sem_der_pruefung_str",
+"column_type":"logicalColumn",
+"col_function":"(select eintrag from semester where tid=sem_der_pruefung)",
+"format_code":"",
+"caption":"Semester der Prüfung",
+"is_visible":"0",
+"is_aggregate":0,
+"visible_size":10,
+"description":""},
+
+  {"uniquename":"sem_der_pruefung_str_process",
+"srcfieldname":"sem_der_pruefung_str",
+"targetfieldname":"sem_der_pruefung_str_process",
+"column_type":"processingColumn",
+"col_function":"",
+"format_code":"",
+"caption":"Semester der Prüfung",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":5,
+"description":""},
+
 {"uniquename":"elementnr",
 "srcfieldname":"elementnr",
 "column_type":"physicalColumn",
diff --git a/src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen_MIN_MAX_SEMESTER_TEST.sql b/src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen_MIN_MAX_SEMESTER_TEST.sql
new file mode 100644
index 0000000..4773958
--- /dev/null
+++ b/src-modules/module/rpta/schluesseltabellen/rptaColLay_rpta_exam_unit_dim_studiengang_note_fuellen_MIN_MAX_SEMESTER_TEST.sql
@@ -0,0 +1,443 @@
+--freemarker template
+<#include "RPTA-Makros"/>
+<sqlvars>
+<sqlvar name="rpta_exam_unit_dim_studiengang_exists">
+select count(*) from rpta_resultset where uniquename='rpta_exam_unit_dim_studiengang';
+</sqlvar>
+<sqlvar name="rpta_resultset">
+select uniquename from rpta_resultset where uniquename='rpta_exam_unit_dim_studiengang';
+</sqlvar>
+</sqlvars>
+<#assign rpta_column_layouts = [{"uniquename":"rpta_exam_unit_dim_studiengang_note",
+"caption":"Prüfungsergebnisse",
+"rpta_resultset":"rpta_exam_unit_dim_studiengang",
+"whereclause":"((modulart=''P'' and sourcesystem=6) or (part=''MP'' and sourcesystem=5))",
+"description":"Prüfung und Noten"
+}]
+   />
+
+<#assign rpta_columns = [
+
+{"uniquename":"dim_studiengang_stg",
+"srcfieldname":"dim_studiengang_stg",
+"column_type":"physicalColumn",
+"col_function":"",
+"format_code":"",
+"caption":"Fach",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":10,
+"description":""},
+
+{"uniquename":"dim_studiengang_abschluss",
+"srcfieldname":"dim_studiengang_abschluss",
+"column_type":"physicalColumn",
+"col_function":"",
+"format_code":"",
+"caption":"Abschluss",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":10,
+"description":""},
+
+  {"uniquename":"sem_der_pruefung",
+"srcfieldname":"sem_der_pruefung",
+"targetfieldname":"sem_der_pruefung",
+"column_type":"logicalColumn",
+"col_function":"sem_der_pruefung",
+"format_code":"",
+"caption":"Semester der Prüfung",
+"is_visible":"0",
+"is_aggregate":0,
+"visible_size":5,
+"description":""},
+
+  {"uniquename":"sem_der_pruefung_min_process",
+"srcfieldname":"sem_der_pruefung",
+"targetfieldname":"sem_der_pruefung_min_process",
+"column_type":"processingColumn",
+"col_function":"min",
+"format_code":"",
+"caption":"Semester der Prüfung (Min)",
+"is_visible":"1",
+"is_aggregate":1,
+"visible_size":5,
+"description":""},
+
+  {"uniquename":"sem_der_pruefung_max_process",
+"srcfieldname":"sem_der_pruefung",
+"targetfieldname":"sem_der_pruefung_max_process",
+"column_type":"processingColumn",
+"col_function":"max",
+"format_code":"",
+"caption":"Semester der Prüfung (Max)",
+"is_visible":"1",
+"is_aggregate":1,
+"visible_size":5,
+"description":""},
+
+{"uniquename":"elementnr",
+"srcfieldname":"elementnr",
+"column_type":"physicalColumn",
+"col_function":"",
+"format_code":"",
+"caption":"pnr",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":10,
+"description":""},
+
+  {"uniquename":"pdtxt",
+"srcfieldname":"pdtxt",
+"column_type":"physicalColumn",
+"col_function":"",
+"format_code":"",
+"caption":"Name der Prüfung",
+"is_visible":"1",
+"is_aggregate":0,
+"visible_size":40,
+"description":""},
+
+  {"uniquename":"summe",
+"srcfieldname":"summe",
+"column_type":"physicalColumn",
+"col_function":"sum",
+"format_code":"",
+"caption":"Teilnehmer",
+"is_visible":"1",
+"is_aggregate":1,
+"visible_size":15,
+"description":""},
+
+  {"uniquename":"note_case",
+"srcfieldname":"note",
+"targetfieldname":"note_case",
+"column_type":"logicalColumn",
+"col_function":"(case when note > 6 then null else note end)",
+"format_code":"",
+"caption":"Durchschnittsnote % *",
+"is_visible":"0",
+"is_aggregate":0,
+"visible_size":5,
+"description":""},
+
+  {"uniquename":"note_schnitt",
+"srcfieldname":"note_case",
+"targetfieldname":"note_schnitt",
+"column_type":"processingColumn",
+"col_function":"avg",
+"format_code":"",
+"caption":"Durchschnittsnote *",
+"is_visible":"0",
+"is_aggregate":1,
+"visible_size":5,
+"description":""},
+
+  {"uniquename":"note_schnitt_case",
+"srcfieldname":"note_schnitt",
+"targetfieldname":"note_schnitt_case",
+"column_type":"computedColumn",
+"col_function":"case when summe < 5 then null else note_schnitt end",
+"format_code":"",
+"caption":"Durchschnittsnote *",
+"is_visible":"1",
+"is_aggregate":1,
+"visible_size":25,
+"description":""},
+
+  {"uniquename":"pstatus_nb",
+"srcfieldname":"pstatus",
+"targetfieldname":"pstatus_nb",
+"column_type":"logicalColumn",
+"col_function":"(case when pstatus in (''NB'',''EN'') then 1 else 0 end)",
+"format_code":"",
+"caption":"Durchfallquote in % *",
+"is_visible":"0",
+"is_aggregate":0,
+"visible_size":5,
+"description":""},
+
+  {"uniquename":"pstatus_nb_sum",
+"srcfieldname":"pstatus_nb",
+"targetfieldname":"pstatus_nb_sum",
+"column_type":"processingColumn",
+"col_function":"sum",
+"format_code":"",
+"caption":"Durchfallquote in % *",
+"is_visible":"0",
+"is_aggregate":1,
+"visible_size":5,
+"description":""},
+
+  {"uniquename":"pstatus_nb_quote",
+"srcfieldname":"pstatus_nb_sum",
+"targetfieldname":"pstatus_nb_quote",
+"column_type":"computedColumn",
+"col_function":"case when summe < 5 then null else pstatus_nb_sum/summe::decimal(18,2)*100 end",
+"format_code":"DEC_2",
+"caption":"Durchfallquote in % *",
+"is_visible":"1",
+"is_aggregate":1,
+"visible_size":25,
+"description":""},
+
+  {"uniquename":"pvermerk_ne",
+"srcfieldname":"pvermerk",
+"targetfieldname":"pvermerk_ne",
+"column_type":"logicalColumn",
+"col_function":"(case when pvermerk in (''NE'',''N'') then 1 else 0 end)",
+"format_code":"",
+"caption":"Nicht erschienen",
+"is_visible":"0",
+"is_aggregate":0,
+"visible_size":5,
+"description":""},
+
+  {"uniquename":"pvermerk_ne_sum",
+"srcfieldname":"pvermerk_ne",
+"targetfieldname":"pvermerk_ne_sum",
+"column_type":"processingColumn",
+"col_function":"sum",
+"format_code":"INTEGER",
+"caption":"Nicht erschienen",
+"is_visible":"1",
+"is_aggregate":1,
+"visible_size":25,
+"description":""}
+
+
+  ] />
+ 
+ 
+   ---ab hier nicht mehr ändern:
+   
+CREATE temp TABLE tmp_rpta_column
+(
+   uniquename       varchar(255)   NOT NULL,
+   caption          varchar(255),
+   srcfieldname     varchar(255),
+   targetfieldname  varchar(255),
+   column_type      integer,
+   col_function     text,
+   is_visible       smallint,
+   visible_size     smallint,
+   is_aggregate     smallint,
+   resultset_id     integer,
+   sortnr integer,
+   description TEXT,
+   format_code_uniquename varchar(255),
+   format_code_id integer
+);
+
+CREATE temp TABLE tmp_rpta_column_layout
+(
+    uniquename    varchar(255)   NOT NULL,
+   caption       varchar(255),
+   resultset_id  integer,
+   whereclause text,
+   description text
+);
+
+
+<#foreach rpta_column_layout in rpta_column_layouts>
+
+insert into tmp_rpta_column_layout(
+resultset_id,
+uniquename,
+caption,
+whereclause,
+  description
+)
+select tid,
+'${rpta_column_layout.uniquename}',
+'${rpta_column_layout.caption}',
+'${rpta_column_layout.whereclause}',
+'${rpta_column_layout.description}'
+FROM rpta_resultset
+where uniquename='${rpta_column_layout.rpta_resultset}';
+
+</#foreach >
+
+<#assign sortnr=0 />
+<#foreach column in rpta_columns>
+<#assign sortnr=sortnr +1 />
+
+INSERT INTO tmp_rpta_column
+(resultset_id,
+  uniquename,
+  caption,
+  srcfieldname,
+  targetfieldname,
+  column_type,
+  col_function,
+  is_visible,
+  visible_size,
+  is_aggregate,
+  sortnr,
+  description,
+  format_code_uniquename
+  )
+select R.tid,
+'${column.uniquename}',
+'${column.caption}',
+'${column.srcfieldname}',
+<#if !column.targetfieldname?exists || column.targetfieldname=="">null::varchar <#else>'${column.targetfieldname}' </#if>,
+T.tid as column_type,
+<#if column.col_function?exists>'${column.col_function}'<#else>null::varchar  </#if>,
+${column.is_visible},
+${column.visible_size},
+${column.is_aggregate},
+${sortnr*10},
+<#if column.description?exists>'${column.description}'<#else>null::varchar  </#if>,
+<#if column.format_code?exists>'${column.format_code}'<#else>null::varchar </#if>
+FROM rpta_resultset R, rpta_column_type T
+where R.uniquename='${rpta_resultset}'
+and T.uniquename='${column.column_type}';
+
+</#foreach>
+
+update tmp_rpta_column set format_code_id=C.tid
+from rpta_format_code C
+where C.uniquename=tmp_rpta_column.format_code_uniquename
+and format_code_uniquename is not null;
+
+
+select * into temp tmp_rpta_column2layout
+from rpta_column2layout
+where layout_id in (select L.tid
+from rpta_column_layout L,rpta_resultset R
+where R.tid=L.resultset_id 
+and R.uniquename='${rpta_resultset}'
+and L.uniquename in (
+<#foreach rpta_column_layout in rpta_column_layouts>
+'${rpta_column_layout.uniquename}',
+</#foreach>'xy')
+)
+; 
+  
+select * into temp tmp_rpta_column_layout_target
+from rpta_column_layout
+where resultset_id in (select tid
+FROM rpta_resultset
+where uniquename='${rpta_resultset}')
+and uniquename in (select uniquename from tmp_rpta_column_layout)
+;
+
+insert into rpta_column_layout
+(uniquename,
+       caption,
+       resultset_id,
+       whereclause,
+  description)
+ select uniquename,
+       caption,
+       resultset_id,
+       whereclause,
+  description
+FROM tmp_rpta_column_layout T
+where 0=(select count(*) from tmp_rpta_column_layout_target T2
+where T.uniquename=T2.uniquename);
+
+drop table tmp_rpta_column_layout_target;
+
+delete from rpta_column2layout
+where layout_id in (select L.tid
+from rpta_column_layout L,rpta_resultset R
+where R.tid=L.resultset_id 
+and R.uniquename='${rpta_resultset}'
+and L.uniquename in (
+<#foreach rpta_column_layout in rpta_column_layouts>
+'${rpta_column_layout.uniquename}',
+</#foreach>'xy')
+)
+; 
+
+select * into temp tmp_rpta_column2 
+from tmp_rpta_column T 
+where (resultset_id,uniquename) not in
+(select resultset_id,uniquename from rpta_column);
+
+INSERT INTO rpta_column
+(resultset_id,
+  uniquename,
+  caption,
+  srcfieldname,
+  targetfieldname,
+  column_type,
+  col_function,
+  is_aggregate,
+  description,
+  custom
+  )
+  select 
+resultset_id,
+  uniquename,
+  caption,
+  srcfieldname,
+  targetfieldname,
+  column_type,
+  col_function,
+  is_aggregate,
+  description,
+  0 as custom
+from tmp_rpta_column2; 
+
+--evtl. neuen Satz einfügen, dann alle updaten
+
+update rpta_column set (  caption,
+  srcfieldname,
+  targetfieldname,
+  column_type,
+  col_function,
+  is_aggregate,
+  description)
+  = (select   caption,
+  srcfieldname,
+  targetfieldname,
+  column_type,
+  col_function,
+  is_aggregate,
+  description
+  from tmp_rpta_column T
+  where T.resultset_id=rpta_column.resultset_id
+  and T.uniquename=rpta_column.uniquename)
+  where custom=0
+  and  (resultset_id,uniquename) in
+(select T.resultset_id,T.uniquename
+from tmp_rpta_column T)
+;
+
+drop table tmp_rpta_column2;
+
+insert into rpta_column2layout(column_id,
+       layout_id,
+       sortnr,
+       is_visible,
+       visible_size,
+       caption,
+  description,
+  format_code_id)
+select C.tid as column_id,
+       L.tid as layout_id,
+       T.sortnr,
+       T.is_visible,
+       T.visible_size,
+       T.caption,
+  T.description,
+  T.format_code_id
+FROM rpta_column C,  rpta_column_layout L, tmp_rpta_column T
+where C.uniquename=T.uniquename
+and C.resultset_id=T.resultset_id
+and L.uniquename in (
+<#foreach rpta_column_layout in rpta_column_layouts>
+'${rpta_column_layout.uniquename}',
+</#foreach>'xy')
+and L.resultset_id=T.resultset_id
+ ;
+drop table tmp_rpta_column;
+drop table if exists tmp_rpta_column2;
+drop TABLE tmp_rpta_column_layout;
+
+
+
+
diff --git a/src-modules/module/rpta/schluesseltabellen/sx_stylesheets_einfuegen.sql b/src-modules/module/rpta/schluesseltabellen/sx_stylesheets_einfuegen.sql
old mode 100755
new mode 100644
index 39e9362..b59a5c3
--- a/src-modules/module/rpta/schluesseltabellen/sx_stylesheets_einfuegen.sql
+++ b/src-modules/module/rpta/schluesseltabellen/sx_stylesheets_einfuegen.sql
@@ -4,7 +4,8 @@
 
 <#assign masken = [
 {"mask":"48140", "filename":"tabelle_html.xsl", "ord":"10"},
-{"mask":"48140", "filename":"tabelle_xls_48140.xsl", "ord":"1"}
+{"mask":"48140", "filename":"tabelle_xls_48140.xsl", "ord":"1"},
+{"mask":"48110", "filename":"48110_leistungen_und_studiengaenge.jrxml", "ord":"1"}
 
 ] />
 
@@ -41,6 +42,17 @@
 "usage_resultset_data":"T",
 "stylesheet_type":"XSL_XLSX",
 "jr_datasource":""
+},
+{"filename":"48110_leistungen_und_studiengaenge.jrxml",
+"caption":"Prüfungsergebnisse (Excel)",
+"description":"Studiengangsweise Ausgabe pro Reiter",
+"relation":"table",
+"contenttype":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+"is_generic":"0",
+"toolbar_icon_filepath":"",
+"usage_resultset_data":"T",
+"stylesheet_type":"JRXML",
+"jr_datasource":""
 }
 ] />
 
diff --git a/superx/WEB-INF/reports/48110_leistungen_und_studiengaenge.jrxml b/superx/WEB-INF/reports/48110_leistungen_und_studiengaenge.jrxml
new file mode 100644
index 0000000..00cefb4
--- /dev/null
+++ b/superx/WEB-INF/reports/48110_leistungen_und_studiengaenge.jrxml
@@ -0,0 +1,414 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Created with Jaspersoft Studio version 6.21.3.final using JasperReports Library version 6.21.3-4a3078d20785ebe464f18037d738d12fc98c13cf  -->
+<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Leistungen und Studiengänge" language="groovy" pageWidth="842" pageHeight="5595" orientation="Landscape" columnWidth="818" leftMargin="12" rightMargin="12" topMargin="12" bottomMargin="12" uuid="d58082fe-8941-478b-b06e-8d7250737b92">
+	<property name="net.sf.jasperreports.export.xls.create.custom.palette" value="true"/>
+	<property name="net.sf.jasperreports.export.xls.detect.cell.type" value="true"/>
+	<property name="net.sf.jasperreports.export.xls.one.page.per.sheet" value="true"/>
+	<property name="net.sf.jasperreports.export.xls.remove.empty.space.between.columns" value="true"/>
+	<property name="net.sf.jasperreports.export.xls.remove.empty.space.between.rows " value="true"/>
+	<property name="net.sf.jasperreports.print.create.bookmarks" value="true"/>
+	<property name="net.sf.jasperreports.export.xls.exclude.origin.band.1" value="pageHeader"/>
+	<property name="net.sf.jasperreports.export.xls.exclude.origin.band.2" value="pageFooter"/>
+	<property name="net.sf.jasperreports.export.xlsx.exclude.origin.band.1" value="pageHeader"/>
+	<property name="net.sf.jasperreports.export.xlsx.exclude.origin.band.2" value="pageFooter"/>
+	<property name="com.jaspersoft.studio.data.defaultdataadapter" value="Prüfungsergebnisse"/>
+	<property name="com.jaspersoft.studio.unit." value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/>
+	<property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/>
+	<template><![CDATA["simple_table.jrtx"]]></template>
+	<style name="TableRowDetail" mode="Opaque" forecolor="#000000" backcolor="#FFFFFF" hTextAlign="Right" vTextAlign="Middle" isBlankWhenNull="true" fontName="Liberation Sans" fontSize="8" isBold="false">
+		<box rightPadding="2">
+			<pen lineColor="#000000"/>
+			<topPen lineWidth="0.5" lineColor="#030303"/>
+			<leftPen lineWidth="0.5" lineColor="#030303"/>
+			<bottomPen lineWidth="0.5" lineColor="#030303"/>
+			<rightPen lineWidth="0.5" lineColor="#030303"/>
+		</box>
+		<paragraph leftIndent="2" rightIndent="1" spacingBefore="0" spacingAfter="0"/>
+		<conditionalStyle>
+			<conditionExpression><![CDATA[Boolean.valueOf( $V{PAGE_COUNT} % 2 == 1 )]]></conditionExpression>
+			<style mode="Opaque" forecolor="#000000" backcolor="#E3E8EB"/>
+		</conditionalStyle>
+	</style>
+	<queryString language="xPath">
+		<![CDATA[/ergebnisse/ergebnis/ergebniselement[@ordnr='0']/sqlerg/row]]>
+	</queryString>
+	<field name="REPORT_HEADING_INSTITUTION" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/generalinfo/REPORT_HEADING_INSTITUTION]]></fieldDescription>
+	</field>
+	<field name="REPORT_HEADING_URL" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/generalinfo/REPORT_HEADING_URL]]></fieldDescription>
+	</field>
+	<field name="REPORT_LOGO_FILE" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/generalinfo/REPORT_LOGO_FILE]]></fieldDescription>
+	</field>
+	<field name="REPORT_HEADING_ADRESS" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/generalinfo/REPORT_HEADING_ADRESS]]></fieldDescription>
+	</field>
+	<field name="REPORT_EMAIL" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/generalinfo/REPORT_EMAIL]]></fieldDescription>
+	</field>
+	<field name="REPORT_DOCUMENTATION_URL" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/generalinfo/REPORT_DOCUMENTATION_URL]]></fieldDescription>
+	</field>
+	<field name="Berichtsname" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis[ @ordnr='0']/maskenname]]></fieldDescription>
+	</field>
+	<field name="Erlaeuterung" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis[ @ordnr='0']/explanation]]></fieldDescription>
+	</field>
+	<field name="Hinweis" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis[ @ordnr='0']/hinweis]]></fieldDescription>
+	</field>
+	<field name="Fach" class="java.lang.String">
+		<fieldDescription><![CDATA[col[@id="0" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Abschluss" class="java.lang.String">
+		<fieldDescription><![CDATA[col[@id="1" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Semester der Prüfung (Schlüssel)" class="java.lang.Integer">
+		<fieldDescription><![CDATA[col[@id="2" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Semester der Prüfung" class="java.lang.String">
+		<fieldDescription><![CDATA[col[@id="3" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="pnr" class="java.lang.String">
+		<fieldDescription><![CDATA[col[@id="4" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Name der Prüfung" class="java.lang.String">
+		<fieldDescription><![CDATA[col[@id="5" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Teilnehmer" class="java.lang.Integer">
+		<fieldDescription><![CDATA[col[@id="6" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Durchschnittsnote *" class="java.lang.Double">
+		<fieldDescription><![CDATA[col[@id="7" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Durchfallquote in % *" class="java.lang.Double">
+		<fieldDescription><![CDATA[col[@id="8" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="Nicht erschienen" class="java.lang.Integer">
+		<fieldDescription><![CDATA[col[@id="9" and wert!=""]/wert]]></fieldDescription>
+	</field>
+	<field name="legende_Seit Semester_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Seit Semester"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Seit Semester_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Seit Semester"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_Bis Semester_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Bis Semester"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Bis Semester_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Bis Semester"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_Semestertyp_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Semestertyp"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Semestertyp_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Semestertyp"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_Studiengang_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Studiengang"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Studiengang_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Studiengang"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_Fächer_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Fächer"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Fächer_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Fächer"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_Abschluss_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Abschluss"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Abschluss_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Abschluss"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_bis Fachsemester_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="bis Fachsemester"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_bis Fachsemester_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="bis Fachsemester"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_Spaltenlayout_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Spaltenlayout"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Spaltenlayout_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Spaltenlayout"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="legende_Spalten_label" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/completefields/feld [@varname="Spalten"]/@varname]]></fieldDescription>
+	</field>
+	<field name="legende_Spalten_value" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis/felder/feld [@varname="Spalten"]/value_caption]]></fieldDescription>
+	</field>
+	<field name="standdatum" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/ergebnis[ @ordnr='0']/stand]]></fieldDescription>
+	</field>
+	<field name="user" class="java.lang.String">
+		<fieldDescription><![CDATA[/ergebnisse/user]]></fieldDescription>
+	</field>
+	<variable name="tabellennr" class="java.lang.Integer">
+		<variableExpression><![CDATA[0]]></variableExpression>
+	</variable>
+	<variable name="MinSemester" class="java.lang.Integer" resetType="Group" resetGroup="Abschluss" calculation="Lowest">
+		<variableExpression><![CDATA[$F{Semester der Prüfung (Schlüssel)}]]></variableExpression>
+	</variable>
+	<variable name="MaxSemester" class="java.lang.Integer" resetType="Group" resetGroup="Abschluss" calculation="Highest">
+		<variableExpression><![CDATA[$F{Semester der Prüfung (Schlüssel)}]]></variableExpression>
+	</variable>
+	<group name="tabellennr">
+		<groupExpression><![CDATA[$V{tabellennr}]]></groupExpression>
+	</group>
+	<group name="Fach">
+		<groupExpression><![CDATA[$F{Fach}]]></groupExpression>
+	</group>
+	<group name="Abschluss" isStartNewPage="true">
+		<groupExpression><![CDATA[$F{Abschluss}]]></groupExpression>
+		<groupHeader>
+			<band height="60">
+				<property name="com.jaspersoft.studio.unit.height" value="pixel"/>
+				<textField>
+					<reportElement style="LegendLabel" x="0" y="30" width="818" height="20" uuid="b5c9a9db-b01b-48ab-9dca-3478eae8829e"/>
+					<textElement verticalAlignment="Bottom">
+						<font isBold="true"/>
+					</textElement>
+					<textFieldExpression><![CDATA["Filterkriterien: "]]></textFieldExpression>
+				</textField>
+				<textField textAdjust="StretchHeight">
+					<reportElement style="LegendContent" x="0" y="50" width="818" height="10" isPrintWhenDetailOverflows="true" backcolor="#FFFFFF" uuid="0d6743c3-cd7a-471f-baca-226acf0a9dbc"/>
+					<box topPadding="10" leftPadding="2" bottomPadding="10" rightPadding="2"/>
+					<textFieldExpression><![CDATA[""+(($F{legende_Seit Semester_value}==null || $F{legende_Seit Semester_value}=="")?"":($F{legende_Seit Semester_label}+": "+$F{legende_Seit Semester_value}+"; "))
++(($F{legende_Bis Semester_value}==null || $F{legende_Bis Semester_value}=="")?"":($F{legende_Bis Semester_label}+": "+$F{legende_Bis Semester_value}+"; "))
++(($F{legende_Semestertyp_value}==null || $F{legende_Semestertyp_value}=="")?"":($F{legende_Semestertyp_label}+": "+$F{legende_Semestertyp_value}+"; "))
++(($F{legende_Spaltenlayout_value}==null || $F{legende_Spaltenlayout_value}=="")?"":($F{legende_Spaltenlayout_label}+": "+$F{legende_Spaltenlayout_value}+"; "))
+ +"Datenstand: "+ $F{standdatum} + "; " + "Erstellt: "+ DATEFORMAT( TODAY(), "dd.MM.YYYY")]]></textFieldExpression>
+				</textField>
+				<textField>
+					<reportElement x="0" y="0" width="818" height="30" uuid="cd4ea430-054a-4958-a410-35ce51cec7d5">
+						<propertyExpression name="net.sf.jasperreports.export.xls.sheet.name"><![CDATA[$F{Fach}+" "+$F{Abschluss}]]></propertyExpression>
+					</reportElement>
+					<textElement textAlignment="Left" verticalAlignment="Middle">
+						<font size="14" isBold="true"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$F{Fach}+" "+$F{Abschluss}]]></textFieldExpression>
+				</textField>
+			</band>
+		</groupHeader>
+		<groupFooter>
+			<band height="55">
+				<staticText>
+					<reportElement x="0" y="15" width="818" height="20" uuid="63ced6b8-8393-407e-aebf-76351478ff2c">
+						<property name="com.jaspersoft.studio.unit.y" value="px"/>
+					</reportElement>
+					<text><![CDATA[* Bei weniger als 5 Prüfungsteilnehmern werden keine Durchschnittsnoten oder Durchfallquoten ausgewiesen.]]></text>
+				</staticText>
+				<staticText>
+					<reportElement x="0" y="35" width="818" height="20" uuid="30399079-73f3-4bf2-8a55-f7f313aab901"/>
+					<text><![CDATA[Die Spalte "Nicht erschienen" dient zur ergänzenden Information, d.h. die hier angegebenen "Nicht erschienen" sind in den Spalten "Teilnehmer", "Durchschnittsnote" und "Durchfallquote in %" enthalten.]]></text>
+				</staticText>
+			</band>
+		</groupFooter>
+	</group>
+	<group name="Semester">
+		<groupExpression><![CDATA[$F{Semester der Prüfung (Schlüssel)}]]></groupExpression>
+		<groupHeader>
+			<band height="45">
+				<staticText>
+					<reportElement positionType="Float" x="0" y="30" width="51" height="15" uuid="b2beb035-a6bc-40a4-844d-d9fe2f5891a4">
+						<property name="com.jaspersoft.studio.unit.height" value="px"/>
+					</reportElement>
+					<box>
+						<topPen lineWidth="1.0"/>
+						<leftPen lineWidth="1.0"/>
+						<bottomPen lineWidth="1.0"/>
+						<rightPen lineWidth="1.0"/>
+					</box>
+					<textElement textAlignment="Center" verticalAlignment="Middle">
+						<font isBold="true"/>
+					</textElement>
+					<text><![CDATA[pnr]]></text>
+				</staticText>
+				<staticText>
+					<reportElement positionType="Float" x="435" y="30" width="128" height="15" uuid="b8f5202b-2d0a-427f-81de-c923cbe2f094">
+						<property name="com.jaspersoft.studio.unit.height" value="px"/>
+					</reportElement>
+					<box>
+						<topPen lineWidth="1.0"/>
+						<leftPen lineWidth="1.0"/>
+						<bottomPen lineWidth="1.0"/>
+						<rightPen lineWidth="1.0"/>
+					</box>
+					<textElement textAlignment="Center" verticalAlignment="Middle">
+						<font isBold="true"/>
+					</textElement>
+					<text><![CDATA[Durchschnittsnote *]]></text>
+				</staticText>
+				<staticText>
+					<reportElement positionType="Float" x="358" y="30" width="77" height="15" uuid="7e3c57b7-1ed1-470e-92a4-fe799dae0d9f">
+						<property name="com.jaspersoft.studio.unit.height" value="px"/>
+					</reportElement>
+					<box>
+						<topPen lineWidth="1.0"/>
+						<leftPen lineWidth="1.0"/>
+						<bottomPen lineWidth="1.0"/>
+						<rightPen lineWidth="1.0"/>
+					</box>
+					<textElement textAlignment="Center" verticalAlignment="Middle">
+						<font isBold="true"/>
+					</textElement>
+					<text><![CDATA[Teilnehmer]]></text>
+				</staticText>
+				<staticText>
+					<reportElement positionType="Float" x="691" y="30" width="127" height="15" uuid="c77831d1-4cc7-4401-aef8-585d8a64e7a9">
+						<property name="com.jaspersoft.studio.unit.height" value="px"/>
+					</reportElement>
+					<box>
+						<topPen lineWidth="1.0"/>
+						<leftPen lineWidth="1.0"/>
+						<bottomPen lineWidth="1.0"/>
+						<rightPen lineWidth="1.0"/>
+					</box>
+					<textElement textAlignment="Center" verticalAlignment="Middle">
+						<font isBold="true"/>
+					</textElement>
+					<text><![CDATA[Nicht erschienen]]></text>
+				</staticText>
+				<staticText>
+					<reportElement positionType="Float" x="51" y="30" width="307" height="15" uuid="1c8d7170-556e-4e09-a555-94f72f81509e">
+						<property name="com.jaspersoft.studio.unit.height" value="px"/>
+					</reportElement>
+					<box>
+						<topPen lineWidth="1.0"/>
+						<leftPen lineWidth="1.0"/>
+						<bottomPen lineWidth="1.0"/>
+						<rightPen lineWidth="1.0"/>
+					</box>
+					<textElement textAlignment="Center" verticalAlignment="Middle">
+						<font isBold="true"/>
+					</textElement>
+					<text><![CDATA[Name der Prüfung]]></text>
+				</staticText>
+				<staticText>
+					<reportElement positionType="Float" x="563" y="30" width="128" height="15" uuid="8cd3f230-31bf-4855-8009-22e8e5fcc20b">
+						<property name="com.jaspersoft.studio.unit.height" value="px"/>
+					</reportElement>
+					<box>
+						<topPen lineWidth="1.0"/>
+						<leftPen lineWidth="1.0"/>
+						<bottomPen lineWidth="1.0"/>
+						<rightPen lineWidth="1.0"/>
+					</box>
+					<textElement textAlignment="Center" verticalAlignment="Middle">
+						<font isBold="true"/>
+					</textElement>
+					<text><![CDATA[Durchfallquote in % *]]></text>
+				</staticText>
+				<textField>
+					<reportElement x="0" y="0" width="818" height="30" uuid="dde46984-9757-4065-970a-042ac9e725c4"/>
+					<textElement textAlignment="Left" verticalAlignment="Middle">
+						<font size="14" isBold="true"/>
+					</textElement>
+					<textFieldExpression><![CDATA["Prüfungen nach dem "+$F{Semester der Prüfung}]]></textFieldExpression>
+				</textField>
+			</band>
+		</groupHeader>
+		<groupFooter>
+			<band height="50"/>
+		</groupFooter>
+	</group>
+	<detail>
+		<band height="15" splitType="Stretch">
+			<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.spreadsheet.SpreadsheetLayout"/>
+			<property name="com.jaspersoft.studio.unit.height" value="px"/>
+			<textField textAdjust="StretchHeight" isBlankWhenNull="true">
+				<reportElement stretchType="ContainerHeight" x="0" y="0" width="51" height="15" uuid="ab1dcbe4-f124-430c-9831-e3a1aba7e82d">
+					<property name="com.jaspersoft.studio.unit.x" value="px"/>
+				</reportElement>
+				<box>
+					<topPen lineWidth="0.5"/>
+					<leftPen lineWidth="0.5"/>
+					<bottomPen lineWidth="0.5"/>
+					<rightPen lineWidth="0.5"/>
+				</box>
+				<textElement textAlignment="Left" verticalAlignment="Middle"/>
+				<textFieldExpression><![CDATA[$F{pnr}]]></textFieldExpression>
+				<patternExpression><![CDATA[]]></patternExpression>
+			</textField>
+			<textField textAdjust="StretchHeight" isBlankWhenNull="true">
+				<reportElement stretchType="ContainerHeight" x="51" y="0" width="307" height="15" uuid="e0421889-bb9a-4324-bcf3-edc738d36828">
+					<property name="com.jaspersoft.studio.unit.x" value="px"/>
+				</reportElement>
+				<box>
+					<topPen lineWidth="0.5"/>
+					<leftPen lineWidth="0.5"/>
+					<bottomPen lineWidth="0.5"/>
+					<rightPen lineWidth="0.5"/>
+				</box>
+				<textElement textAlignment="Left" verticalAlignment="Middle"/>
+				<textFieldExpression><![CDATA[$F{Name der Prüfung}]]></textFieldExpression>
+				<patternExpression><![CDATA[]]></patternExpression>
+			</textField>
+			<textField textAdjust="StretchHeight" isBlankWhenNull="true">
+				<reportElement stretchType="ContainerHeight" x="358" y="0" width="77" height="15" uuid="6fcce53f-6e5b-43f5-bee1-74ca78fda172"/>
+				<box>
+					<topPen lineWidth="0.5"/>
+					<leftPen lineWidth="0.5"/>
+					<bottomPen lineWidth="0.5"/>
+					<rightPen lineWidth="0.5"/>
+				</box>
+				<textElement textAlignment="Right" verticalAlignment="Middle"/>
+				<textFieldExpression><![CDATA[$F{Teilnehmer}]]></textFieldExpression>
+				<patternExpression><![CDATA["#,##0"]]></patternExpression>
+			</textField>
+			<textField textAdjust="StretchHeight" isBlankWhenNull="true">
+				<reportElement stretchType="ContainerHeight" x="435" y="0" width="128" height="15" uuid="74f016aa-b70a-44c5-97c7-4a2c458ad6d7"/>
+				<box>
+					<topPen lineWidth="0.5"/>
+					<leftPen lineWidth="0.5"/>
+					<bottomPen lineWidth="0.5"/>
+					<rightPen lineWidth="0.5"/>
+				</box>
+				<textElement textAlignment="Right" verticalAlignment="Middle"/>
+				<textFieldExpression><![CDATA[$F{Durchschnittsnote *}]]></textFieldExpression>
+				<patternExpression><![CDATA["#,##0.00;-#,##0.00"]]></patternExpression>
+			</textField>
+			<textField textAdjust="StretchHeight" isBlankWhenNull="true">
+				<reportElement stretchType="ContainerHeight" x="563" y="0" width="128" height="15" uuid="e02a56f9-bdf2-4ca3-8933-73cded7631de">
+					<property name="com.jaspersoft.studio.unit.height" value="px"/>
+				</reportElement>
+				<box>
+					<topPen lineWidth="0.5"/>
+					<leftPen lineWidth="0.5"/>
+					<bottomPen lineWidth="0.5"/>
+					<rightPen lineWidth="0.5"/>
+				</box>
+				<textElement textAlignment="Right" verticalAlignment="Middle"/>
+				<textFieldExpression><![CDATA[$F{Durchfallquote in % *}]]></textFieldExpression>
+				<patternExpression><![CDATA["#,##0.00;-#,##0.00"]]></patternExpression>
+			</textField>
+			<textField textAdjust="StretchHeight" isBlankWhenNull="true">
+				<reportElement stretchType="ContainerHeight" x="691" y="0" width="127" height="15" uuid="39488aeb-b9b9-4656-8e15-f7f00b5f02ea">
+					<property name="com.jaspersoft.studio.unit.height" value="px"/>
+				</reportElement>
+				<box>
+					<topPen lineWidth="0.5"/>
+					<leftPen lineWidth="0.5"/>
+					<bottomPen lineWidth="0.5"/>
+					<rightPen lineWidth="0.5"/>
+				</box>
+				<textElement textAlignment="Right" verticalAlignment="Middle"/>
+				<textFieldExpression><![CDATA[$F{Nicht erschienen}]]></textFieldExpression>
+				<patternExpression><![CDATA["#,##0"]]></patternExpression>
+			</textField>
+		</band>
+	</detail>
+</jasperReport>