diff --git a/src-modules/module/sxc/conf/sxc.xml b/src-modules/module/sxc/conf/sxc.xml
index 210ceb9..adabd96 100644
--- a/src-modules/module/sxc/conf/sxc.xml
+++ b/src-modules/module/sxc/conf/sxc.xml
@@ -607,17 +607,18 @@ rightname="CS_BIA_STANDARDREPORTS_ADMIN[SXC]" />
-
-
-
-
-
-
-
-
-
-
-
+
+z.B. 2025= WiSe 2024/2025 und SoSe 2025
+Studierende (Köpfe) im jew. WiSe, nur Status "rückgemeldet", Stichtag amtl. Statistik, Hörerstatus alle
+Zugang Studierende (Erst- und Neueinschreiber) im WiSe und SoSe
+Zugang Studierende (Nur Ersteinschreiber) im WiSe und SoSe
+Studierende, die im Folgesemester nicht mehr eingeschrieben sind (Kopfzählung, d.h. egal in welchem Studiengang)
+ (Kopfzählung, d.h. egal in welchem Studiengang)
+ (Kopfzählung, d.h. egal in welchem Studiengang)
+ (Kopfzählung, d.h. egal in welchem Studiengang)
+Hauptprüfung, und im Folgesem. eingeschrieben
+(Anfangsbestand + Zugang - Abgang)
+Datum der Berechnung
@@ -1239,7 +1240,7 @@ parent="SuperX-Connect">Abfragen zur Administration von SuperX-Connect
$SXC_PFAD/masken
-
+
$SXC_PFAD/masken
@@ -1498,6 +1499,7 @@ is_custom SMALLINT
+
diff --git a/src-modules/module/sxc/hilfstabellen/sxc_stud_jahr_zugang_abgang_fuellen.sql b/src-modules/module/sxc/hilfstabellen/sxc_stud_jahr_zugang_abgang_fuellen.sql
index 6840cbf..1e093dc 100644
--- a/src-modules/module/sxc/hilfstabellen/sxc_stud_jahr_zugang_abgang_fuellen.sql
+++ b/src-modules/module/sxc/hilfstabellen/sxc_stud_jahr_zugang_abgang_fuellen.sql
@@ -1,367 +1,215 @@
-
--- =====================================================================
--- 1) METADATEN NUR EINMAL HOLEN
--- =====================================================================
+--Freemarker Template
+<#include "SQL_lingua_franca"/>
+<#include "SuperX_general"/>
+--dies ist auch das select_stmt der Maske 47200
+--Autor D. Quathamer 2026
+<#assign inEtl=true />
+<#if Maskennummer?exists && Maskennummer=47200>
+<#assign inEtl=false />
+#if>
+
+<#assign semester_filter ="1=1
+/* and A.sem_rueck_beur_ein >= <> */
+/* and A.sem_rueck_beur_ein <= <> */
+" />
+
+<#if inEtl>
+<#assign filter="studiengang_nr=1
+and fach_nr=1
+and A.stichtag=(select tid from sos_stichtag where stichtagsart='Studierende' and appl_key='1')" />
+<#else>
+<#assign filter="1=1
+/* and A.stichtag = <> */
+/* and <> */
+/* and <>*/
+/* and geschlecht = <> */
+/* and fach_sem_zahl <= <> */
+/* and substring('' || sem_rueck_beur_ein from 5 for 1)='<>' */
+/* and matrikel_nr=<> */
+" />
+
+<#assign filter= filter + " and " + semester_filter />
+
+
+<#assign filter = filter + " and 's_' || tid_stg in "+Studiengang.allNeededKeysList />
+/* <#assign filter = filter + " and '' || ca12_staat in "+Staatsangehörigkeit.allNeededKeysList /> --<> */
+/* <#assign filter = filter + " and stg in "+Fächer.allNeededKeysList /> --<> */
+/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.abschluss in "+Abschluss.allNeededKeysList +")" /> --<> */
+
+#if>
create temp table tmp_meta as
select
- (select hs_nr from hochschulinfo) as hs_nr,
- (select name from hochschulinfo) as hochschulinfo_name,
+ lpad('' || H.hs_nr,4,'0') as hs_nr,
+ H.name as hochschulinfo_name,
(select datum from systeminfo where tid=7) as datenstand,
(select version from db_version where his_system='sxc') as sxc_version,
- 'SuperX'::varchar(50) as dwh_name
-;
-
--- =====================================================================
--- 2) SCHLANKE BASISMENGE
--- Nur die Spalten, die für diesen Bericht wirklich gebraucht werden.
--- Das spart I/O, Temp-Speicher und Join-Kosten.
--- =====================================================================
-create temp table tmp_basis as
-select
- S.tid_stg,
- D.stg as dim_studiengang_stg,
- D.abschluss as dim_studiengang_abschluss,
- S.matrikel_nr,
- S.sem_rueck_beur_ein,
- S.sem_rueck_beur_ein_max,
- S.kz_rueck_beur_ein,
- S.summe
-from semester E, sos_stichtag I, sos_stg_aggr S
-left outer join dim_studiengang D
- on D.tid = S.tid_stg
-where E.tid=S.sem_rueck_beur_ein
-and E.sem_ende < today() --nicht im akt. Semester berechnen
-and studiengang_nr=1
-and fach_nr=1
-and I.tid=S.stichtag
-and I.appl_key='1' --Amtl. Statistik
+ (case when K.apnr=1 then 'HISinOne-BI' else 'SuperX' end)::varchar(50) as dwh_name
+ from hochschulinfo H, konstanten K
+ where K.beschreibung='PLATTFORM'
;
-create index ix_tmp_basis_matr_sem on tmp_basis(matrikel_nr, sem_rueck_beur_ein);
-create index ix_tmp_basis_matr_semmax on tmp_basis(matrikel_nr, sem_rueck_beur_ein_max);
-create index ix_tmp_basis_matr_stg_abs on tmp_basis(matrikel_nr, dim_studiengang_stg, dim_studiengang_abschluss);
-create index ix_tmp_basis_jahr on tmp_basis(sem_rueck_beur_ein);
-
--- optional, falls in eurer DB sinnvoll:
--- analyze tmp_basis;
-
--- =====================================================================
--- 3) VORBERECHNUNG "FOLGESEMESTER VORHANDEN?"
--- Statt EXISTS/NOT EXISTS pro Zeile.
--- Es reicht, vorhandene Kombinationen aus Matrikelnummer + Semester
--- einmal vorzuhalten.
---
--- Für die Prüfung auf das Folgesemester reicht der Bereich bis ein
--- Semester über dem Berichtsende hinaus.
--- =====================================================================
-create temp table tmp_sem_exists as
-select distinct
- matrikel_nr,
- sem_rueck_beur_ein
-from semester E, sos_stichtag I, sos_stg_aggr S
-where E.tid=S.sem_rueck_beur_ein
-and E.sem_ende < today() --nicht im akt. Semester berechnen
-and I.tid=S.stichtag
-and I.appl_key='1' --Amtl. Statistik
-;
-
-create index ix_tmp_sem_exists on tmp_sem_exists(matrikel_nr, sem_rueck_beur_ein);
-
--- optional:
--- analyze tmp_sem_exists;
-
--- =====================================================================
--- 4) VORBERECHNUNG "HAUPTPRÜFUNG VORHANDEN?"
--- Statt EXISTS pro Zeile.
--- Gleiche Fachlogik wie bisher:
--- match auf Matrikelnummer + Studiengang + Abschluss.
--- =====================================================================
-create temp table tmp_hauptpr as
-select distinct
- L.matrikel_nr,
- L2.stg,
- L2.abschluss
-from sos_lab_stg L
-join lehr_stg_ab L2
- on L2.tid = L.tid_stg
-join sos_stichtag I
- on I.tid = L.stichtag
-where I.appl_key='2'
- and L.pstatus='BE'
- and L.abschnitt=2
-;
-
-create index ix_tmp_hauptpr on tmp_hauptpr(matrikel_nr, stg, abschluss);
-
--- optional:
--- analyze tmp_hauptpr;
-
-
--- =====================================================================
--- 6) ARBEITSTABELLE tmp_stud
--- Alle teuren Prüfungen jetzt per Join statt per korrelierter Subquery.
--- =====================================================================
-create temp table tmp_stud as
-select
- M.hs_nr,
- M.hochschulinfo_name,
- 'Studienjahr'::varchar(255) as studienjahr_label,
- get_akad_jahr(B.sem_rueck_beur_ein,'P') as jahr,
- B.sem_rueck_beur_ein,
- B.matrikel_nr,
-
- case
- when substring('' || B.sem_rueck_beur_ein from 5 for 1)='2'
- and B.kz_rueck_beur_ein=3
- then B.summe
- else 0
- end as anfangsbestand,
-
- case
-
- when B.sem_rueck_beur_ein_max <= B.sem_rueck_beur_ein then 'nein'
- when add_sem(B.sem_rueck_beur_ein,1) = B.sem_rueck_beur_ein_max then 'ja'
- when S2.matrikel_nr is not null then 'ja'
- else 'nein'
- end as status_folgesem,
-
- case
- when H.matrikel_nr is not null then 1
- else 0
- end as hauptpruefung,
-
- case
- when B.kz_rueck_beur_ein in (1,2) then B.summe
- else 0
- end as zugang,
-
- case
- when B.kz_rueck_beur_ein in (1) then B.summe
- else 0
- end as zugang_ersteinschr,
-
- B.summe as summe,
-
- M.dwh_name,
- M.datenstand,
- M.sxc_version
-from tmp_basis B
-cross join tmp_meta M
-left join tmp_sem_exists S2
- on S2.matrikel_nr = B.matrikel_nr
- and S2.sem_rueck_beur_ein = add_sem(B.sem_rueck_beur_ein,1)
-left join tmp_hauptpr H
- on H.matrikel_nr = B.matrikel_nr
- and H.stg = B.dim_studiengang_stg
- and H.abschluss = B.dim_studiengang_abschluss
+create temp table tmp_sos_sos
+as select matrikel_nr,sem_rueck_beur_ein as sem_rueck_beur_ein_max
+from sos_sos
+where 1=1
+/* and matrikel_nr=<> */
;
-create index ix_tmp_stud_jahr on tmp_stud(jahr);
-create index ix_tmp_stud_matr_sem on tmp_stud(matrikel_nr, sem_rueck_beur_ein);
-create index ix_tmp_stud_status_hp on tmp_stud(status_folgesem, hauptpruefung);
-
--- optional:
--- analyze tmp_stud;
-
--- =====================================================================
--- 7) KOPFZÄHLUNG HAUPTPRÜFUNGEN JE SEMESTER
--- Jede Matrikelnummer kann im selben Semester nur einmal zählen.
--- In zwei verschiedenen Semestern desselben Studienjahres aber zweimal.
---
--- WICHTIG:
--- Für abgang_hauptpr / abgang_ohne_hauptpr wird hier sauber klassifiziert:
--- wenn eine Person im Semester irgendwo hauptpruefung=1 hat, zählt sie
--- als "mit Hauptprüfung" und nicht zusätzlich auch noch als "ohne".
--- =====================================================================
-create temp table tmp_stud_hauptpr_sem_kopf as
-select
- hs_nr,
- hochschulinfo_name,
- studienjahr_label,
- jahr,
- sem_rueck_beur_ein,
- matrikel_nr,
- dwh_name,
- datenstand,
- sxc_version,
-
- case
- when max(case when hauptpruefung=1 then 1 else 0 end) = 1
- then 1 else 0
- end as hauptpr_summe_kopf,
-
- case
- when max(case when hauptpruefung=1 then 1 else 0 end) = 1
- and max(case when status_folgesem='ja' then 1 else 0 end) = 1
- then 1 else 0
- end as hauptpr_bleibt_kopf,
-
- case
- when max(case when status_folgesem='nein' then 1 else 0 end) = 1
- and max(case when hauptpruefung=1 then 1 else 0 end) = 1
- then 1 else 0
- end as abgang_hauptpr_kopf,
-
- case
- when max(case when status_folgesem='nein' then 1 else 0 end) = 1
- and max(case when hauptpruefung=1 then 1 else 0 end) = 0
- then 1 else 0
- end as abgang_ohne_hauptpr_kopf
-
-from tmp_stud
-group by
- hs_nr,
- hochschulinfo_name,
- studienjahr_label,
- jahr,
- sem_rueck_beur_ein,
- matrikel_nr,
- dwh_name,
- datenstand,
- sxc_version
+create temp table tmp_sos_stud_astat as
+select
+dim_studiengang.tid as dim_studiengang_tid,
+A.sem_rueck_beur_ein as sem_rueck_beur_ein,
+get_akad_jahr(A.sem_rueck_beur_ein,'P') as jahr,
+A.kz_rueck_beur_ein as kz_rueck_beur_ein,
+A.summe as summe,
+A.matrikel_nr as matrikel_nr,
+O.sem_rueck_beur_ein_max,
+S.sem_beginn,
+S.sem_ende
+from semester S, tmp_sos_sos O,sos_stg_aggr A
+left outer join dim_studiengang on (dim_studiengang.tid=A.tid_stg)
+where O.matrikel_nr=A.matrikel_nr
+and S.tid=A.sem_rueck_beur_ein
+and A.studiengang_nr=1
+and A.fach_nr=1
+and ${filter}
;
-create index ix_tmp_stud_hauptpr_sem_kopf_jahr on tmp_stud_hauptpr_sem_kopf(jahr);
-create index ix_tmp_stud_hauptpr_sem_kopf_matr_sem on tmp_stud_hauptpr_sem_kopf(matrikel_nr, sem_rueck_beur_ein);
-
--- optional:
--- analyze tmp_stud_hauptpr_sem_kopf;
-
--- =====================================================================
--- 8) JAHRESAGGREGATION
--- Zugang/Abgang/Bestände aus tmp_stud
--- Hauptprüfungen aus der verdichteten Kopf-Tabelle
--- =====================================================================
-create temp table tmp_stud2 as
select
- basis.hs_nr,
- basis.hochschulinfo_name,
- basis.studienjahr_label,
- basis.jahr,
- null::integer as endbestand,
- basis.dwh_name,
- basis.datenstand,
- basis.sxc_version,
- basis.abgang,
- coalesce(hauptpr.abgang_hauptpr,0) as abgang_hauptpr,
- coalesce(hauptpr.abgang_ohne_hauptpr,0) as abgang_ohne_hauptpr,
- coalesce(hauptpr.hauptpr_summe,0) as hauptpr_summe,
- coalesce(hauptpr.hauptpr_bleibt,0) as hauptpr_bleibt,
- basis.anfangsbestand,
- basis.zugang,
- basis.zugang_ersteinschr,
- basis.summe,
- null::char(1) as dummycol
-from
-(
- select
- hs_nr,
- hochschulinfo_name,
- studienjahr_label,
- jahr,
- dwh_name,
- datenstand,
- sxc_version,
- sum(case when status_folgesem='nein' then summe else 0 end) as abgang,
- sum(anfangsbestand) as anfangsbestand,
- sum(zugang) as zugang,
- sum(zugang_ersteinschr) as zugang_ersteinschr,
- sum(summe) as summe
- from tmp_stud
- group by
- hs_nr,
- hochschulinfo_name,
- studienjahr_label,
- jahr,
- dwh_name,
- datenstand,
- sxc_version
-) basis
-left join
-(
- select
- hs_nr,
- hochschulinfo_name,
- studienjahr_label,
- jahr,
- dwh_name,
- datenstand,
- sxc_version,
- sum(abgang_hauptpr_kopf) as abgang_hauptpr,
- sum(abgang_ohne_hauptpr_kopf) as abgang_ohne_hauptpr,
- sum(hauptpr_summe_kopf) as hauptpr_summe,
- sum(hauptpr_bleibt_kopf) as hauptpr_bleibt
- from tmp_stud_hauptpr_sem_kopf
- group by
- hs_nr,
- hochschulinfo_name,
- studienjahr_label,
- jahr,
- dwh_name,
- datenstand,
- sxc_version
-) hauptpr
-on basis.hs_nr = hauptpr.hs_nr
-and basis.hochschulinfo_name = hauptpr.hochschulinfo_name
-and basis.studienjahr_label = hauptpr.studienjahr_label
-and basis.jahr = hauptpr.jahr
-and basis.dwh_name = hauptpr.dwh_name
-and basis.datenstand = hauptpr.datenstand
-and basis.sxc_version = hauptpr.sxc_version
-;
+ --zuerst die Basisdaten:
+T.jahr,
+case when substring('' || T.sem_rueck_beur_ein from 5 for 1)='2' and kz_rueck_beur_ein=3 then summe else 0 end as anfangsbestand,
+--status Folgesemester:
+(case when sem_beginn <= current_date and sem_ende >= current_date then ''
+when sem_rueck_beur_ein_max = sem_rueck_beur_ein then 'nein'
+when add_sem(T.sem_rueck_beur_ein,1) = T.sem_rueck_beur_ein_max then 'ja'
+when exists
+(select S2.matrikel_nr from sos_stg_aggr S2 where S2.matrikel_nr=T.matrikel_nr
+and S2.sem_rueck_beur_ein=add_sem(T.sem_rueck_beur_ein,1)) then 'ja'
+when not exists
+(select S2.matrikel_nr from sos_stg_aggr S2 where S2.matrikel_nr=T.matrikel_nr
+and S2.sem_rueck_beur_ein=add_sem(T.sem_rueck_beur_ein,1)) then 'nein'
+else '' end)::varchar(50) as status_folgesem,
+(case when exists (select L.matrikel_nr
+from sos_lab_stg L, sos_stichtag I
+where L.stichtag=I.tid
+and I.appl_key='2'
+and L.matrikel_nr=T.matrikel_nr
+--and L2.stg=tmp_sos_stud_astat.dim_studiengang_stg
+--and L2.abschluss=tmp_sos_stud_astat.dim_studiengang_abschluss
+and L.sem_d_abg_pruefung <= T.sem_rueck_beur_ein
+and L.pstatus='BE'
+and L.abschnitt=2) then 1 else 0 end) as hauptpruefung,
+case when T.kz_rueck_beur_ein in (1,2) then T.summe else 0 end as zugang,
+case when T.kz_rueck_beur_ein in (1) then T.summe else 0 end as zugang_ersteinschr,
+0::integer as abgang,
+T.summe as summe,
+ 0::integer as abgang_hauptpr,
+ 0::integer as abgang_ohne_hauptpr,
+ 0::integer as hauptpr_summe,
+ 0::integer as hauptpr_bleibt,
+ null::integer as endbestand
+ into temp tmp_stud
+ from tmp_sos_stud_astat T
+ where 1=1
+ ;
+-- select * from tmp_stud;
+
+update tmp_stud set abgang=summe where status_folgesem='nein';
+update tmp_stud set abgang_hauptpr=summe where status_folgesem='nein' and hauptpruefung=1;
+update tmp_stud set abgang_ohne_hauptpr=summe where status_folgesem='nein' and hauptpruefung=0;
+update tmp_stud set hauptpr_summe=summe where hauptpruefung=1;
+update tmp_stud set hauptpr_bleibt=summe where hauptpruefung=1 and status_folgesem='ja';
+
+ --ergebnistabelle:
+ select
+ --zuerst die nicht-Aggregate:
+ jahr,
+ null::integer as endbestand,
+ --dann die Aggregate:
+ sum(abgang) as abgang,
+ sum(abgang_hauptpr) as abgang_hauptpr,
+ sum(abgang_ohne_hauptpr) as abgang_ohne_hauptpr,
+ sum(hauptpr_summe) as hauptpr_summe,
+ sum(hauptpr_bleibt) as hauptpr_bleibt,
+ sum(anfangsbestand) as anfangsbestand,
+ sum(zugang) as zugang,
+ sum(zugang_ersteinschr) as zugang_ersteinschr,
+ sum(summe) as summe,
+ null::char(1) as dummycol
+ into temp tmp_stud2
+ from tmp_stud
+ where 1=1
+ group by
+ 1,2
+ ;
+update tmp_stud2 set endbestand= anfangsbestand+zugang-abgang;
+
+drop table if exists tmp_sos_stud_astat;
+drop table if exists tmp_stud;
+drop table if exists tmp_sos_sos;
-update tmp_stud2
-set endbestand = anfangsbestand + zugang - abgang
-;
+<#if inEtl>
--- =====================================================================
--- 9) AUSGABE
--- =====================================================================
-select
- hs_nr as hs_nr,
- hochschulinfo_name as hochschulinfo_name,
- studienjahr_label as studienjahr_label,
- jahr as jahr,
- anfangsbestand as anfangsbestand,
- zugang as zugang,
- zugang_ersteinschr as zugang_ersteinschr,
- abgang,
- abgang_hauptpr,
- abgang_ohne_hauptpr,
- hauptpr_summe,
- hauptpr_bleibt,
- endbestand,
- dwh_name as dwh_name,
- datenstand as datenstand,
- sxc_version as sxc_version
-from tmp_stud2
-order by
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16
+delete from sxc_stud_zugang_abgang_aggr
+where hs_nr in (select distinct M.hs_nr::varchar(255)
+from tmp_meta M)
;
--- =====================================================================
--- 10) AUFRÄUMEN
--- =====================================================================
-drop table if exists tmp_stud2;
-drop table if exists tmp_stud_hauptpr_sem_kopf;
-drop table if exists tmp_stud;
-drop table if exists tmp_hauptpr;
-drop table if exists tmp_sem_exists;
-drop table if exists tmp_basis;
-drop table if exists tmp_meta;
-drop table if exists tmp_stud3;
+insert into sxc_stud_zugang_abgang_aggr(
+ hs_nr,
+ jahr,
+ anfangsbestand,
+ zugang,
+ zugang_ersteinschr,
+ abgang,
+ abgang_hauptpr,
+ abgang_ohne_hauptpr,
+ hauptpr_summe,
+ hauptpr_bleibt,
+ endbestand,
+ datenstand)
+ select
+M.hs_nr,
+jahr,
+anfangsbestand,
+zugang,
+zugang_ersteinschr,
+abgang,
+abgang_hauptpr,
+abgang_ohne_hauptpr,
+hauptpr_summe,
+hauptpr_bleibt,
+endbestand,
+M.datenstand
+ from tmp_stud2, tmp_meta M
+ ;
+
+drop table tmp_meta;
+drop table tmp_stud2;
+
+<#else>
+--in Maske
+ select
+M.hs_nr::varchar(255) as hs_nr,
+M.hochschulinfo_name,
+'Studienjahr' as studienjahr_label,
+'' || jahr as jahr,
+anfangsbestand,
+zugang,
+zugang_ersteinschr,
+abgang,
+abgang_hauptpr,
+abgang_ohne_hauptpr,
+hauptpr_summe,
+hauptpr_bleibt,
+endbestand,
+M.dwh_name,
+M.datenstand,
+M.sxc_version
+ from tmp_stud2, tmp_meta M
+ order by 1,2,3,4,5,6,7,8,9,10,11,12,13,14
+ ;
+
+ #if>
+
diff --git a/src-modules/module/sxc/masken/47200_felderinfo.unl b/src-modules/module/sxc/masken/47200_felderinfo.unl
index 617286a..79fde52 100644
--- a/src-modules/module/sxc/masken/47200_felderinfo.unl
+++ b/src-modules/module/sxc/masken/47200_felderinfo.unl
@@ -17,7 +17,7 @@ and sem_beginn < today() order by tid DESC limit 1;^
47210^Semester^100^0^0^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by tid DESC;^hidden^ ^
47211^Stichtag^23^330^-1^130^100^1^sql^30^1^1^<> select tid, name from sos_stichtag where stichtagsart='Studierende';^ ^<> select tid, name from sos_stichtag where stichtagsart='Studierende' and appl_key='1';^
47213^Jahr^110^0^0^140^80^1^integer^30^0^13^^ ^ ^
-47214^Filter Studierende^100^0^0^140^150^1^sql^20^0^1^<> 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;^ ^ ^
+47214^Filter Studierende^100^0^0^140^150^1^sql^20^0^1^<> 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;^hidden^ ^
47216^Matrikel-Nr.^35^350^-1^140^80^1^integer^30^0^0^^ ^ ^
47218^Köpfe oder Fälle ?^0^0^0^140^150^1^sql^70^0^1^<> select apnr, eintrag from koepfe_oder_faelle order by 2^hidden^<> select apnr, eintrag from koepfe_oder_faelle where eintrag = 'Köpfe';^
47219^tablestylesheet^1500^0^0^100^100^1^char^255^0^1^<> select filename,caption from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id=47140 order by ord^hidden^<> select filename,caption from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id=47140 order by ord limit 1^
diff --git a/src-modules/module/sxc/masken/47200_maskeninfo.unl b/src-modules/module/sxc/masken/47200_maskeninfo.unl
index fd950a9..99a097a 100644
--- a/src-modules/module/sxc/masken/47200_maskeninfo.unl
+++ b/src-modules/module/sxc/masken/47200_maskeninfo.unl
@@ -1,14 +1,21 @@
47200^Studierendenströme Hochschulvergleich (intern)^--Freemarker Template\
<#include "SQL_lingua_franca"/>\
<#include "SuperX_general"/>\
---\
+--dies ist auch das select_stmt der Maske 47200\
--Autor D. Quathamer 2026\
+<#assign inEtl=true />\
+<#if Maskennummer?exists && Maskennummer=47200>\
+<#assign inEtl=false />\
+#if>\
\
<#assign semester_filter ="1=1\
/* and A.sem_rueck_beur_ein >= <> */\
/* and A.sem_rueck_beur_ein <= <> */\
" />\
\
+<#if inEtl>\
+<#assign filter="1=1" />\
+<#else>\
<#assign filter="1=1\
/* and A.stichtag = <> */\
/* and <> */\
@@ -16,7 +23,6 @@
/* and geschlecht = <> */\
/* and fach_sem_zahl <= <> */\
/* and substring('' || sem_rueck_beur_ein from 5 for 1)='<>' */\
-/* and ${<>} */\
/* and matrikel_nr=<> */\
" />\
\
@@ -28,6 +34,7 @@
/* <#assign filter = filter + " and stg in "+Fächer.allNeededKeysList /> --<> */\
/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.abschluss in "+Abschluss.allNeededKeysList +")" /> --<> */\
\
+#if>\
create temp table tmp_meta as\
select\
H.hs_nr,\
@@ -139,7 +146,48 @@ update tmp_stud2 set endbestand= anfangsbestand+zugang-abgang;\
drop table if exists tmp_sos_stud_astat;\
drop table if exists tmp_stud;\
drop table if exists tmp_sos_sos;\
- \
+\
+<#if inEtl>\
+\
+delete from sxc_stud_zugang_abgang_aggr\
+where hs_nr in (select distinct M.hs_nr::varchar(255)\
+from tmp_meta M)\
+;\
+\
+insert into sxc_stud_zugang_abgang_aggr(\
+ hs_nr,\
+ jahr,\
+ anfangsbestand,\
+ zugang,\
+ zugang_ersteinschr,\
+ abgang,\
+ abgang_hauptpr,\
+ abgang_ohne_hauptpr,\
+ hauptpr_summe,\
+ hauptpr_bleibt,\
+ endbestand,\
+ datenstand)\
+ select \
+M.hs_nr,\
+jahr,\
+anfangsbestand,\
+zugang,\
+zugang_ersteinschr,\
+abgang,\
+abgang_hauptpr,\
+abgang_ohne_hauptpr,\
+hauptpr_summe,\
+hauptpr_bleibt,\
+endbestand,\
+M.datenstand\
+ from tmp_stud2, tmp_meta M\
+ ;\
+ \
+drop table tmp_meta;\
+drop table tmp_stud2;\
+\
+<#else>\
+--in Maske\
select \
M.hs_nr::varchar(255) as hs_nr,\
M.hochschulinfo_name,\
@@ -159,7 +207,9 @@ M.datenstand,\
M.sxc_version\
from tmp_stud2, tmp_meta M\
order by 1,2,3,4,5,6,7,8,9,10,11,12,13,14\
- ;^XIL List\
+ ;\
+ \
+ #if>^XIL List\
sizable_columns horizontal_scrolling\
drop_and_delete movable_columns \
white_space_color=COLOR_WHITE fixed_columns=1\
diff --git a/src-modules/module/sxc/masken/47230_felderinfo.unl b/src-modules/module/sxc/masken/47230_felderinfo.unl
index 0a448bf..7f19288 100644
--- a/src-modules/module/sxc/masken/47230_felderinfo.unl
+++ b/src-modules/module/sxc/masken/47230_felderinfo.unl
@@ -1,43 +1,13 @@
-47230^Spaltenlayout^3000^350^-1^140^180^1^char^31^1^1^<>SELECT uniquename,\
- caption\
-FROM rpta_column_layout \
-where uniquename in ('sos_stud_zugang_abgang')\
-order by sortnr, caption\
- ;^ ^<>SELECT uniquename,\
- caption\
-FROM rpta_column_layout \
-where uniquename='sos_stud_zugang_abgang';^
-47231^Seit Semester^10^0^0^140^80^1^integer^30^0^1^<> select tid, eintrag from semester \
-where substring('' || tid from 5 for 1)='2' \
-and sem_beginn < today() order by tid DESC;^ ^<> select tid, eintrag from semester \
-where substring('' || tid from 5 for 1)='2' \
-and sem_beginn < (today()-(3*365)) order by tid DESC limit 1;^
-47232^Fächer^30^0^0^130^200^6^integer^1000^0^12^<> select tid,name,sortnr from sichten where art='Fächer-Sicht' order by 3,2;^ ^ ^
-47233^Abschluss^40^0^0^100^200^3^char^1500^0^12^<> select tid,name,sortnr from sichten where art='SOS-Abschluss-Sicht' order by 3,2;^ ^ ^
-47234^bis Fachsemester^1000^300^-1^200^100^1^integer^30^0^0^^ ^ ^
-47235^Semestertyp^22^350^-1^140^80^1^integer^255^0^1^<> select 1,'nur Sommersemester' from xdummy union select 2,'nur Wintersemester' from xdummy^hidden^ ^
-47236^Hochschulzugangsberechtigung^120^300^-1^200^200^1^sql^30^0^1^hs_zugangsber^ ^ ^
-47237^Bis Semester^20^350^-1^140^80^1^integer^30^0^1^<> select tid, eintrag from semester \
-where substring('' || tid from 5 for 1)='1' \
-and sem_beginn < today() order by tid DESC;^ ^<> select tid, eintrag from semester \
-where substring('' || tid from 5 for 1)='1' \
-and sem_beginn < today() order by tid DESC limit 1;^
-47238^Staatsangehörigkeit^150^0^0^140^150^10^char^30^0^12^<> select tid,name,sortnr from sichten where art='SOS-Staaten-Sicht' order by 3,2;^ ^ ^
-47239^Studiengang^25^0^0^140^150^50^char^1000^0^12^<> select tid,name,sortnr from sichten where art in ('SOS-Kostenstellen-Sicht', 'SOS-Studiengang-Sicht') order by 3,2;^ ^ ^
-47240^Semester^100^0^0^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by tid DESC;^hidden^ ^
-47241^Stichtag^23^330^-1^130^100^1^sql^30^1^1^<> select tid, name from sos_stichtag where stichtagsart='Studierende';^ ^<> select tid, name from sos_stichtag where stichtagsart='Studierende' and appl_key='1';^
-47243^Jahr^110^0^0^140^80^1^integer^30^0^13^^ ^ ^
-47244^Filter Studierende^100^0^0^140^150^1^sql^20^0^1^<> 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;^ ^ ^
-47245^Nur Endsemester^21^0^0^140^80^1^integer^30^0^1^<> select 1,'ja' from xdummy^hidden^ ^
-47246^Matrikel-Nr.^35^350^-1^140^80^1^char^30^0^13^^ ^ ^
-47247^Grafik^1000^300^-1^170^150^1^char^30^0^1^<> --freemarker template\
-<#if K_VIZ_ZEITR_SEM_ANZ?exists>select uniquename, caption from viz_chart where maskeninfo_id=47140 and chart_active=1 order by 2;\
+47230^Hochschule^1^0^0^150^200^5^char^30^0^1^<>select distinct apnr,kurztext from sxc_hochschulen_liste where apnr in (select distinct hs_nr from sxc_stud_zugang_abgang_aggr) order by 2^ ^<> select distinct apnr,kurztext from sxc_hochschulen_liste where apnr in (select distinct hs_nr from sxc_stud_zugang_abgang_aggr) order by 2 limit 1^
+47231^Jahr von^10^0^0^140^80^1^integer^30^0^0^where substring('' || tid from 5 for 1)='2' \
+and sem_beginn < today() order by tid DESC;^ ^<> select year(today())-5 from xdummy;^
+47232^tablestylesheet^1500^0^0^100^100^1^char^255^0^1^<> select filename,caption from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id=47230 order by ord^ ^<> select filename,caption from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id=47230 order by ord limit 1^
+47233^Grafik^1000^300^-1^170^150^1^char^30^0^1^<> --freemarker template\
+<#if K_VIZ_ZEITR_SEM_ANZ?exists>select uniquename, caption from viz_chart where maskeninfo_id=47230 and chart_active=1 order by 2;\
<#else>\
select 0,'Keine Visualisierungen verfügbar' from xdummy;\
#if>^ ^<>--freemarker template\
-<#if K_VIZ_ZEITR_SEM_ANZ?exists>select uniquename, caption from viz_chart where maskeninfo_id=47140 and chart_active=1 order by 2 limit 1;\
+<#if K_VIZ_ZEITR_SEM_ANZ?exists>select uniquename, caption from viz_chart where maskeninfo_id=47230 and chart_active=1 order by 2 limit 1;\
#if>^
-47248^Köpfe oder Fälle ?^0^0^0^140^150^1^sql^70^0^1^<> select apnr, eintrag from koepfe_oder_faelle order by 2^hidden^<> select apnr, eintrag from koepfe_oder_faelle where eintrag = 'Köpfe';^
-47249^tablestylesheet^1500^0^0^100^100^1^char^255^1^1^<> select filename,caption from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id=47140 order by ord^ ^<> select filename,caption from sx_stylesheets S, sx_mask_style M where S.tid=M.stylesheet_id and M.maskeninfo_id=47140 order by ord limit 1^
-47252^Geschlecht^110^0^0^140^80^1^integer^30^0^1^<> SELECT apnr,druck FROM cif where key = 9003 and apnr between 1 and 4 order by 1;^hidden^ ^
-47253^Vergleichshochschule^100^0^0^140^80^1^char^255^0^18^^ ^<> select '../edit/sxc/sxc_hochschule_vergleichsgruppe_list.jsp' from xdummy;^
+47234^Jahr bis^10^0^0^140^80^1^integer^30^0^0^where substring('' || tid from 5 for 1)='2' \
+and sem_beginn < today() order by tid DESC;^ ^<> select year(today())-1 from xdummy;^
diff --git a/src-modules/module/sxc/masken/47230_masken_felder_bez.unl b/src-modules/module/sxc/masken/47230_masken_felder_bez.unl
index 2c80910..2b3f301 100644
--- a/src-modules/module/sxc/masken/47230_masken_felder_bez.unl
+++ b/src-modules/module/sxc/masken/47230_masken_felder_bez.unl
@@ -3,19 +3,3 @@
47230^47232^
47230^47233^
47230^47234^
-47230^47235^
-47230^47236^
-47230^47237^
-47230^47238^
-47230^47239^
-47230^47240^
-47230^47241^
-47230^47243^
-47230^47244^
-47230^47245^
-47230^47246^
-47230^47247^
-47230^47248^
-47230^47249^
-47230^47252^
-47230^47253^
diff --git a/src-modules/module/sxc/masken/47230_maskeninfo.unl b/src-modules/module/sxc/masken/47230_maskeninfo.unl
index 2518451..c5ab4ab 100644
--- a/src-modules/module/sxc/masken/47230_maskeninfo.unl
+++ b/src-modules/module/sxc/masken/47230_maskeninfo.unl
@@ -1,248 +1,84 @@
-47230^Studierendenströme Hochschulvergleich (extern)^--Freemarker Template\
+47230^Studierendenströme Hochschulvergleich extern^--Freemarker Template\
<#include "SQL_lingua_franca"/>\
<#include "SuperX_general"/>\
---\
---Autor D. Quathamer 2024\
-\
->;]]>\
-\
-\
-\
-\
->;\
-\
-]]>\
->\
-/* and C.uniquename in (<>) */\
-order by CL.sortnr\
- ;\
-]]>\
-= <> */\
-/* and tid <= <> */\
-<#if "<>"="1" || "<>"="2">\
-and substring('' || tid from 5 for 1)='<>'\
-#if>\
-;\
-\
-]]>\
-\
-\
-\
-<#assign semester_filter ="1=1\
-/* and A.sem_rueck_beur_ein >= <> */\
-/* and A.sem_rueck_beur_ein <= <> */\
-" />\
-\
-<#assign filter="1=1\
-/* and A.stichtag = <> */\
-/* and <> */\
-/* and <>*/\
-/* and geschlecht = <> */\
-/* and fach_sem_zahl <= <> */\
-/* and substring('' || sem_rueck_beur_ein from 5 for 1)='<>' */\
-/* and ${<>} */\
+<#assign jahr_filter ="1=1\
+/* and A.jahr >= <> */\
+/* and A.jahr <= <> */\
" />\
\
-<#assign filter= filter + " and " + semester_filter />\
\
+<#assign filter="1=1" />\
+<#assign filter= filter + " and " + jahr_filter />\
\
-<#assign filter = filter + " and 's_' || tid_stg in "+Studiengang.allNeededKeysList /> \
-/* <#assign filter = filter + " and '' || ca12_staat in "+Staatsangehörigkeit.allNeededKeysList /> --<> */\
-/* <#assign filter = filter + " and stg in "+Fächer.allNeededKeysList /> --<> */\
-/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.abschluss in "+Abschluss.allNeededKeysList +")" /> --<> */\
\
-create temp table tmp_meta as\
-select\
- H.hs_nr,\
- H.name as hochschulinfo_name,\
- (select datum from systeminfo where tid=7) as datenstand,\
- (select version from db_version where his_system='sxc') as sxc_version,\
- (case when K.apnr=1 then 'HISinOne-BI' else 'SuperX' end)::varchar(50) as dwh_name\
- from hochschulinfo H, konstanten K\
- where K.beschreibung='PLATTFORM'\
-;\
-\
-\
-create temp table tmp_sos_stud_astat as\
+/* <#assign filter = filter + " and A.hs_nr in (<>) " /> */ \
select \
-dim_studiengang.tid as dim_studiengang_tid,\
-A.sem_rueck_beur_ein as sem_rueck_beur_ein,\
-get_akad_jahr(A.sem_rueck_beur_ein,'P') as jahr,\
-A.kz_rueck_beur_ein as kz_rueck_beur_ein,\
-A.summe as summe,\
-A.matrikel_nr as matrikel_nr,\
-O.sem_rueck_beur_ein as sem_rueck_beur_ein_max,\
-S.sem_beginn,\
-S.sem_ende\
-from semester S, sos_sos O,sos_stg_aggr A\
-left outer join dim_studiengang on (dim_studiengang.tid=A.tid_stg)\
-where O.matrikel_nr=A.matrikel_nr\
-and S.tid=A.sem_rueck_beur_ein\
-and A.studiengang_nr=1\
-and A.fach_nr=1\
+A.jahr,\
+H.name as hochschule,\
+A.anfangsbestand,\
+A.zugang,\
+case when A.anfangsbestand >0 then A.zugang::decimal(15,2) / A.anfangsbestand::decimal(15,2) * 100 else null::decimal(15,2) end as zugang_quote,\
+A.zugang_ersteinschr,\
+A.abgang,\
+A.abgang_hauptpr,\
+A.abgang_ohne_hauptpr,\
+case when A.anfangsbestand >0 then A.abgang_ohne_hauptpr::decimal(15,2) / A.anfangsbestand::decimal(15,2) * 100 else null::decimal(15,2) end as abgang_ohne_hauptpr_quote,\
+A.hauptpr_summe,\
+A.hauptpr_bleibt,\
+A.endbestand,\
+case when A.anfangsbestand >0 then A.endbestand::decimal(15,2) / A.anfangsbestand::decimal(15,2) * 100 else null::decimal(15,2) end as endbestand_quote --,\
+--A.datenstand\
+ from sxc_stud_zugang_abgang_aggr A, sxc_hochschulen H\
+where H.hs_nr=A.hs_nr\
and ${filter}\
-;\
-\
-select \
- --zuerst die Basisdaten:\
-T.jahr,\
-case when substring('' || T.sem_rueck_beur_ein from 5 for 1)='2' and kz_rueck_beur_ein=3 then summe else 0 end as anfangsbestand,\
---status Folgesemester:\
-(case when sem_beginn <= current_date and sem_ende >= current_date then '' \
-when sem_rueck_beur_ein_max = sem_rueck_beur_ein then 'nein'\
-when add_sem(T.sem_rueck_beur_ein,1) = T.sem_rueck_beur_ein_max then 'ja'\
-when exists \
-(select S2.matrikel_nr from sos_stg_aggr S2 where S2.matrikel_nr=T.matrikel_nr \
-and S2.sem_rueck_beur_ein=add_sem(T.sem_rueck_beur_ein,1)) then 'ja'\
-when not exists \
-(select S2.matrikel_nr from sos_stg_aggr S2 where S2.matrikel_nr=T.matrikel_nr \
-and S2.sem_rueck_beur_ein=add_sem(T.sem_rueck_beur_ein,1)) then 'nein'\
-else '' end)::varchar(50) as status_folgesem,\
-(case when exists (select L.matrikel_nr\
-from sos_lab_stg L, sos_stichtag I \
-where L.stichtag=I.tid \
-and I.appl_key='2' \
-and L.matrikel_nr=T.matrikel_nr \
---and L2.stg=tmp_sos_stud_astat.dim_studiengang_stg \
---and L2.abschluss=tmp_sos_stud_astat.dim_studiengang_abschluss \
-and L.sem_d_abg_pruefung <= T.sem_rueck_beur_ein\
-and L.pstatus='BE' \
-and L.abschnitt=2) then 1 else 0 end) as hauptpruefung,\
-case when T.kz_rueck_beur_ein in (1,2) then T.summe else 0 end as zugang,\
-case when T.kz_rueck_beur_ein in (1) then T.summe else 0 end as zugang_ersteinschr,\
-0::integer as abgang,\
-T.summe as summe,\
- 0::integer as abgang_hauptpr,\
- 0::integer as abgang_ohne_hauptpr,\
- 0::integer as hauptpr_summe,\
- 0::integer as hauptpr_bleibt,\
- null::integer as endbestand\
- into temp tmp_stud\
- from tmp_sos_stud_astat T\
- where 1=1 \
- ;\
--- select * from tmp_stud;\
- \
-update tmp_stud set abgang=summe where status_folgesem='nein';\
-update tmp_stud set abgang_hauptpr=summe where status_folgesem='nein' and hauptpruefung=1;\
-update tmp_stud set abgang_ohne_hauptpr=summe where status_folgesem='nein' and hauptpruefung=0;\
-update tmp_stud set hauptpr_summe=summe where hauptpruefung=1;\
-update tmp_stud set hauptpr_bleibt=summe where hauptpruefung=1 and status_folgesem='ja';\
-\
- --ergebnistabelle:\
- select \
- --zuerst die nicht-Aggregate:\
- jahr,\
- null::integer as endbestand,\
- --dann die Aggregate:\
- sum(abgang) as abgang,\
- sum(abgang_hauptpr) as abgang_hauptpr,\
- sum(abgang_ohne_hauptpr) as abgang_ohne_hauptpr,\
- sum(hauptpr_summe) as hauptpr_summe,\
- sum(hauptpr_bleibt) as hauptpr_bleibt,\
- sum(anfangsbestand) as anfangsbestand,\
- sum(zugang) as zugang,\
- sum(zugang_ersteinschr) as zugang_ersteinschr,\
- sum(summe) as summe,\
- null::char(1) as dummycol\
- into temp tmp_stud2\
- from tmp_stud\
- where 1=1\
- group by\
- 1,2\
- ;\
-update tmp_stud2 set endbestand= anfangsbestand+zugang-abgang;\
-\
-drop table if exists tmp_sos_stud_astat;\
-drop table if exists tmp_stud;\
- \
- select \
-M.hs_nr,\
-M.hochschulinfo_name,\
-'Studienjahr' as studienjahr_label,\
-jahr,\
-anfangsbestand,\
-zugang,\
-zugang_ersteinschr,\
-abgang,\
-abgang_hauptpr,\
-abgang_ohne_hauptpr,\
-hauptpr_summe,\
-hauptpr_bleibt,\
-endbestand,\
-M.dwh_name,\
-M.datenstand,\
-M.sxc_version\
- from tmp_stud2, tmp_meta M\
- order by 1,2,3,4,5,6,7,8,9,10,11,12,13,14\
- ;^select xil_proplist from maskeninfo where tid=48000^Studienfach^Anzahl bzw. Anteil^Studierende (Anfangsbestand, Zugang und Abgang) pro Hochschule und Studienjahr^drop table tmp_meta;\
-drop table tmp_stud2;^^2^850^540^^1^<>SELECT description FROM rpta_column_layout where uniquename=<>;^
+order by 1,2,3,4,5,6,7,8\
+ ;^XIL List\
+ sizable_columns horizontal_scrolling\
+ drop_and_delete movable_columns \
+ white_space_color=COLOR_WHITE fixed_columns=1\
+ min_heading_height=55\
+Column CID=0 heading_text="Jahr" center_heading explanation="(WS + darauffolgendes SS)"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Hochschule" center_heading explanation=""\
+ row_selectable heading_platform readonly\
+ width=10 text_size=60\
+Column CID=0 heading_text="Anfangsbestand" center_heading explanation="Studierende im WiSe"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Zugang" center_heading explanation="Studierende (Erst- und Neueinschreiber) im WiSe und SoSe"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Zugang Quote in %" center_heading explanation="Studierende (Ersteinschreiber) im WiSe und SoSe"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Zugang Ersteinschreibung" center_heading explanation="Studierende (Ersteinschreiber) im WiSe und SoSe"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Abgang" center_heading explanation="Exmatrikuliert"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Abgang mit Hauptpruefung" center_heading explanation="Hauptprüfung, im Folgesemester nicht eingeschrieben"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Abgang ohne Hauptpruefung" center_heading explanation="Keine Hauptprüfung, im Folgesemester nicht eingeschrieben"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Abgang ohne Hauptpruefung Quote in %" center_heading explanation="Studierende (Ersteinschreiber) im WiSe und SoSe"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Hauptpruefung gesamt" center_heading explanation="Hauptprüfung"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Hauptpruefung bleibt" center_heading explanation="Hauptprüfung, im Folgesem.- eingeschrieben"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Endbestand" center_heading explanation="Endbestand (Anfangsbestand + Zugang - Abgang)"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+Column CID=0 heading_text="Endbestand Quote in %" center_heading explanation="Studierende (Ersteinschreiber) im WiSe und SoSe"\
+ row_selectable heading_platform readonly\
+ width=5 text_size=60\
+@@@^Studienfach^Anzahl bzw. Anteil^Studierende (Anfangsbestand, Zugang und Abgang) pro Hochschule und Studienjahr^ ^^2^850^540^^1^ ^
diff --git a/src-modules/module/sxc/schluesseltabellen/etl_step_fuellen.sql b/src-modules/module/sxc/schluesseltabellen/etl_step_fuellen.sql
new file mode 100644
index 0000000..c131a83
--- /dev/null
+++ b/src-modules/module/sxc/schluesseltabellen/etl_step_fuellen.sql
@@ -0,0 +1,208 @@
+-- XML-generiertes SQL-Script fuer psql--von etl_step_fuellen.xsl
+
+create temp table tmp_etl_action_loadtable(
+ tid INTEGER,
+uniquename VARCHAR(255) ,
+caption VARCHAR(255) ,
+filepath VARCHAR(255) not null,
+target_table VARCHAR(255) not null,
+truncate_table SMALLINT ,
+with_header SMALLINT default 0 ,
+delimiter VARCHAR(10) default '^' ,
+systeminfo_id INTEGER not null,
+parent_step_uniquename varchar(255)
+
+)
+;
+
+
+create temp table tmp_etl_step(
+ tid INTEGER,
+uniquename VARCHAR(255) ,
+caption VARCHAR(255) ,
+systeminfo_id INTEGER not null,
+step_type SMALLINT not null,
+step_number SMALLINT not null,
+force_continue SMALLINT,
+etl_job_id INTEGER ,
+parent_etl_step_id INTEGER ,
+etl_action_loadtable_id INTEGER ,
+parent_step_uniquename varchar(255),
+parent_job_uniquename varchar(255),
+logfile varchar(255)
+
+)
+;
+
+create temp table tmp_etl_job(
+ tid INTEGER,
+uniquename VARCHAR(255) ,
+caption VARCHAR(255) ,
+systeminfo_id INTEGER not null,
+logfile varchar(255)
+)
+;
+
+
+insert into tmp_etl_job(uniquename,caption,systeminfo_id,logfile)
+values ('qa_main','Hauptladeroutine Qualitätssicherung',260,' L_qa_Update.log');
+
+delete from tmp_etl_job where 0!= (select count(*) from etl_job J where J.uniquename=tmp_etl_job.uniquename
+and J.systeminfo_id=tmp_etl_job.systeminfo_id);
+
+insert into etl_job(uniquename,caption,systeminfo_id)
+select uniquename,caption,systeminfo_id
+from tmp_etl_job;
+;
+
+--TIDs zurückschreiben:
+update tmp_etl_job set tid=(select S.tid from etl_job S
+where S.uniquename=tmp_etl_job.uniquename
+and S.systeminfo_id=260
+);
+
+--ETL-Schritt trans: Transformation
+
+insert into tmp_etl_step(
+uniquename ,
+caption ,
+systeminfo_id ,
+step_type,
+step_number,
+force_continue,
+etl_job_id ,
+--parent_etl_step_id ,
+--etl_action_loadtable_id ,
+parent_step_uniquename,
+parent_job_uniquename,
+logfile)
+select 'qa_trans',
+'Hauptladeroutine Qualitätssicherung Ladeschritt trans',
+260,
+1 as step_type,
+1 as step_number,
+0 as force_continue,
+J.tid as etl_job_id,
+'' as parent_step_uniquename,
+J.uniquename,
+'L_qa_Transformation.log' as logfile
+from etl_job J
+where J.uniquename='qa_main'
+and J.systeminfo_id=260;
+
+
+
+delete from etl_step
+where systeminfo_id=260
+and etl_job_id in (select distinct T.etl_job_id from tmp_etl_step T);
+
+insert into etl_step(uniquename ,
+caption ,
+systeminfo_id ,
+step_type,
+step_number,
+force_continue,
+etl_job_id
+--parent_etl_step_id ,
+--etl_action_loadtable_id
+)
+select uniquename ,
+caption ,
+systeminfo_id ,
+step_type,
+step_number,
+force_continue,
+etl_job_id
+from tmp_etl_step T
+where T.step_type=1;
+
+--TIDs zurückschreiben:
+update tmp_etl_step set tid=(select S.tid from etl_step S
+where S.uniquename=tmp_etl_step.uniquename
+and S.systeminfo_id=260
+) where step_type=1;
+
+
+insert into etl_step(uniquename ,
+caption ,
+systeminfo_id ,
+step_type,
+step_number,
+force_continue,
+etl_job_id
+--parent_etl_step_id ,
+--etl_action_loadtable_id
+)
+select uniquename ,
+caption ,
+systeminfo_id ,
+step_type,
+step_number,
+force_continue,
+etl_job_id
+from tmp_etl_step T
+where T.step_type=2;
+
+--TIDs zurückschreiben:
+update tmp_etl_step set tid=(select S.tid from etl_step S
+where S.uniquename=tmp_etl_step.uniquename
+and S.systeminfo_id=260
+) where step_type=2;
+
+
+--parent_step_id ermitteln:
+update tmp_etl_step set parent_etl_step_id=(select S.tid from etl_step S
+where S.uniquename=tmp_etl_step.parent_step_uniquename
+) where systeminfo_id=260
+and step_type=2;
+
+update etl_step set parent_etl_step_id=(select S.parent_etl_step_id from tmp_etl_step S
+where S.tid=etl_step.tid
+) where systeminfo_id=260
+and step_type=2;
+
+
+delete from etl_action_loadtable
+where systeminfo_id=260
+and uniquename in (select T.uniquename from etl_action_loadtable T);
+
+insert into etl_action_loadtable(uniquename ,
+caption ,
+filepath,
+target_table,
+truncate_table ,
+with_header ,
+delimiter ,
+systeminfo_id)
+select uniquename ,
+caption ,
+filepath,
+target_table,
+truncate_table ,
+with_header ,
+delimiter ,
+systeminfo_id
+from tmp_etl_action_loadtable;
+
+--TIDs zurückschreiben:
+update tmp_etl_action_loadtable set tid=(select S.tid from etl_action_loadtable S
+where S.uniquename=tmp_etl_action_loadtable.uniquename
+and S.systeminfo_id=260
+);
+
+--parent_step_id ermitteln:
+update etl_step set etl_action_loadtable_id=(select S.tid from tmp_etl_action_loadtable S
+where S.parent_step_uniquename=etl_step.uniquename
+) where systeminfo_id=260
+and step_type=2;
+
+update etl_step set logfile='L_' || trim(uniquename) || '.log'
+where logfile is null;
+update etl_job set logfile='L_' || trim(uniquename) || '.log'
+where logfile is null;
+
+drop table tmp_etl_action_loadtable;
+drop table tmp_etl_step;
+drop table tmp_etl_job;
+
+
diff --git a/src-modules/module/sxc/schluesseltabellen/studierende_zugang_abgang_hochschulvergleich.sql b/src-modules/module/sxc/schluesseltabellen/studierende_zugang_abgang_hochschulvergleich.sql
new file mode 100644
index 0000000..eeacfc7
--- /dev/null
+++ b/src-modules/module/sxc/schluesseltabellen/studierende_zugang_abgang_hochschulvergleich.sql
@@ -0,0 +1,463 @@
+--freemarker template
+--alle berechneten Spalten
+--aktuell noch nicht benötigt!
+
+
+
+select sp_table_exists('sxc_stud_zugang_abgang_aggr') from xdummy;
+
+
+select name
+ from sx_tables where name ='sxc_stud_zugang_abgang_aggr';
+
+
+
+
+
+
+
+select '(''tid_stg'',''sem_rueck_beur_ein'',''stichtag'',''geschlecht'', ''hzbart'',''hzbart_int'', ''hzbkfz'', ''hzbkfzkz'',''hrst'', ''ca12_staat'', ''fach_sem_zahl'',''hssem'',''studiengang_nr'', ''fach_nr'',''summe'')'
+from xdummy;
+
+
+select '(''fb'', ''abschluss_grp'', ''abschluss_grp_str'', ''fb_str'',''abschluss_astat_bund'')'
+from xdummy;
+
+
+
+select tid, table_name,
+ name,
+ name as targetname
+ from sx_fields where table_name ='${fact_table_source}'
+ and currentlyused=1
+ and name in ${fact_table_fields}
+ <#foreach added_table in added_tables>
+ union
+ select tid,table_name,
+ name,
+ '${added_table.prefix}' || name as targetname
+ from sx_fields where table_name ='${added_table.name}'
+ and currentlyused=1
+ and name in ${added_table_fields}
+ #foreach>
+ order by 1
+#if>
+]]>
+
+
+
+
+<#if sxc_stud_zugang_abgang_aggr_exists==1 && fact_table_source?exists >
+
+<#assign fact_table_target = {"name":"sos_stud_astat_dashboard", "caption":"Studierende (Fachsem., HS-Sem., Studiengang) Dashboard"}
+ />
+
+
+CREATE temp table tmp_tables(
+name CHAR(255) ,
+caption CHAR(255) ,
+description CHAR(255) ,
+table_type CHAR(255) ,
+systeminfo_id INTEGER ,
+systeminfo_orig INTEGER ,
+thema CHAR(255) ,
+sachgebiete_id CHAR(255)
+);
+CREATE temp TABLE tmp_fields(
+tid serial NOT NULL,
+table_name VARCHAR(255) not null,
+name VARCHAR(255) not null,
+caption VARCHAR(255) ,
+description VARCHAR(255) ,
+field_type VARCHAR(255) not null,
+field_size VARCHAR(255) ,
+field_not_null smallint,
+currentlyused SMALLINT ,
+is_primarykey SMALLINT default 0 ,
+foreignkey_tab VARCHAR(255) ,
+foreignkey_col VARCHAR(255) ,
+foreignkey_int VARCHAR(255) ,
+foreignkey_cap VARCHAR(255) ,
+foreignkey_cond VARCHAR(255) ,
+foreignkey_func VARCHAR(255) ,
+check_integrity SMALLINT,
+is_sum SMALLINT default 1,
+foreignkey_uniquename VARCHAR(255)
+
+);
+
+
+--Vorbereitung:
+UPDATE sx_tables
+ SET caption = 'Standorte'
+WHERE name='sos_k_stort';
+UPDATE sx_tables
+ SET caption = 'Studienart'
+WHERE name = 'sos_k_stuart';
+UPDATE sx_tables
+ SET caption = 'Studiumstyp'
+WHERE name = 'sos_k_stutyp';
+UPDATE sx_tables
+ SET caption = 'Studienform'
+WHERE name = 'sos_k_stufrm';
+UPDATE sx_tables
+ SET caption = 'Hörerstatus'
+WHERE name = 'sos_k_hrst';
+
+
+
+--drop view if exists sos_stud_astat;
+
+
+drop VIEW sos_k_stutyp;
+
+CREATE VIEW sos_k_stutyp
+(
+ apnr,
+ druck,
+ astat
+)
+AS
+ SELECT cifx.apnr,
+ cifx.druck,
+ astat
+ FROM cifx
+ WHERE cifx.key = 40;
+
+
+update sx_fields set
+ is_sum=0
+ where table_name='sxc_stud_zugang_abgang_aggr'
+ and name!='summe';
+update sx_fields set
+ is_sum=1
+ where table_name='sxc_stud_zugang_abgang_aggr'
+ and name='summe';
+
+
+insert into tmp_tables (
+name,
+caption,
+description,
+table_type,
+systeminfo_id,
+thema,
+sachgebiete_id
+)
+select
+'${fact_table_target.name}',
+'${fact_table_target.caption}',
+description,
+table_type,
+systeminfo_id,
+thema,
+sachgebiete_id
+from sx_tables where name='${fact_table_source}'
+;
+
+
+insert into tmp_fields (table_name,
+ name,
+ caption,
+ description,
+ field_type,
+ field_size,
+ field_not_null,
+ currentlyused,
+ is_primarykey,
+ foreignkey_tab,
+ foreignkey_col,
+ foreignkey_int,
+ foreignkey_cap,
+ foreignkey_cond,
+ foreignkey_func,
+ check_integrity,
+ is_sum,
+ foreignkey_uniquename)
+select '${fact_table_target.name}' as table_name,
+ name,
+ caption,
+ description,
+ field_type,
+ field_size,
+ field_not_null,
+ currentlyused,
+ is_primarykey,
+ foreignkey_tab,
+ foreignkey_col,
+ foreignkey_int,
+ foreignkey_cap,
+ foreignkey_cond,
+ foreignkey_func,
+ check_integrity,
+ is_sum,
+ foreignkey_uniquename
+ from sx_fields where table_name ='${fact_table_source}'
+ and name in ${fact_table_fields}
+ and currentlyused=1;
+<#foreach added_table in added_tables>
+insert into tmp_fields (table_name,
+ name,
+ caption,
+ description,
+ field_type,
+ field_size,
+ field_not_null,
+ currentlyused,
+ is_primarykey,
+ foreignkey_tab,
+ foreignkey_col,
+ foreignkey_int,
+ foreignkey_cap,
+ foreignkey_cond,
+ foreignkey_func,
+ check_integrity,
+ is_sum,
+ foreignkey_uniquename)
+select '${fact_table_target.name}' as table_name,
+ '${added_table.prefix}' || name,
+ '${added_table.caption}: ' || caption,
+ description,
+ field_type,
+ field_size,
+ field_not_null,
+ currentlyused,
+ is_primarykey,
+ foreignkey_tab,
+ foreignkey_col,
+ foreignkey_int,
+ foreignkey_cap,
+ foreignkey_cond,
+ foreignkey_func,
+ check_integrity,
+ is_sum,
+ foreignkey_uniquename
+ from sx_fields where table_name ='${added_table.name}'
+ and name in ${added_table_fields}
+ and currentlyused=1;
+#foreach>
+--und berechnete Spalten einfügen
+<#foreach logical_field in logical_fields>
+insert into tmp_fields (table_name,name,caption,description,field_type,field_size,field_not_null,currentlyUsed,is_sum)
+select
+'${logical_field.tablename}', '${logical_field.uniquename}','${logical_field.caption}', '${logical_field.description}', 'CHAR',30, 1, 1,0 from xdummy;
+#foreach>
+
+CREATE temp TABLE tmp_rpta_resultset
+(
+ caption varchar(255),
+ uniquename varchar(255),
+ fieldclause text,
+ joinclause text,
+ whereclause text,
+ systeminfo_id integer,
+ is_virtual smallint default 1
+);
+
+insert into tmp_rpta_resultset(caption,
+ uniquename,
+ systeminfo_id,
+ is_virtual)
+ select '${fact_table_target.caption}',
+ '${fact_table_target.name}',
+ 7,
+ 0
+;
+
+
+update tmp_rpta_resultset set fieldclause='
+<#foreach logical_field in logical_fields>
+${logical_field.log_field} as ${logical_field.uniquename},
+#foreach>
+
+<#foreach field_target in fields_target>
+${field_target.table_name}.${field_target.name} as ${field_target.targetname},
+#foreach>
+null::varchar as dummy',
+joinclause='${fact_table_source}
+<#foreach added_table in added_tables>
+left outer join ${added_table.name} on (${added_table.joinclause})
+#foreach>
+<#foreach logical_field in logical_fields>
+<#if logical_field.join_field?exists && logical_field.join_field !=''>
+left outer join ${logical_field.join_field}
+#if>
+#foreach>
+';
+
+--whereclause erstmal primitiv
+update tmp_rpta_resultset set whereclause = 'and stichtag in (select tid from sos_stichtag where appl_key=''0'') and hrst in (select apnr from sos_k_hrst HRST where HRST.astat in (''1'',''2'')) and kz_rueck_beur_ein in (1,2,3)';
+select * into temp tmp_rs1
+from rpta_resultset
+;
+
+update rpta_resultset set caption=T.caption,
+ fieldclause=T.fieldclause,
+ joinclause=T.joinclause,
+ whereclause=T.whereclause,
+ is_virtual=T.is_virtual
+ from tmp_rpta_resultset T
+ where T.systeminfo_id=rpta_resultset.systeminfo_id
+ and T.uniquename=rpta_resultset.uniquename
+ ;
+
+insert into rpta_resultset(caption,
+ uniquename,
+ fieldclause,
+ joinclause,
+ whereclause,
+ systeminfo_id,
+ is_virtual)
+select caption,
+ uniquename,
+ fieldclause,
+ joinclause,
+ whereclause,
+ systeminfo_id,
+ is_virtual
+ from tmp_rpta_resultset
+ where 0=(select count(*)
+ from tmp_rs1 T
+ where T.systeminfo_id=tmp_rpta_resultset.systeminfo_id
+ and T.uniquename=tmp_rpta_resultset.uniquename)
+ ;
+drop table tmp_rpta_resultset;
+drop table tmp_rs1;
+
+delete from sx_tables where name
+in (select T.name from tmp_tables T);
+
+insert into sx_tables (name,caption,description,table_type,systeminfo_id,systeminfo_orig,thema,sachgebiete_id)
+select name,caption,description,table_type,systeminfo_id,systeminfo_orig,thema,sachgebiete_id
+from tmp_tables;
+
+
+delete from sx_fields where table_name
+in (select T.table_name from tmp_fields T);
+
+insert into sx_fields (table_name,name,caption,description,field_type,
+field_size,
+field_not_null,
+currentlyUsed,
+foreignkey_tab,
+foreignkey_col,
+foreignkey_cap,
+foreignkey_int,
+foreignkey_cond,
+foreignkey_func,
+check_integrity,
+is_sum,
+foreignkey_uniquename
+)
+select
+F.table_name,F.name,F.caption,F.description,F.field_type,
+F.field_size,
+F.field_not_null,
+F.currentlyUsed,
+F.foreignkey_tab,
+F.foreignkey_col,
+F.foreignkey_cap,
+F.foreignkey_int,
+F.foreignkey_cond,
+F.foreignkey_func,
+F.check_integrity,
+F.is_sum,
+F.foreignkey_uniquename
+
+from tmp_fields F;
+
+
+drop table tmp_fields;
+drop table tmp_tables;
+
+
+--rpta_column füllen:
+select * into temp tmp_rc1
+from rpta_column;
+
+
+create temp table tmp_rpta_column(
+ uniquename varchar(255) NOT NULL,
+ caption varchar(255),
+ srcfieldname varchar(255),
+ column_type integer,
+ col_function text,
+ is_aggregate smallint,
+ resultset_id integer,
+ description text,
+ custom integer default 0
+ );
+
+insert into tmp_rpta_column( uniquename,
+ caption,
+ srcfieldname,
+ column_type,
+ col_function,
+ is_aggregate,
+ resultset_id,
+ description)
+ select F.name as uniquename,
+ coalesce(T.caption,T.name) || ' - ' || F.caption,
+ F.name as srcfieldname,
+ 1 as column_type,
+ (case when F.is_sum=1 then 'sum' else null::varchar end) as col_function,
+ (case when F.is_sum=1 then 1 else 0 end) as is_aggregate,
+ R.tid as resultset_id,
+ F.description
+from rpta_resultset R, sx_fields F left outer join sx_tables T on (T.name=F.table_name)
+where F.table_name='${fact_table_target.name}'
+and R.uniquename='${fact_table_target.name}'
+and F.currentlyused=1
+;
+
+update rpta_column set
+ caption=T.caption,
+ srcfieldname=T.srcfieldname,
+ column_type=T.column_type,
+ col_function=T.col_function,
+ is_aggregate=T.is_aggregate,
+ resultset_id=R.tid,
+ description=T.description,
+ custom=T.custom
+ from tmp_rpta_column T, rpta_resultset R
+where T.uniquename=rpta_column.uniquename
+and rpta_column.resultset_id=R.tid
+and R.uniquename='${fact_table_target.name}'
+;
+insert into rpta_column( uniquename,
+ caption,
+ srcfieldname,
+ column_type,
+ col_function,
+ is_aggregate,
+ resultset_id,
+ description,
+ custom)
+select T.uniquename,
+T.caption,
+T.srcfieldname,
+T.column_type,
+T.col_function,
+T.is_aggregate,
+R.tid as resultset_id,
+T.description,
+T.custom
+ from tmp_rpta_column T, rpta_resultset R
+ where R.uniquename='${fact_table_target.name}'
+ and 0=(select count(*) from tmp_rc1 C
+ where C.uniquename=T.uniquename
+ and C.resultset_id=R.tid)
+ ;
+
+drop table tmp_rpta_column;
+drop table tmp_rc1;
+
+#if> --wenn sxc_stud_zugang_abgang_aggr_exists=1
diff --git a/src-modules/module/sxc/schluesseltabellen/sx_stylesheets_einfuegen.sql b/src-modules/module/sxc/schluesseltabellen/sx_stylesheets_einfuegen.sql
index f62fe3f..6856d54 100755
--- a/src-modules/module/sxc/schluesseltabellen/sx_stylesheets_einfuegen.sql
+++ b/src-modules/module/sxc/schluesseltabellen/sx_stylesheets_einfuegen.sql
@@ -12,7 +12,9 @@ select sp_table_exists('viz_chart') from xdummy;
<#if viz_chart_exists==0>
<#assign masken = [
-{"mask":"47140", "filename":"tabelle_html.xsl", "ord":"10"}
+{"mask":"47140", "filename":"tabelle_html.xsl", "ord":"10"},
+{"mask":"47230", "filename":"tabelle_html.xsl", "ord":"10"}
+
] />
<#assign stylesheet = [
@@ -22,7 +24,9 @@ select sp_table_exists('viz_chart') from xdummy;
<#assign masken = [
{"mask":"47140", "filename":"tabelle_html.xsl", "ord":"10"},
-{"mask":"47140", "filename":"viz_html_chart_viewer.xsl", "ord":"20"}
+{"mask":"47140", "filename":"viz_html_chart_viewer.xsl", "ord":"20"},
+{"mask":"47230", "filename":"tabelle_html.xsl", "ord":"10"},
+{"mask":"47230", "filename":"viz_html_chart_viewer.xsl", "ord":"20"}
] />
<#assign stylesheet = [
diff --git a/src-modules/module/sxc/schluesseltabellen/viz_chart.unl b/src-modules/module/sxc/schluesseltabellen/viz_chart.unl
index 6b5f045..245775b 100644
--- a/src-modules/module/sxc/schluesseltabellen/viz_chart.unl
+++ b/src-modules/module/sxc/schluesseltabellen/viz_chart.unl
@@ -1,104 +1,39 @@
-138^echarts_line_y_sxc_stud_anteilfs1^Studienanfänger_innen in % (Hochschulvergleich)^ ^{"version":"0.2b","id":1,"name":"","renderer":"echarts","dataSources":[{"value":"0","nr":1,"name":"Tab. 1","isDefault":true}],\
-"targetDiv":"","chartElements":[{"elemID":"1","vizTypeUniquename":"echarts_line_y","caption":"echarts_line_y","datasource":"0","elementTypeProperties":[{"nr":"1","vizTypePropertyUniquename":"x","caption":"X-Achse","propertyValue":"sem_rueck_beur_ein_str","propertyType":"string"},\
-{"nr":"1","vizTypePropertyUniquename":"y","caption":"Y-Achse","propertyValue":"anteil","propertyType":"string"}]},\
-{"elemID":2,"vizTypeUniquename":"echarts_line_y","caption":"echarts_line_y","datasource":"0","elementTypeProperties":[{"nr":2,"vizTypePropertyUniquename":"x","caption":"X-Achse","propertyValue":"sem_rueck_beur_ein_str","propertyType":"string"},\
-{"nr":2,"vizTypePropertyUniquename":"y","caption":"Y-Achse","propertyValue":"sxc_stud_anteil_anf_vergleich1","propertyType":"string"}]},\
-{"elemID":3,"vizTypeUniquename":"echarts_line_y","caption":"echarts_line_y","datasource":"0","elementTypeProperties":[{"nr":3,"vizTypePropertyUniquename":"x","caption":"X-Achse","propertyValue":"sem_rueck_beur_ein_str","propertyType":"string"},\
-{"nr":3,"vizTypePropertyUniquename":"y","caption":"Y-Achse","propertyValue":"sxc_stud_anteil_anf_vergleich2","propertyType":"string"}]}],\
-"chartPropertiesUsed":[{"name":"caption","vizPropertyVariablename":"caption","propertyValue":"Studienanfänger_innen in % (Hochschulvergleich)"},\
-{"name":"x","vizPropertyVariablename":"x","propertyValue":"sem_rueck_beur_ein_str","propUnit":""},\
-{"name":"x","vizPropertyVariablename":"x","propertyValue":"sem_rueck_beur_ein_str","propUnit":""},\
-{"name":"y","vizPropertyVariablename":"y","propertyValue":"anteil","propUnit":""},\
-{"name":"y","vizPropertyVariablename":"y","propertyValue":"anteil","propUnit":""},\
+372^echarts_line_y_47230_2hsen^Studierendenströme Hochschulvergleich 2 Hochschulen^ ^{"version":"0.2b","id":1,"name":"","renderer":"echarts","dataSources":[{"value":"0","nr":1,"name":"Tab. 1","isDefault":true}],\
+"targetDiv":"","chartElements":[{"elemID":1,"vizTypeUniquename":"echarts_line_y","caption":"echarts_line_y","datasource":"0","elementTypeProperties":[{"nr":1,"vizTypePropertyUniquename":"x","caption":"X-Achse","propertyValue":"jahr","propertyType":"string"},\
+{"nr":1,"vizTypePropertyUniquename":"y","caption":"Y-Achse","propertyValue":"endbestand_quote","propertyType":"string"}]}],\
+"chartPropertiesUsed":[{"name":"caption","vizPropertyVariablename":"caption","propertyValue":"Studierendenströme Hochschulvergleich extern"},\
+{"name":"x","vizPropertyVariablename":"x","propertyValue":"jahr","propUnit":""},\
+{"name":"x","vizPropertyVariablename":"x","propertyValue":"jahr","propUnit":""},\
+{"name":"y","vizPropertyVariablename":"y","propertyValue":"endbestand_quote","propUnit":""},\
+{"name":"y","vizPropertyVariablename":"y","propertyValue":"endbestand_quote","propUnit":""},\
{"name":"title.left","vizPropertyVariablename":"title.left","propertyValue":"left","propUnit":""},\
-{"name":"title.top","vizPropertyVariablename":"title.top","propertyValue":"top","propUnit":""},\
-{"name":"legendShow","vizPropertyVariablename":"legendShow","propertyValue":"true","propUnit":""},\
-{"name":"legend.top","vizPropertyVariablename":"legend.top","propertyValue":"bottom","propUnit":""},\
-{"name":"legend.left","vizPropertyVariablename":"legend.left","propertyValue":"left","propUnit":""},\
-{"name":"legend.scroll","vizPropertyVariablename":"legend.scroll","propertyValue":"false","propUnit":""},\
-{"name":"margin.left","vizPropertyVariablename":"margin.left","propertyValue":"20","propUnit":"%"},\
-{"name":"margin.right","vizPropertyVariablename":"margin.right","propertyValue":"0","propUnit":"%"},\
-{"name":"margin.top","vizPropertyVariablename":"margin.top","propertyValue":"16","propUnit":"%"},\
-{"name":"margin.bottom","vizPropertyVariablename":"margin.bottom","propertyValue":"20","propUnit":"%"},\
-{"name":"xAxisNameLocation","vizPropertyVariablename":"xAxisNameLocation","propertyValue":"end","propUnit":""},\
-{"name":"tickRotate_x","vizPropertyVariablename":"tickRotate_x","propertyValue":"30","propUnit":""},\
-{"name":"tickRotate_x","vizPropertyVariablename":"tickRotate_x","propertyValue":"30","propUnit":""},\
-{"name":"width_x","vizPropertyVariablename":"width_x","propertyValue":"100","propUnit":"px"},\
-{"name":"padding_x","vizPropertyVariablename":"padding_x","propertyValue":"5","propUnit":""},\
-{"name":"yAxisName","vizPropertyVariablename":"yAxisName","propertyValue":"%","propUnit":""},\
-{"name":"padding_y","vizPropertyVariablename":"padding_y","propertyValue":"5","propUnit":""},\
-{"name":"width_y","vizPropertyVariablename":"width_y","propertyValue":"50","propUnit":"px"},\
-{"name":"position_y","vizPropertyVariablename":"position_y","propertyValue":"center","propUnit":""},\
-{"name":"valueLabelShow","vizPropertyVariablename":"valueLabelShow","propertyValue":"false","propUnit":""},\
-{"name":"distance_valueLabel","vizPropertyVariablename":"distance_valueLabel","propertyValue":"10","propUnit":""},\
-{"name":"position_valueLabel","vizPropertyVariablename":"position_valueLabel","propertyValue":"top","propUnit":""},\
-{"name":"schemeArray","vizPropertyVariablename":"schemeArray","propertyValue":"D3_Tableau10","propUnit":""},\
-{"name":"seriesColorBy","vizPropertyVariablename":"seriesColorBy","propertyValue":"series","propUnit":""},\
-{"name":"barStacked","vizPropertyVariablename":"barStacked","propertyValue":"false","propUnit":""}],\
-"dataTransformation":[]}^^^29.04.2026^29.04.2026^47140^^3^ ^^1^800^600^100^60^0^
-139^echarts_line_y_sxc_stud_sh1^Studienanfänger_innen 1. HS (Hochschulvergleich)^ ^{"version":"0.2b","id":1,"name":"","renderer":"echarts","dataSources":[{"value":"0","nr":1,"name":"Tab. 1","isDefault":true}],\
-"targetDiv":"","chartElements":[{"elemID":"1","vizTypeUniquename":"echarts_line_y","caption":"echarts_line_y","datasource":"0","elementTypeProperties":[{"nr":"1","vizTypePropertyUniquename":"x","caption":"X-Achse","propertyValue":"sem_rueck_beur_ein_str","propertyType":"string"},\
-{"nr":"1","vizTypePropertyUniquename":"y","caption":"Y-Achse","propertyValue":"summe_hs1","propertyType":"string"}]}],\
-"chartPropertiesUsed":[{"name":"caption","vizPropertyVariablename":"caption","propertyValue":"Studienanfänger_innen 1. HS (Hochschulvergleich)"},\
-{"name":"x","vizPropertyVariablename":"x","propertyValue":"sem_rueck_beur_ein_str","propUnit":""},\
-{"name":"x","vizPropertyVariablename":"x","propertyValue":"sem_rueck_beur_ein_str","propUnit":""},\
-{"name":"y","vizPropertyVariablename":"y","propertyValue":"summe_hs1","propUnit":""},\
-{"name":"y","vizPropertyVariablename":"y","propertyValue":"summe_hs1","propUnit":""},\
{"name":"title.left","vizPropertyVariablename":"title.left","propertyValue":"left","propUnit":""},\
{"name":"title.top","vizPropertyVariablename":"title.top","propertyValue":"top","propUnit":""},\
-{"name":"legendShow","vizPropertyVariablename":"legendShow","propertyValue":"true","propUnit":""},\
-{"name":"legend.top","vizPropertyVariablename":"legend.top","propertyValue":"bottom","propUnit":""},\
-{"name":"legend.left","vizPropertyVariablename":"legend.left","propertyValue":"left","propUnit":""},\
-{"name":"legend.scroll","vizPropertyVariablename":"legend.scroll","propertyValue":"false","propUnit":""},\
-{"name":"margin.left","vizPropertyVariablename":"margin.left","propertyValue":"20","propUnit":"%"},\
-{"name":"margin.right","vizPropertyVariablename":"margin.right","propertyValue":"0","propUnit":"%"},\
-{"name":"margin.top","vizPropertyVariablename":"margin.top","propertyValue":"16","propUnit":"%"},\
-{"name":"margin.bottom","vizPropertyVariablename":"margin.bottom","propertyValue":"20","propUnit":"%"},\
-{"name":"xAxisNameLocation","vizPropertyVariablename":"xAxisNameLocation","propertyValue":"end","propUnit":""},\
-{"name":"tickRotate_x","vizPropertyVariablename":"tickRotate_x","propertyValue":"30","propUnit":""},\
-{"name":"tickRotate_x","vizPropertyVariablename":"tickRotate_x","propertyValue":"30","propUnit":""},\
-{"name":"width_x","vizPropertyVariablename":"width_x","propertyValue":"100","propUnit":"px"},\
-{"name":"padding_x","vizPropertyVariablename":"padding_x","propertyValue":"5","propUnit":""},\
-{"name":"padding_y","vizPropertyVariablename":"padding_y","propertyValue":"5","propUnit":""},\
-{"name":"width_y","vizPropertyVariablename":"width_y","propertyValue":"50","propUnit":"px"},\
-{"name":"position_y","vizPropertyVariablename":"position_y","propertyValue":"center","propUnit":""},\
-{"name":"valueLabelShow","vizPropertyVariablename":"valueLabelShow","propertyValue":"false","propUnit":""},\
-{"name":"distance_valueLabel","vizPropertyVariablename":"distance_valueLabel","propertyValue":"10","propUnit":""},\
-{"name":"position_valueLabel","vizPropertyVariablename":"position_valueLabel","propertyValue":"top","propUnit":""},\
-{"name":"schemeArray","vizPropertyVariablename":"schemeArray","propertyValue":"D3_Tableau10","propUnit":""},\
-{"name":"seriesColorBy","vizPropertyVariablename":"seriesColorBy","propertyValue":"series","propUnit":""},\
-{"name":"barStacked","vizPropertyVariablename":"barStacked","propertyValue":"false","propUnit":""}],\
-"dataTransformation":[]}^^^29.04.2026^29.04.2026^47140^^3^ ^^1^800^600^100^60^0^
-140^echarts_line_y_sxc_vergleich1^Studierende (Hochschulvergleich)^ ^{"version":"0.2b","id":1,"name":"","renderer":"echarts","dataSources":[{"value":"0","nr":1,"name":"Tab. 1","isDefault":true}],\
-"targetDiv":"","chartElements":[{"elemID":"1","vizTypeUniquename":"echarts_line_y","caption":"echarts_line_y","datasource":"0","elementTypeProperties":[{"nr":"1","vizTypePropertyUniquename":"x","caption":"X-Achse","propertyValue":"sem_rueck_beur_ein_str","propertyType":"string"},\
-{"nr":"1","vizTypePropertyUniquename":"y","caption":"Y-Achse","propertyValue":"summe","propertyType":"string"}]}],\
-"chartPropertiesUsed":[{"name":"caption","vizPropertyVariablename":"caption","propertyValue":"Studierende (Hochschulvergleich)"},\
-{"name":"x","vizPropertyVariablename":"x","propertyValue":"sem_rueck_beur_ein_str","propUnit":""},\
-{"name":"x","vizPropertyVariablename":"x","propertyValue":"sem_rueck_beur_ein_str","propUnit":""},\
-{"name":"y","vizPropertyVariablename":"y","propertyValue":"summe","propUnit":""},\
-{"name":"y","vizPropertyVariablename":"y","propertyValue":"summe","propUnit":""},\
-{"name":"title.left","vizPropertyVariablename":"title.left","propertyValue":"left","propUnit":""},\
{"name":"title.top","vizPropertyVariablename":"title.top","propertyValue":"top","propUnit":""},\
-{"name":"legendShow","vizPropertyVariablename":"legendShow","propertyValue":"true","propUnit":""},\
-{"name":"legend.top","vizPropertyVariablename":"legend.top","propertyValue":"bottom","propUnit":""},\
-{"name":"legend.left","vizPropertyVariablename":"legend.left","propertyValue":"left","propUnit":""},\
-{"name":"legend.scroll","vizPropertyVariablename":"legend.scroll","propertyValue":"false","propUnit":""},\
{"name":"margin.left","vizPropertyVariablename":"margin.left","propertyValue":"20","propUnit":"%"},\
+{"name":"margin.left","vizPropertyVariablename":"margin.left","propertyValue":"20","propUnit":"%"},\
+{"name":"legendShow","vizPropertyVariablename":"legendShow","propertyValue":"true","propUnit":""},\
{"name":"margin.right","vizPropertyVariablename":"margin.right","propertyValue":"0","propUnit":"%"},\
+{"name":"margin.right","vizPropertyVariablename":"margin.right","propertyValue":"0","propUnit":"%"},\
+{"name":"legend.top","vizPropertyVariablename":"legend.top","propertyValue":"bottom","propUnit":""},\
+{"name":"margin.top","vizPropertyVariablename":"margin.top","propertyValue":"16","propUnit":"%"},\
{"name":"margin.top","vizPropertyVariablename":"margin.top","propertyValue":"16","propUnit":"%"},\
+{"name":"legend.left","vizPropertyVariablename":"legend.left","propertyValue":"center","propUnit":""},\
{"name":"margin.bottom","vizPropertyVariablename":"margin.bottom","propertyValue":"20","propUnit":"%"},\
+{"name":"margin.bottom","vizPropertyVariablename":"margin.bottom","propertyValue":"20","propUnit":"%"},\
+{"name":"legend.scroll","vizPropertyVariablename":"legend.scroll","propertyValue":"false","propUnit":""},\
{"name":"xAxisNameLocation","vizPropertyVariablename":"xAxisNameLocation","propertyValue":"end","propUnit":""},\
{"name":"tickRotate_x","vizPropertyVariablename":"tickRotate_x","propertyValue":"30","propUnit":""},\
-{"name":"tickRotate_x","vizPropertyVariablename":"tickRotate_x","propertyValue":"30","propUnit":""},\
{"name":"width_x","vizPropertyVariablename":"width_x","propertyValue":"100","propUnit":"px"},\
{"name":"padding_x","vizPropertyVariablename":"padding_x","propertyValue":"5","propUnit":""},\
+{"name":"yAxisName","vizPropertyVariablename":"yAxisName","propertyValue":"Endbestand Quote in %","propUnit":""},\
{"name":"padding_y","vizPropertyVariablename":"padding_y","propertyValue":"5","propUnit":""},\
{"name":"width_y","vizPropertyVariablename":"width_y","propertyValue":"50","propUnit":"px"},\
{"name":"position_y","vizPropertyVariablename":"position_y","propertyValue":"center","propUnit":""},\
-{"name":"valueLabelShow","vizPropertyVariablename":"valueLabelShow","propertyValue":"false","propUnit":""},\
+{"name":"valueLabelShow","vizPropertyVariablename":"valueLabelShow","propertyValue":"true","propUnit":""},\
{"name":"distance_valueLabel","vizPropertyVariablename":"distance_valueLabel","propertyValue":"10","propUnit":""},\
-{"name":"position_valueLabel","vizPropertyVariablename":"position_valueLabel","propertyValue":"top","propUnit":""},\
+{"name":"position_valueLabel","vizPropertyVariablename":"position_valueLabel","propertyValue":"inside","propUnit":""},\
{"name":"schemeArray","vizPropertyVariablename":"schemeArray","propertyValue":"D3_Tableau10","propUnit":""},\
{"name":"seriesColorBy","vizPropertyVariablename":"seriesColorBy","propertyValue":"series","propUnit":""},\
{"name":"barStacked","vizPropertyVariablename":"barStacked","propertyValue":"false","propUnit":""}],\
-"dataTransformation":[]}^^^29.04.2026^29.04.2026^47140^^3^ ^^1^800^600^100^60^0^
+"dataTransformation":[]}^^^21.06.2026^21.06.2026^47230^^3^ ^^1^800^600^100^60^0^
diff --git a/src-modules/module/sxc/schluesseltabellen/viz_chart_unload.x b/src-modules/module/sxc/schluesseltabellen/viz_chart_unload.x
index ac9755a..e69dbd3 100755
--- a/src-modules/module/sxc/schluesseltabellen/viz_chart_unload.x
+++ b/src-modules/module/sxc/schluesseltabellen/viz_chart_unload.x
@@ -28,6 +28,6 @@ DOQUERY "select tid,
-- chart_class_name,
-- chart_element_id,
-- chart_title_position
- from viz_chart where is_custom=0 and maskeninfo_id=47140 order by uniquename" false ^ viz_chart.unl txt
+ from viz_chart where is_custom=0 and maskeninfo_id in (select B.maskeninfo_id from maske_system_bez B where B.systeminfo_id=360) order by uniquename" false ^ viz_chart.unl txt