diff --git a/src-modules/module/msg/conf/msg.xml b/src-modules/module/msg/conf/msg.xml
index ba0b0aa..5bd1a5d 100644
--- a/src-modules/module/msg/conf/msg.xml
+++ b/src-modules/module/msg/conf/msg.xml
@@ -1,22 +1,340 @@
-
- Ein Modul für Mehrfachstudiengänge
-
-
-
-
-
-
-
-
-
- Kombinationen von TSG in einem MSG
-
-
+
+Ein Modul für Mehrfachstudiengänge
+
+
+
+
+
+
+
+Abschlussprüfungen für die Übernahme
+
+Matrikel-Nr.
+Studiengang-Nr.
+Fach-Nr.
+Abschluss
+Semester ESG/MSG
+Datum der Prüfung ESG/MSG
+Fach
+Vertiefung
+Schwerpunkt
+Fachkennzeichen
+Prüfungsnote
+Prüfungsamtnummer
+Prüfungsnummer
+PO-Version
+Prüfungsstatus
+Fachsemester
+Prüfungsart
+Eindeutige Laufnummer der Prüfung
+Versuchsanzahl
+1.Prueferkuerzel
+2.Prueferkuerzel
+Maluspunkte dieser Pruefung
+Guthaben-/Bonuspunkte dieser Pruefung
+Zuordnungsnummer aus PORD
+Vermerk zur Prüfung
+Zurückgetreten (1/0)
+Zeitabschnitt
+Anerkannte Prüfung
+Kennzeichnung fuer Pruefungsstatistiklieferung
+Art des Studiums
+Studienform
+
+degree_program_id ESG/MSG
+degree_program_id TSG
+Semester (TSG)
+Datum der Prüfung (TSG)
+Prüfungsstatus (TSG)
+Note (TSG)
+Anzahl Fachsemester (TSG)
+
+
+Fach der Abschlussarbeit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Abschlussprüfungen
+
+Matrikel-Nr.
+Studiengang-Nr.
+Fach-Nr.
+
+Semester ESG/MSG
+Datum der Prüfung ESG/MSG
+
+
+
+
+
+
+Prüfungsamtnummer
+Prüfungsnummer
+PO-Version
+
+wird derzeit nur bei Datenquelle CO ausgewertet
+Prüfungsstatus
+Fachsemester
+Prüfungsart
+Vorprüfung="V", Hauptpr.="H"
+Eindeutige Laufnummer der Prüfung
+
+z.B. 5=msgpos,6=HISinOne,15=CO
+Versuchsanzahl
+1.Prueferkuerzel
+2.Prueferkuerzel
+Maluspunkte dieser Pruefung
+Guthaben-/Bonuspunkte dieser Pruefung
+Zuordnungsnummer aus PORD
+Vermerk zur Prüfung
+Zurückgetreten (1/0)
+Zeitabschnitt
+Anerkannte Prüfung
+Kennzeichnung fuer Pruefungsstatistiklieferung
+Art des Studiums
+Studienform
+
+degree_program_id ESG/MSG
+degree_program_id TSG
+Semester (TSG)
+Datum der Prüfung (TSG)
+Prüfungsstatus (TSG)
+Note (TSG)
+Anzahl Fachsemester (TSG)
+
+
+Fach der Abschlussarbeit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hilfstabelle Abschlussprüfungen: Hauptprüfungen und Teilabschlussprüfungen
+
+
+
+
+
+0=Inland, 1=Ausland
+
+Interner Schlüssel der HZB-Art
+
+
+
+
+
+
+
+Für einfachere Filterung nach Semester: bei TSG das Semester des TSG, bei ESG/MSG das Semester des MSG
+
+
+
+
+
+
+
+
+RSZ des Studiengangs zum Zeitpunkt der Prüfung
+ bei CO der SPO-Knoten
+
+
+
+wird derzeit nur bei Datenquelle CO ausgewertet
+
+
+
+HIS1: Tabelle degree_program (Studiengang zum Studenten)
+HIS1: Tabelle degree_program (Studiengang zum Studenten)
+Wg. amtl. Stat./BSOS wird nicht die Semesterzahl in lab genommen, sondern über Matrikelnr., Fach, Abschluss,Vert.richtung und Semester aus stg
+wird derzeit nur bei Datenquelle CO ausgewertet
+
+TSG/ESG/MSG
+
+
+
+
+
+
+z.B. 5=msgpos,6=HISinOne,15=CO
+
+
+
+
+wird derzeit nur bei Datenquelle CO ausgewertet
+
+
+wird derzeit nur bei Datenquelle CO ausgewertet
+1=Rücktritt, 0=kein Rücktritt
+
+
+Fach der Abschlussarbeit
+Anzahl der Prüfungen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Hilfstabelle Abschlussprüfungen: Hauptprüfungen und Teilabschlussprüfungen
+
+
+
+
+
+0=Inland, 1=Ausland
+
+Interner Schlüssel der HZB-Art
+
+
+
+
+
+
+
+Für einfachere Filterung nach Semester: bei TSG das Semester des TSG, bei ESG/MSG das Semester des MSG
+
+
+
+
+
+
+
+
+RSZ des Studiengangs zum Zeitpunkt der Prüfung
+ bei CO der SPO-Knoten
+
+
+
+
+
+HIS1: Tabelle degree_program (Studiengang zum Studenten)
+HIS1: Tabelle degree_program (Studiengang zum Studenten)
+Wg. amtl. Stat./BSOS wird nicht die Semesterzahl in lab genommen, sondern über Matrikelnr., Fach, Abschluss,Vert.richtung und Semester aus stg
+wird derzeit nur bei Datenquelle CO ausgewertet
+
+TSG/ESG/MSG
+
+
+
+
+
+
+z.B. 5=msgpos,6=HISinOne,15=CO
+
+
+
+
+wird derzeit nur bei Datenquelle CO ausgewertet
+
+
+wird derzeit nur bei Datenquelle CO ausgewertet
+1=Rücktritt, 0=kein Rücktritt
+
+
+Fach der Abschlussarbeit
+
+Anzahl der Prüfungen
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Kombinationen von TSG in einem MSG
+
+
ggf. pseudonymisiert, bei Datenquelle HIS1 ist dies die student.id
-
-
+Erster/Zweiter Studiengang etc.
+Erstes / Zweites Fach etc.
+0=Tagesaktuell
im Studiengangsverzeichnis lehr_stg_ab
1=Männlich, 2=Weiblich
@@ -26,16 +344,17 @@
-Klassifizierung der Kombination
+Name der Kombination
im Studiengangsverzeichnis lehr_stg_ab
Im jew. Semester und Studiengang die Anzahl der kombinierten Fächer
+Im jew. Semester und Studiengang die Anzahl der kombinierten Fächer Sprachen
-
-
-
+
+
+
@@ -75,87 +394,247 @@
-
-
+
+
+
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
-
+
+
+ $MSG_PFAD/masken
+
+
+ $MSG_PFAD/masken
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src-modules/module/msg/datentabellen/trans_msg_abp.sql b/src-modules/module/msg/datentabellen/trans_msg_abp.sql
new file mode 100644
index 0000000..32b2a38
--- /dev/null
+++ b/src-modules/module/msg/datentabellen/trans_msg_abp.sql
@@ -0,0 +1,500 @@
+--freemarker template
+<#include "SQL_lingua_franca"/>
+<#include "SuperX_general"/>
+
+
+
+select apnr from konstanten where beschreibung='SOS_Quellsystem'
+
+
+select apnr from konstanten where beschreibung='Start_POS_Semester'
+
+
+
+<#if Quellsystem_var=15>
+
+update msg_abp_neu set ch39_vertief = '' where ch39_vertief is null;
+update msg_abp_neu set schwerpunkt = '' where schwerpunkt is null;
+update msg_abp_neu set kz_fach = '' where kz_fach is null;
+update msg_abp_neu set pversion = -1 where pversion is null;
+
+
+CREATE temp TABLE tmp_msg_abp (
+ matrikel_nr integer NOT NULL,
+ studiengang_nr smallint,
+ fach_nr smallint,
+ ch40_studientyp smallint,
+ ch35_ang_abschluss char(10) NOT NULL,
+ ch35_art_abg_pruef smallint,
+ sem_der_pruefung smallint,
+ d_abg_pruefung date,
+ ch30_fach char(10) NOT NULL,
+ ch39_vertief char(10) NOT NULL,
+ schwerpunkt char(10),
+ kz_fach char(10) NOT NULL,
+ pruefungsamt integer,
+ haupt_pruef_note numeric(8,2),
+ vor_haupt_pruefung character(1) NOT NULL,
+ pnr integer,
+ degree_program_id integer,
+ degree_program_id_tsg integer,
+ pversion INTEGER,
+ spo_version char(10),
+ spo_version_tsg char(10),
+ pstatus char(10),
+ fach_sem_zahl smallint,
+ stort char(10),
+ part character(10),
+ leistungs_id integer,
+pversuch SMALLINT ,
+ppruef1 CHAR(10) ,
+ppruef2 CHAR(10) ,
+malus FLOAT ,
+bonus FLOAT ,
+pordnr INTEGER ,
+pvermerk char(10),
+prueck integer,
+zeitabschnitt char(10),
+sourcesystem integer,
+pruefungsamt_nr CHAR(7),
+panerk char(10),
+pstatkennz integer,
+stuart VARCHAR(10),
+stufrm VARCHAR(10),
+stutyp char(10),
+sem_der_pruefung_tsg SMALLINT ,
+d_abg_pruefung_tsg date,
+note_tsg numeric(8,2),
+fach_sem_zahl_tsg smallint,
+leistungs_id_msg integer,
+pstatus_tsg char(10),
+studienidentifikator varchar(255),
+studienidentifikator_tsg varchar(255),
+fach_abschlussarbeit CHAR(10)
+
+);
+
+
+insert into tmp_msg_abp
+(matrikel_nr,
+studiengang_nr,
+fach_nr,
+ch35_ang_abschluss,
+sem_der_pruefung,
+d_abg_pruefung,
+ch30_fach,
+ch39_vertief,
+schwerpunkt,
+kz_fach,
+haupt_pruef_note,
+vor_haupt_pruefung,
+pnr,
+degree_program_id,
+degree_program_id_tsg,
+pversion,
+spo_version,
+spo_version_tsg,
+pstatus,
+fach_sem_zahl,
+fach_sem_zahl_tsg,
+part,
+leistungs_id,
+pversuch ,
+ppruef1 ,
+ppruef2 ,
+malus ,
+bonus ,
+pordnr ,
+pvermerk,
+prueck ,
+zeitabschnitt ,
+sourcesystem ,
+pruefungsamt_nr,
+panerk,
+pstatkennz,
+stuart,
+stufrm,
+stutyp,
+ sem_der_pruefung_tsg,
+ d_abg_pruefung_tsg,
+ note_tsg,
+ pstatus_tsg,
+ studienidentifikator ,
+studienidentifikator_tsg,
+fach_abschlussarbeit
+)
+select
+matrikel_nr,
+to_number(studiengang_nr,'9'),
+to_number(fach_nr,'9'),
+ ch35_ang_abschluss,
+sem_der_pruefung,
+d_abg_pruefung,
+ch30_fach,
+ch39_vertief,
+schwerpunkt,
+kz_fach,
+haupt_pruef_note::float,
+'H',
+pnr,
+degree_program_id,
+degree_program_id_tsg,
+val('' || pversion),
+(case when part='TSAB' then null::char(10) else pversion end) as spo_version,
+(case when part='TSAB' then pversion else null::char(10) end) as spo_version_tsg,
+pstatus,
+fach_sem_zahl,
+fach_sem_zahl_tsg,
+part,
+leistungs_id,
+pversuch ,
+ppruef1 ,
+ppruef2 ,
+malus ,
+bonus ,
+pordnr,
+pvermerk ,
+prueck ,
+zeitabschnitt ,
+${Quellsystem_var},
+pruefungsamt_nr,
+panerk,
+val(pstatkennz),
+stuart,
+stufrm,
+stutyp,
+ sem_der_pruefung_tsg,
+ d_abg_pruefung_tsg,
+ note_tsg,
+ pstatus_tsg,
+ studienidentifikator ,
+studienidentifikator_tsg,
+fach_abschlussarbeit
+from msg_abp_neu P
+where
+ P.ch35_ang_abschluss is not NULL
+ and P.ch30_fach is not NULL
+ and P.kz_fach is not NULL
+ --and P.pnr in
+ --(select apnr from sos_vdhdpnr)
+;
+DELETE FROM tmp_msg_abp WHERE leistungs_id IS NULL;
+
+<#if SOS_ABSCHLUSSTYP_VORPRUEFUNG?exists>
+update tmp_msg_abp set vor_haupt_pruefung='V'
+where ${SOS_ABSCHLUSSTYP_VORPRUEFUNG};
+#if>
+
+update tmp_msg_abp set leistungs_id_msg=L.labnrzu
+from sos_labzuord L
+where L.labnr=tmp_msg_abp.leistungs_id;
+
+--spo-Version des MSG bei TSAB nachladen:
+update tmp_msg_abp set spo_version=L.pversion
+from msg_abp_neu L
+where L.leistungs_id=tmp_msg_abp.leistungs_id_msg
+and tmp_msg_abp.part='TSAB'
+;
+
+--bei MSG wird studiengang_nr aus dem TSG
+--der Abschlussarbeit ermittelt:
+update tmp_msg_abp set studiengang_nr=val(P.studiengang_nr) --,
+--fach_nr=val(P.fach_nr)
+from msg_abp_neu P, sos_labzuord L
+where P.leistungs_id=L.labnr
+and tmp_msg_abp.leistungs_id= L.labnrzu
+and tmp_msg_abp.ch30_fach=P.ch30_fach
+and tmp_msg_abp.ch35_ang_abschluss=P.ch35_ang_abschluss
+;
+
+
+--wenn das nicht klappt aus studienverlauf:
+update tmp_msg_abp set
+studiengang_nr = F.studiengang_nr
+from sos_stg F where
+tmp_msg_abp.matrikel_nr =F.matrikel_nr
+and tmp_msg_abp.sem_der_pruefung >= F.sem_rueck_beur_ein
+and tmp_msg_abp.ch30_fach = F.ch30_fach
+and tmp_msg_abp.ch39_vertief = F.ch39_vertief
+and (tmp_msg_abp.schwerpunkt = F.schwerpunkt or tmp_msg_abp.schwerpunkt='')
+and tmp_msg_abp.kz_fach = F.kz_fach
+and tmp_msg_abp.ch35_ang_abschluss = F.ch35_ang_abschluss
+and ( tmp_msg_abp.studiengang_nr is null or tmp_msg_abp.studiengang_nr=0
+);
+update tmp_msg_abp set
+fach_nr = F.fach_nr
+from sos_stg F where
+tmp_msg_abp.matrikel_nr =F.matrikel_nr
+and tmp_msg_abp.sem_der_pruefung >= F.sem_rueck_beur_ein
+and tmp_msg_abp.ch30_fach = F.ch30_fach
+and tmp_msg_abp.ch39_vertief = F.ch39_vertief
+and (tmp_msg_abp.schwerpunkt = F.schwerpunkt or tmp_msg_abp.schwerpunkt='')
+and tmp_msg_abp.kz_fach = F.kz_fach
+and tmp_msg_abp.ch35_ang_abschluss = F.ch35_ang_abschluss
+and ( tmp_msg_abp.fach_nr is null or tmp_msg_abp.fach_nr=0
+)
+and zeitabschnitt!='MSG'
+;
+update tmp_msg_abp set
+fach_sem_zahl = F.fach_sem_zahl
+from sos_stg F where
+tmp_msg_abp.matrikel_nr =F.matrikel_nr
+and tmp_msg_abp.sem_der_pruefung >= F.sem_rueck_beur_ein
+and tmp_msg_abp.ch30_fach = F.ch30_fach
+and tmp_msg_abp.ch39_vertief = F.ch39_vertief
+and (tmp_msg_abp.schwerpunkt = F.schwerpunkt or tmp_msg_abp.schwerpunkt='')
+and tmp_msg_abp.kz_fach = F.kz_fach
+and tmp_msg_abp.ch35_ang_abschluss = F.ch35_ang_abschluss
+and tmp_msg_abp.fach_sem_zahl is null
+and part!='TSAB';
+
+SELECT 'lookup stutyp and stuart:' || now() FROM xdummy;
+
+CREATE TEMP TABLE tmp_stg
+(
+ matrikel_nr INTEGER ,
+ ch35_ang_abschluss CHAR(10),
+ ch30_fach CHAR(10),
+ stuart CHAR(10),
+ stutyp CHAR(10),
+ sem_rueck_beur_ein_max SMALLINT
+);
+INSERT INTO tmp_stg(
+ matrikel_nr,
+ ch35_ang_abschluss,
+ ch30_fach,
+ stuart,
+ stutyp,
+ sem_rueck_beur_ein_max
+)
+SELECT
+ matrikel_nr,
+ ch35_ang_abschluss,
+ ch30_fach,
+ stuart,
+ stutyp,
+ max(sem_rueck_beur_ein)
+FROM
+ sos_stg
+WHERE
+ today() BETWEEN gueltig_von AND gueltig_bis
+ and matrikel_nr in (select distinct T.matrikel_nr from tmp_msg_abp T)
+ --and 1=0
+GROUP BY
+ 1,2,3,4,5
+;
+
+CREATE INDEX tmp_ix1 ON tmp_stg(matrikel_nr);
+CREATE INDEX tmp_ix2 ON tmp_stg(ch35_ang_abschluss,ch30_fach);
+
+
+
+UPDATE
+ tmp_msg_abp
+SET
+ stuart = stg.stuart
+FROM
+ tmp_stg stg
+WHERE
+ tmp_msg_abp.matrikel_nr = stg.matrikel_nr
+ AND tmp_msg_abp.ch35_ang_abschluss = stg.ch35_ang_abschluss
+ AND tmp_msg_abp.ch30_fach = stg.ch30_fach
+ AND stg.sem_rueck_beur_ein_max <= tmp_msg_abp.sem_der_pruefung
+ AND stg.stuart IS NOT NULL
+ and tmp_msg_abp.stuart IS NULL
+ AND tmp_msg_abp.vor_haupt_pruefung IN ('V','H')
+ ;
+ --jetzt TSG:
+UPDATE
+ tmp_msg_abp
+SET
+ stuart = stg.stuart
+FROM
+ tmp_stg stg
+WHERE
+ tmp_msg_abp.matrikel_nr = stg.matrikel_nr
+ AND tmp_msg_abp.ch35_ang_abschluss = stg.ch35_ang_abschluss
+ AND tmp_msg_abp.ch30_fach = stg.ch30_fach
+ AND stg.sem_rueck_beur_ein_max <= tmp_msg_abp.sem_der_pruefung_tsg
+ AND stg.stuart IS NOT NULL
+ and tmp_msg_abp.stuart IS NULL
+ AND tmp_msg_abp.vor_haupt_pruefung IN ('V','H')
+ ;
+
+UPDATE
+ tmp_msg_abp
+SET
+ stutyp = stg.stutyp
+FROM
+ tmp_stg stg
+WHERE
+ tmp_msg_abp.matrikel_nr = stg.matrikel_nr
+ AND tmp_msg_abp.ch35_ang_abschluss = stg.ch35_ang_abschluss
+ AND tmp_msg_abp.ch30_fach = stg.ch30_fach
+ AND stg.sem_rueck_beur_ein_max <= tmp_msg_abp.sem_der_pruefung
+ AND stg.stutyp IS NOT NULL
+ and tmp_msg_abp.stutyp IS NULL
+ AND tmp_msg_abp.vor_haupt_pruefung IN ('V','H')
+ ;
+--TSG:
+ UPDATE
+ tmp_msg_abp
+SET
+ stutyp = stg.stutyp
+FROM
+ tmp_stg stg
+WHERE
+ tmp_msg_abp.matrikel_nr = stg.matrikel_nr
+ AND tmp_msg_abp.ch35_ang_abschluss = stg.ch35_ang_abschluss
+ AND tmp_msg_abp.ch30_fach = stg.ch30_fach
+ AND stg.sem_rueck_beur_ein_max <= tmp_msg_abp.sem_der_pruefung_tsg
+ AND stg.stutyp IS NOT NULL
+ and tmp_msg_abp.stutyp IS NULL
+ AND tmp_msg_abp.vor_haupt_pruefung IN ('V','H')
+ ;
+
+
+drop table tmp_stg;
+
+
+-- end of 'stufrm'/'stuart' lookup
+select 'end of lookup stufrm,stutyp and stuart:' || now() from xdummy;
+
+--keine Fach-nr. bei MSG Abschlüssen:
+update tmp_msg_abp set fach_nr=null where zeitabschnitt='MSG';
+
+--Prüfroutine
+insert into sos_pruefrout
+(
+tabelle,
+tabelle_sos,
+matrikel_nr,
+semester,
+problem,
+aktion
+)
+select
+'msg_abp_neu',
+'abp',
+matrikel_nr,sem_der_pruefung,
+'studiengang_nr/fach_nr unbekannt, Prüfung wird gelöscht',
+'Warnung'
+from tmp_msg_abp
+where (studiengang_nr is null
+or fach_nr is null)
+;
+
+--insert in echte Tabelle:
+delete from msg_abp
+where (sourcesystem=${Quellsystem_var}
+or sourcesystem is null)
+and (matrikel_nr,sourcesystem,ch35_ang_abschluss)
+in (select matrikel_nr,sourcesystem,ch35_ang_abschluss
+from tmp_msg_abp)
+;
+
+
+insert into msg_abp
+(matrikel_nr,
+studiengang_nr,
+fach_nr,
+ch35_ang_abschluss,
+sem_der_pruefung,
+d_abg_pruefung,
+ch30_fach,
+ch39_vertief,
+schwerpunkt,
+kz_fach,
+haupt_pruef_note,
+vor_haupt_pruefung,
+pnr,
+pversion,
+spo_version,
+spo_version_tsg,
+pstatus,
+fach_sem_zahl,
+part,
+leistungs_id,
+pversuch ,
+ppruef1 ,
+ppruef2 ,
+malus ,
+bonus ,
+pordnr ,
+stort,
+pvermerk,
+prueck ,
+zeitabschnitt,
+sourcesystem,
+pruefungsamt_nr,
+panerk,
+pstatkennz,
+stuart,
+stufrm,
+stutyp,
+degree_program_id,
+degree_program_id_tsg,
+sem_der_pruefung_tsg,
+d_abg_pruefung_tsg,
+note_tsg,
+fach_sem_zahl_tsg,
+pstatus_tsg,
+ studienidentifikator ,
+studienidentifikator_tsg,
+fach_abschlussarbeit
+)
+select matrikel_nr,
+studiengang_nr,
+fach_nr,
+ch35_ang_abschluss,
+sem_der_pruefung,
+d_abg_pruefung,
+ch30_fach,
+ch39_vertief,
+schwerpunkt,
+kz_fach,
+haupt_pruef_note,
+vor_haupt_pruefung,
+pnr,
+pversion,
+spo_version,
+spo_version_tsg,
+pstatus,
+fach_sem_zahl,
+part,
+leistungs_id,
+pversuch ,
+ppruef1 ,
+ppruef2 ,
+malus ,
+bonus ,
+pordnr ,
+stort,
+pvermerk,
+prueck ,
+zeitabschnitt,
+sourcesystem,
+pruefungsamt_nr,
+panerk,
+pstatkennz,
+stuart,
+stufrm,
+stutyp,
+degree_program_id,
+degree_program_id_tsg,
+sem_der_pruefung_tsg,
+d_abg_pruefung_tsg,
+note_tsg,
+fach_sem_zahl_tsg,
+pstatus_tsg,
+ studienidentifikator ,
+studienidentifikator_tsg,
+fach_abschlussarbeit
+from tmp_msg_abp
+;
+
+
+drop TABLE tmp_msg_abp;
+
+#if>
+
diff --git a/src-modules/module/msg/datentabellen/trans_msg_abp_pre.sql b/src-modules/module/msg/datentabellen/trans_msg_abp_pre.sql
new file mode 100644
index 0000000..0ebcdbb
--- /dev/null
+++ b/src-modules/module/msg/datentabellen/trans_msg_abp_pre.sql
@@ -0,0 +1,54 @@
+--freemarker template
+
+<#include "SQL_lingua_franca"/>
+<#include "SuperX_general"/>
+
+
+
+
+select apnr from konstanten where beschreibung='SOS_Quellsystem';
+
+
+
+
+
+select S.leistungs_id
+into temp tmp_delete
+ from msg_abp S left outer join msg_abp_neu N on (
+ S.matrikel_nr=N.matrikel_nr
+ and S.leistungs_id=N.leistungs_id)
+ where S.sourcesystem=${Quellsystem_var}
+and coalesce(S.sem_der_pruefung,S.sem_der_pruefung_tsg) >= ${K_Start_POS_Semester}
+and N.leistungs_id is null
+;
+
+insert into sos_pruefrout
+(
+ datum,
+ semester,
+ tabelle,
+ tabelle_sos,
+ matrikel_nr,
+ problem,
+ aktion
+)
+
+select today(),
+coalesce(S.sem_der_pruefung,S.sem_der_pruefung_tsg) as sem_der_pruefung,
+'msg_abp',
+'abp',
+S.matrikel_nr,
+'Die Hauptprüfung mit der ID: ' || S.leistungs_id || ' wurde gelöscht, da diese nicht im Vorsystem zu finden ist',
+'Info'
+ from msg_abp S, tmp_delete D
+ where D.leistungs_id=S.leistungs_id
+;
+
+delete from msg_abp
+where leistungs_id in (select leistungs_id
+from tmp_delete);
+
+
+drop table tmp_delete;
+
+
diff --git a/src-modules/module/msg/datentabellen/vacuum_pg.sql b/src-modules/module/msg/datentabellen/vacuum_pg.sql
new file mode 100644
index 0000000..45cdad2
--- /dev/null
+++ b/src-modules/module/msg/datentabellen/vacuum_pg.sql
@@ -0,0 +1,12 @@
+
+select * from xdummy;
+
+--bei Postgres in HIS1 laufen alle Scripte in Transaktionen, daher muss man
+--für vacuum erst committen
+
+commit;
+
+vacuum msg_abp;
+vacuum msg_abp_aggr;
+vacuum msg_abp_aggr_gew;
+vacuum msg_fkombi_aggr;
diff --git a/src-modules/module/msg/hilfstabellen/msg_abp_aggr_fuellen.sql b/src-modules/module/msg/hilfstabellen/msg_abp_aggr_fuellen.sql
new file mode 100644
index 0000000..dcd4120
--- /dev/null
+++ b/src-modules/module/msg/hilfstabellen/msg_abp_aggr_fuellen.sql
@@ -0,0 +1,660 @@
+--freemarker template
+
+--(c) 2024 Daniel Quathamer
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'pruef_sem_zahl_decimal';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'Start_POS_Semester';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'matrikelnr_min';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'matrikelnr_max';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'SOS_status_prom';
+
+
+SELECT tid FROM sos_stichtag WHERE appl_key = '2';
+
+
+SELECT 1 FROM xdummy WHERE 0 !=
+ (SELECT count(*) FROM konstanten WHERE beschreibung = 'SOS_MTKNR_EXT' AND apnr = 1)
+UNION
+SELECT 0 FROM xdummy WHERE 0 =
+ (SELECT count(*) FROM konstanten WHERE beschreibung = 'SOS_MTKNR_EXT' AND apnr = 1);
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'SOS_Quellsystem';
+
+
+select 1 from xdummy where 3=(select max(mod(tid,10)) from semester)
+ union
+ select 0 from xdummy where 3!=(select max(mod(tid,10)) from semester)
+ ;
+
+
+
+-- Falls es Konstanten nicht gibt, Defaultwert:
+<#assign p_start_pos_sem = 19001 />
+<#if p_start_pos_sem_var?exists && p_start_pos_sem_var?string?length > 0>
+ <#assign p_start_pos_sem = p_start_pos_sem_var />
+#if>
+
+-- Sollen Fachsem. dezimal berechnet werden, d.h. relativ zum Prüfungsdatum?
+-- Falls Variable nicht belegt, default 0 (Ganzzahlig)
+<#assign p_pruef_sem_zahl_decimal = 0 />
+<#if p_pruef_sem_zahl_decimal_var?exists && p_pruef_sem_zahl_decimal_var?string?length > 0>
+ <#assign p_pruef_sem_zahl_decimal = p_pruef_sem_zahl_decimal_var />
+#if>
+
+<#assign matrikelnr_min = 0 />
+<#if matrikelnr_min_var?exists && matrikelnr_min_var?string?length > 0>
+ <#assign matrikelnr_min = matrikelnr_min_var />
+#if>
+
+<#assign matrikelnr_max = 2147483647 />
+<#if matrikelnr_max_var?exists && matrikelnr_max_var?string?length > 0>
+ <#assign matrikelnr_max = matrikelnr_max_var />
+#if>
+
+
+<#assign p_promotion = 6 />
+<#if p_promotion_var?exists && p_promotion_var?string?length > 0>
+ <#assign p_promotion = p_promotion_var />
+#if>
+
+<#assign stichtag_tagesaktuell = 0 />
+<#if stichtag_tagesaktuell_var?exists && stichtag_tagesaktuell_var?string?length > 0>
+ <#assign stichtag_tagesaktuell = stichtag_tagesaktuell_var />
+#if>
+<#if istTrimester==1>
+ <#assign Trimester="true" />
+<#else>
+ <#assign Trimester="false" />
+#if>
+
+<#assign bezugssemester_cond="(case when part='TSAB' then sem_der_pruefung_tsg else sem_der_pruefung end)" />
+<#assign pdatumsfeld_cond="(case when part='TSAB' then d_abg_pruefung_tsg else d_abg_pruefung end)" />
+
+<#assign target_fields_except_stichtag=" matrikel_nr,
+ alter,
+ geschlecht,
+ ca12_staat,
+ ort_der_hzb,
+ staat_der_hzb,
+ hzbart_int,
+ hzbart,
+ pseudonym,
+ sem_der_pruefung,
+ sem_der_pruefung_tsg,
+ sem_d_abg_pruefung,
+ sem_d_abg_pruefung_tsg,
+ d_abg_pruefung,
+ d_abg_pruefung_tsg,
+ bezugssemester,
+ tid_stg,
+ stufrm,
+ stuart,
+ regel,
+ pordnr,
+ studiengang_nr,
+ fach_nr,
+ st_studium_nr,
+ st_studium_nr_tsg,
+ fach_sem_zahl,
+ fach_sem_zahl_tsg,
+ part,
+ leistungs_id,
+ pnr,
+ pversuch,
+ sourcesystem,
+ pvermerk,
+ note,
+ note_tsg,
+ notenskala,
+ pstatus,
+ pstatus_tsg,
+ prueck,
+ ects,
+ ects_tsg,
+ studiengangstyp,
+ abschnitt,
+ spo_version,
+ spo_version_tsg,
+ studienidentifikator ,
+ studienidentifikator_tsg,
+ fach_abschlussarbeit,
+ summe" />
+
+<#if Quellsystem_var=15>
+
+
+SELECT 'Matrikelnr. Max: ${matrikelnr_max} '::CHAR(30) FROM xdummy;
+SELECT 'Matrikelnr. Min: ${matrikelnr_min} '::CHAR(30) FROM xdummy;
+SELECT 'SOS_MTKNR_EXT: ${SOS_MTKNR_EXT} '::CHAR(30) FROM xdummy;
+SELECT 'Startsemester ${K_SOS_start_lab}'::CHAR(30) FROM xdummy;
+SELECT 'Startsemester Vorsemester ${K_SOS_start_lab_vorsemester}'::CHAR(30) FROM xdummy;
+
+SELECT now(),'Anzahl Sätze in msg_abp_aggr:'::CHAR(30),count(*) FROM msg_abp_aggr GROUP BY 1,2;
+
+CREATE TEMP TABLE tmp_abp_aggr(
+ matrikel_nr INTEGER ,
+alter decimal(14,2) ,
+d_geburt date,
+geschlecht SMALLINT ,
+ca12_staat SMALLINT ,
+ort_der_hzb SMALLINT ,
+staat_der_hzb INTEGER ,
+hzbart_int CHAR(10) ,
+hzbart SMALLINT ,
+pseudonym VARCHAR(255) ,
+sem_der_pruefung SMALLINT ,
+sem_der_pruefung_tsg SMALLINT ,
+sem_d_abg_pruefung SMALLINT ,
+sem_d_abg_pruefung_tsg SMALLINT ,
+d_abg_pruefung DATE ,
+d_abg_pruefung_tsg DATE ,
+stichtag INTEGER ,
+tid_stg INTEGER ,
+--Studiengang einzeln:
+ch35_ang_abschluss CHAR(10) ,
+ ch30_fach CHAR(10),
+ ch39_vertief CHAR(10),
+ schwerpunkt CHAR(10),
+ kz_fach CHAR(10),
+ stort CHAR(10),
+ stutyp CHAR(10),
+ pversion integer,
+ spo_version CHAR(10),
+ spo_version_tsg CHAR(10),
+ studienidentifikator varchar(255),
+ studienidentifikator_tsg varchar(255),
+--Ende Studiengang
+stufrm CHAR(10) ,
+stuart CHAR(10) ,
+regel SMALLINT ,
+pordnr INTEGER ,
+studiengang_nr SMALLINT ,
+fach_nr SMALLINT ,
+st_studium_nr INTEGER ,
+st_studium_nr_tsg INTEGER ,
+st_studium_nr_tmp INTEGER , --wird später zum st_studium_nr und st_studium_nr_tsg
+fach_sem_zahl decimal(10,2) ,
+fach_sem_zahl_tsg SMALLINT ,
+part CHAR(10) ,
+leistungs_id INTEGER ,
+pnr INTEGER ,
+pversuch INTEGER ,
+sourcesystem INTEGER ,
+pvermerk CHAR(10) ,
+note decimal(8,2) ,
+note_tsg decimal(8,2) ,
+notenskala CHAR(10) ,
+pstatus CHAR(10) ,
+pstatus_tsg CHAR(10) ,
+prueck SMALLINT ,
+ects FLOAT ,
+ects_tsg FLOAT ,
+summe INTEGER ,
+studiengangstyp char(10),
+abschnitt smallint,
+bezugssemester integer,
+pdatumsfeld date,
+fach_abschlussarbeit CHAR(10)
+)
+;
+
+
+-- Zuerst werden die lab-Sätze temporär gespeichert und um das Semester laut Prüfungsdatum ergänzt.
+INSERT INTO tmp_abp_aggr(
+ matrikel_nr,
+ -- alter,
+ -- geschlecht,
+ -- ca12_staat,
+ -- ort_der_hzb,
+ -- staat_der_hzb,
+ -- hzbart_int,
+ -- hzbart,
+-- pseudonym,
+ sem_der_pruefung,
+ sem_der_pruefung_tsg,
+-- sem_d_abg_pruefung,
+-- sem_d_abg_pruefung_tsg,
+ d_abg_pruefung,
+ d_abg_pruefung_tsg,
+ stichtag,
+-- tid_stg,
+ stufrm,
+ stuart,
+-- regel,
+ pordnr,
+ studiengang_nr,
+ fach_nr,
+ studienidentifikator ,
+ studienidentifikator_tsg,
+-- st_studium_nr,
+-- st_studium_nr_tsg,
+st_studium_nr_tmp,
+st_studium_nr_tsg,
+ fach_sem_zahl,
+ fach_sem_zahl_tsg,
+ part,
+ leistungs_id,
+ pnr,
+ pversuch,
+ sourcesystem,
+ pvermerk,
+ note,
+ note_tsg,
+ notenskala,
+ pstatus,
+ pstatus_tsg,
+ prueck,
+ ects,
+ ects_tsg,
+ summe,
+ ch35_ang_abschluss,
+ ch30_fach,
+ ch39_vertief,
+ schwerpunkt,
+ kz_fach,
+ pversion,
+ spo_version,
+ spo_version_tsg,
+ stort,
+ stutyp,
+ abschnitt,
+ studiengangstyp,
+bezugssemester ,
+pdatumsfeld,
+fach_abschlussarbeit
+)
+SELECT
+ matrikel_nr,
+ -- alter,
+ -- geschlecht,
+ -- ca12_staat,
+ -- ort_der_hzb,
+ -- staat_der_hzb,
+ -- hzbart_int,
+ -- hzbart,
+ -- pseudonym,
+ sem_der_pruefung,
+ sem_der_pruefung_tsg,
+ d_abg_pruefung,
+ d_abg_pruefung_tsg,
+ I.tid as stichtag,
+-- tid_stg,
+ stufrm,
+ stuart,
+-- regel,
+ pordnr,
+ studiengang_nr,
+ fach_nr,
+ studienidentifikator ,
+ studienidentifikator_tsg,
+ degree_program_id as st_studium_nr_tmp,
+ degree_program_id_tsg as st_studium_nr_tsg,
+ fach_sem_zahl,
+ fach_sem_zahl_tsg,
+ part,
+ leistungs_id,
+ pnr,
+ pversuch,
+ sourcesystem,
+ pvermerk,
+ haupt_pruef_note as note,
+ note_tsg,
+ null::char(10) as notenskala, --TODO
+ pstatus,
+ pstatus_tsg,
+ prueck,
+ null::float as ects,--TODO
+ null::float as ects_tsg,--TODO
+ 1 as summe,
+ ch35_ang_abschluss,
+ ch30_fach,
+ ch39_vertief,
+ schwerpunkt,
+ kz_fach,
+ pversion,
+ spo_version,
+ spo_version_tsg,
+ stort,
+ stutyp,
+ (case when vor_haupt_pruefung='V' then 1
+ when vor_haupt_pruefung='H' then 2 end ) as abschnitt,
+ zeitabschnitt,
+${bezugssemester_cond} as bezugssemester ,
+${pdatumsfeld_cond} as pdatumsfeld,
+fach_abschlussarbeit
+FROM
+ msg_abp L, sos_stichtag I
+
+WHERE I.appl_key='2' --Prüfungen tagesaktuell
+and vor_haupt_pruefung in ('H','V')
+and L.matrikel_nr <= ${matrikelnr_max}
+<#if matrikelnr_min != 0 >
+ AND L.matrikel_nr >= ${matrikelnr_min}
+#if>
+and sourcesystem=${Quellsystem_var}
+--hier noch keine Filterung aufs Startsemester, erst später
+;
+--denormalize:
+
+
+--TODO: Abschnitt=1 (Zwischenprüfung ermitteln)
+
+update tmp_abp_aggr set st_studium_nr=st_studium_nr_tmp
+--where studiengangstyp in ('ESG','MSG')
+;
+
+--für TSG die studium_nr aus dem MSG nachladen:
+update tmp_abp_aggr set st_studium_nr=A.degree_program_id,
+spo_version=A.spo_version
+from msg_abp A, sos_labzuord L
+where L.labnr=tmp_abp_aggr.leistungs_id
+and L.labnrzu=A.leistungs_id
+and tmp_abp_aggr.studiengangstyp='TSG'
+and tmp_abp_aggr.st_studium_nr is null;
+
+
+UPDATE tmp_abp_aggr
+SET sem_d_abg_pruefung = (
+ SELECT min(tid) FROM semester S
+ WHERE d_abg_pruefung BETWEEN S.sem_beginn AND S.sem_ende
+)
+WHERE d_abg_pruefung IS NOT NULL;
+
+UPDATE tmp_abp_aggr
+SET sem_d_abg_pruefung_tsg = (
+ SELECT min(tid) FROM semester S
+ WHERE d_abg_pruefung_tsg BETWEEN S.sem_beginn AND S.sem_ende
+)
+WHERE d_abg_pruefung_tsg IS NOT NULL;
+
+
+-- Wenn Datum nicht gefüllt ist, dann wird Originalsemester (psem) genommen:
+UPDATE tmp_abp_aggr
+SET sem_d_abg_pruefung = sem_der_pruefung
+WHERE sem_d_abg_pruefung IS NULL;
+
+UPDATE tmp_abp_aggr
+SET sem_d_abg_pruefung_tsg = sem_der_pruefung_tsg
+WHERE sem_d_abg_pruefung_tsg IS NULL;
+
+
+SELECT now(),'Persondaten ermitteln:' FROM xdummy;
+
+
+UPDATE tmp_abp_aggr
+SET d_geburt =S.d_geburt,
+ geschlecht = S.geschlecht,
+ ca12_staat = S.ca12_staat,
+ hzbart_int = S.hzbart
+FROM sos_sos S
+WHERE
+ S.matrikel_nr = tmp_abp_aggr.matrikel_nr
+ ;
+
+update tmp_abp_aggr set alter = trunc((E.sem_beginn-tmp_abp_aggr.d_geburt) / 365.25 , 0)
+from semester E
+where E.tid=tmp_abp_aggr.sem_d_abg_pruefung
+and tmp_abp_aggr.studiengangstyp in ('ESG','MSG');
+
+update tmp_abp_aggr set alter = trunc((E.sem_beginn-tmp_abp_aggr.d_geburt) / 365.25 , 0)
+from semester E
+where E.tid=tmp_abp_aggr.sem_d_abg_pruefung_tsg
+and tmp_abp_aggr.studiengangstyp='TSG';
+
+
+
+<#if SOS_MTKNR_EXT = 1>
+ update tmp_abp_aggr set pseudonym=M.pseudonym
+ from sos_mtknr_ext M where M.matrikel_nr = tmp_abp_aggr.matrikel_nr;
+
+#if>
+
+SELECT now(),'hzbart ermitteln:' FROM xdummy;
+
+UPDATE tmp_abp_aggr SET hzbart = (
+ SELECT grupp
+ FROM k_hzbart
+ WHERE hzbart = tmp_abp_aggr.hzbart_int
+);
+
+update tmp_abp_aggr set
+ ort_der_hzb=S.hzbkfz
+from sos_sos S
+where S.matrikel_nr=tmp_abp_aggr.matrikel_nr
+and today() between S.gueltig_von and S.gueltig_bis
+and S.hzbkfzkz=0;
+update tmp_abp_aggr set
+ staat_der_hzb=S.hzbkfz
+from sos_sos S
+where S.matrikel_nr=tmp_abp_aggr.matrikel_nr
+and today() between S.gueltig_von and S.gueltig_bis
+and S.hzbkfzkz=1;
+
+-- Tid-stg ermitteln:
+SELECT now(),'Tid-stg ermitteln:' FROM xdummy;
+
+-- erster Durchgang: alle Angaben stimmen überein
+-- [Vorsicht: ein gleichen Studiengängen an 2 Standorten kommen zwei Sätze raus.
+UPDATE tmp_abp_aggr
+SET tid_stg = (
+ SELECT min(tid)
+ FROM
+ lehr_stg_ab L
+ WHERE
+ tmp_abp_aggr.ch30_fach = L.stg
+ AND tmp_abp_aggr.ch39_vertief = L.vertfg
+ AND tmp_abp_aggr.ch35_ang_abschluss = L.abschluss
+ AND tmp_abp_aggr.pversion = L.pversion
+ AND tmp_abp_aggr.schwerpunkt = L.schwerpunkt
+ --AND L.semester_von <= tmp_abp_aggr.sem_der_pruefung
+ --AND L.semester_bis >= tmp_abp_aggr.sem_der_pruefung
+ AND L.kz_fach = tmp_abp_aggr.kz_fach
+ AND L.stort = tmp_abp_aggr.stort
+ AND L.stutyp = tmp_abp_aggr.stutyp
+);
+
+UPDATE tmp_abp_aggr
+SET tid_stg = (
+ SELECT min(tid)
+ FROM
+ lehr_stg_ab L
+ WHERE
+ tmp_abp_aggr.ch30_fach = L.stg
+ AND tmp_abp_aggr.ch39_vertief = L.vertfg
+ AND tmp_abp_aggr.ch35_ang_abschluss = L.abschluss
+ --AND L.semester_von <= tmp_abp_aggr.sem_der_pruefung
+ --AND L.semester_bis >= tmp_abp_aggr.sem_der_pruefung
+ AND L.kz_fach = tmp_abp_aggr.kz_fach
+ AND L.stort = tmp_abp_aggr.stort
+ AND L.stutyp = tmp_abp_aggr.stutyp
+)
+WHERE tid_stg IS NULL;
+
+UPDATE tmp_abp_aggr
+SET tid_stg = (
+ SELECT min(tid)
+ FROM
+ lehr_stg_ab L
+ WHERE
+ tmp_abp_aggr.ch30_fach = L.stg
+ AND tmp_abp_aggr.ch39_vertief = L.vertfg
+ AND tmp_abp_aggr.ch35_ang_abschluss = L.abschluss
+ AND tmp_abp_aggr.pversion = L.pversion
+ AND tmp_abp_aggr.schwerpunkt = L.schwerpunkt
+ --AND L.semester_von <= tmp_abp_aggr.sem_der_pruefung
+ --AND L.semester_bis >= tmp_abp_aggr.sem_der_pruefung
+ AND L.kz_fach = tmp_abp_aggr.kz_fach
+ AND L.stutyp = tmp_abp_aggr.stutyp
+)
+WHERE tid_stg IS NULL;
+
+UPDATE tmp_abp_aggr
+SET tid_stg = (
+ SELECT min(tid)
+ FROM
+ lehr_stg_ab L
+ WHERE
+ tmp_abp_aggr.ch30_fach = L.stg
+ AND tmp_abp_aggr.ch39_vertief = L.vertfg
+ AND tmp_abp_aggr.ch35_ang_abschluss = L.abschluss
+ AND tmp_abp_aggr.schwerpunkt = L.schwerpunkt
+ --AND L.semester_von <= tmp_abp_aggr.sem_der_pruefung
+ --AND L.semester_bis >= tmp_abp_aggr.sem_der_pruefung
+ AND L.kz_fach = tmp_abp_aggr.kz_fach
+ AND L.stutyp = tmp_abp_aggr.stutyp
+)
+WHERE tid_stg IS NULL;
+
+UPDATE tmp_abp_aggr
+SET tid_stg = (
+ SELECT min(tid)
+ FROM
+ lehr_stg_ab L
+ WHERE
+ tmp_abp_aggr.ch30_fach = L.stg
+ AND tmp_abp_aggr.ch39_vertief = L.vertfg
+ AND tmp_abp_aggr.ch35_ang_abschluss = L.abschluss
+ --AND L.semester_von <= tmp_abp_aggr.sem_der_pruefung
+ --AND L.semester_bis >= tmp_abp_aggr.sem_der_pruefung
+ AND L.kz_fach = tmp_abp_aggr.kz_fach
+ AND L.stutyp = tmp_abp_aggr.stutyp
+ )
+WHERE tid_stg IS NULL;
+
+--jetzt ohne stutyp:
+UPDATE tmp_abp_aggr
+SET tid_stg = (
+ SELECT min(tid)
+ FROM
+ lehr_stg_ab L
+ WHERE
+ tmp_abp_aggr.ch30_fach = L.stg
+ AND tmp_abp_aggr.ch39_vertief = L.vertfg
+ AND tmp_abp_aggr.ch35_ang_abschluss = L.abschluss
+ --AND L.semester_von <= tmp_abp_aggr.sem_der_pruefung
+ ---AND L.semester_bis >= tmp_abp_aggr.sem_der_pruefung
+ AND L.kz_fach = tmp_abp_aggr.kz_fach
+ --AND L.stutyp = tmp_abp_aggr.stutyp
+ )
+WHERE tid_stg IS NULL;
+
+insert into sos_pruefrout
+(
+tabelle,
+tabelle_sos,
+matrikel_nr,
+semester,
+problem,
+aktion
+)
+select
+'msg_abp_aggr',
+'lab',
+matrikel_nr,
+bezugssemester,
+'Studiengang unbekannt, Hauptprüfung wird gelöscht',
+'Warnung'
+from tmp_abp_aggr
+where tid_stg is null
+and bezugssemester >= ${K_SOS_start_lab}
+;
+
+update tmp_abp_aggr set regel=L.regel
+from lehr_stg_ab L
+where L.tid=tmp_abp_aggr.tid_stg;
+
+
+
+-- neu zu ladende Datensätze aus der 'msg_abp_aggr' entfernen
+DELETE FROM
+ msg_abp_aggr
+WHERE
+--Hauptprüfungen bei Stichtagsbezug nur laden wenn Startsemester gesetzt ist,
+--Tagesaktuelle Daten werden immer geladen:
+(
+ bezugssemester >= ${K_SOS_start_lab}
+ AND sourcesystem = ${Quellsystem_var}
+ AND bezugssemester >= (
+ SELECT T.einfriersemester
+ FROM sos_stichtag T
+ WHERE T.tid = msg_abp_aggr.stichtag
+ )
+)
+OR
+(
+ stichtag = ${stichtag_tagesaktuell_var}
+ AND sourcesystem = ${Quellsystem_var}
+ AND bezugssemester >= (
+ SELECT T.einfriersemester
+ FROM sos_stichtag T
+ WHERE T.tid = msg_abp_aggr.stichtag
+ )
+)
+;
+
+
+-- Zuerst stichtagsbezogen füllen
+SELECT now(),'Prüfungsdatum nach Stichtag?' FROM xdummy;
+
+INSERT INTO msg_abp_aggr(
+ ${target_fields_except_stichtag} ,
+ stichtag
+)
+SELECT
+ ${target_fields_except_stichtag} ,
+ D.stichtag
+FROM tmp_abp_aggr P, sos_stichtag ST, sos_stichtag_datum D
+WHERE
+ ST.tid = D.stichtag
+ AND D.semester = P.bezugssemester
+ AND ST.stichtagsart = 'Prüfungen'
+ AND (
+ ST.appl_key NOT IN ('2', '3')
+ OR ST.appl_key IS NULL
+ ) --(2,3) sind "kein Stichtag/parstg-Stichtag"
+ -- Hauptprüfungen nur laden wenn Startsemester gesetzt ist,
+ AND P.bezugssemester >= ${K_SOS_start_lab}
+
+ AND P.bezugssemester >= ST.einfriersemester
+ and D.datum >= P.pdatumsfeld;
+
+
+-- Nur die tagesaktuellen Zahlen, haben in Stichtag eine 2
+SELECT now(),'Nun die tagesaktuallen Zahlen' FROM xdummy;
+
+INSERT INTO msg_abp_aggr(
+ ${target_fields_except_stichtag} ,
+ stichtag
+)
+SELECT
+ ${target_fields_except_stichtag} ,
+ ST.tid as stichtag
+FROM
+ tmp_abp_aggr P, sos_stichtag ST
+WHERE
+ ${stichtag_tagesaktuell} = ST.tid
+ AND bezugssemester >= ST.einfriersemester
+ ;
+
+
+
+DROP TABLE tmp_abp_aggr;
+
+SELECT
+ now(),
+ 'Anzahl Sätze in msg_abp_aggr:'::CHAR(30),
+ count(*)
+FROM msg_abp_aggr
+GROUP BY 1,2;
+
+#if>
diff --git a/src-modules/module/msg/hilfstabellen/msg_abp_aggr_gew_fuellen.sql b/src-modules/module/msg/hilfstabellen/msg_abp_aggr_gew_fuellen.sql
new file mode 100644
index 0000000..f31c41c
--- /dev/null
+++ b/src-modules/module/msg/hilfstabellen/msg_abp_aggr_gew_fuellen.sql
@@ -0,0 +1,626 @@
+--freemarker template
+
+--(c) 2024 Daniel Quathamer
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'pruef_sem_zahl_decimal';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'Start_POS_Semester';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'matrikelnr_min';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'matrikelnr_max';
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'SOS_status_prom';
+
+
+SELECT tid FROM sos_stichtag WHERE appl_key = '2';
+
+
+SELECT 1 FROM xdummy WHERE 0 !=
+ (SELECT count(*) FROM konstanten WHERE beschreibung = 'SOS_MTKNR_EXT' AND apnr = 1)
+UNION
+SELECT 0 FROM xdummy WHERE 0 =
+ (SELECT count(*) FROM konstanten WHERE beschreibung = 'SOS_MTKNR_EXT' AND apnr = 1);
+
+
+SELECT apnr FROM konstanten WHERE beschreibung = 'SOS_Quellsystem';
+
+
+select 1 from xdummy where 3=(select max(mod(tid,10)) from semester)
+union
+select 0 from xdummy where 3!=(select max(mod(tid,10)) from semester)
+;
+
+
+select apnr from konstanten where beschreibung='SOS_start_lab_gew'
+
+select count(*) from sos_gewichtungsvariante; -- für Anpassungen der Sichten im Konnektorlauf genutzt
+
+> */
+ /* union select -1 from xdummy where <>=-1 */ ]]>
+
+ >) */
+ <#if !Maskennummer?exists>and sem_der_pruefung>=${K_SOS_start_lab_gew}#if>
+ order by 1 desc]]>
+ >) */]]>
+ >) */
+order by student_weighting_variant_id,sortorder;]]>
+
+ select tid from sos_stichtag where appl_key='5';
+
+
+-- Falls es Konstanten nicht gibt, Defaultwert:
+<#assign p_start_pos_sem = 19001 />
+<#if p_start_pos_sem_var?exists && p_start_pos_sem_var?string?length > 0>
+<#assign p_start_pos_sem = p_start_pos_sem_var />
+#if>
+
+-- Sollen Fachsem. dezimal berechnet werden, d.h. relativ zum Prüfungsdatum?
+-- Falls Variable nicht belegt, default 0 (Ganzzahlig)
+<#assign p_pruef_sem_zahl_decimal = 0 />
+<#if p_pruef_sem_zahl_decimal_var?exists && p_pruef_sem_zahl_decimal_var?string?length > 0>
+<#assign p_pruef_sem_zahl_decimal = p_pruef_sem_zahl_decimal_var />
+#if>
+
+<#assign matrikelnr_min = 0 />
+<#if matrikelnr_min_var?exists && matrikelnr_min_var?string?length > 0>
+<#assign matrikelnr_min = matrikelnr_min_var />
+#if>
+
+<#assign matrikelnr_max = 2147483647 />
+<#if matrikelnr_max_var?exists && matrikelnr_max_var?string?length > 0>
+<#assign matrikelnr_max = matrikelnr_max_var />
+#if>
+
+<#assign p_promotion = 6 />
+<#if p_promotion_var?exists && p_promotion_var?string?length > 0>
+<#assign p_promotion = p_promotion_var />
+#if>
+
+<#assign stichtag_tagesaktuell = 0 />
+<#if stichtag_tagesaktuell_var?exists && stichtag_tagesaktuell_var?string?length > 0>
+<#assign stichtag_tagesaktuell = stichtag_tagesaktuell_var />
+#if>
+<#if istTrimester==1>
+<#assign Trimester="true" />
+<#else>
+<#assign Trimester="false" />
+#if>
+
+<#assign bezugssemester_cond="(case when part='TSAB' then sem_der_pruefung_exa else sem_der_pruefung end)" />
+<#assign pdatumsfeld_cond="(case when part='TSAB' then d_abg_pruefung_exa else d_abg_pruefung end)" />
+
+<#assign target_fields_except_stichtag_summe=" matrikel_nr,
+alter,
+geschlecht,
+ca12_staat,
+ort_der_hzb,
+staat_der_hzb,
+hzbart_int,
+hzbart,
+pseudonym,
+sem_der_pruefung,
+sem_der_pruefung_tsg,
+sem_d_abg_pruefung,
+sem_d_abg_pruefung_tsg,
+d_abg_pruefung,
+d_abg_pruefung_tsg,
+bezugssemester,
+tid_stg,
+stufrm,
+stuart,
+--regel,
+pordnr,
+studiengang_nr,
+fach_nr,
+st_studium_nr,
+st_studium_nr_tsg,
+fach_sem_zahl,
+fach_sem_zahl_tsg,
+part,
+leistungs_id,
+pnr,
+pversuch,
+sourcesystem,
+pvermerk,
+note,
+note_tsg,
+notenskala,
+pstatus,
+pstatus_tsg,
+prueck,
+--ects,
+ects_tsg,
+studiengangstyp,
+abschnitt,
+fach_abschlussarbeit
+" />
+
+
+<#if Quellsystem_var=15>
+
+
+SELECT 'Matrikelnr. Max: ${matrikelnr_max} '::CHAR(30) FROM xdummy;
+SELECT 'Matrikelnr. Min: ${matrikelnr_min} '::CHAR(30) FROM xdummy;
+SELECT 'SOS_MTKNR_EXT: ${SOS_MTKNR_EXT} '::CHAR(30) FROM xdummy;
+SELECT 'Startsemester ${K_SOS_start_lab}'::CHAR(30) FROM xdummy;
+SELECT 'Startsemester Vorsemester ${K_SOS_start_lab_vorsemester}'::CHAR(30) FROM xdummy;
+
+SELECT now(),'Anzahl Sätze in msg_abp_aggr_gew:'::CHAR(30),count(*) FROM msg_abp_aggr GROUP BY 1,2;
+
+<#macro sos_gew_restrict type field operator values>
+ and (
+ <#list values?split("|") as item>
+${field}${operator}<#if type=='char'>'#if>${item}<#if type=='char'>'#if> <#if item_has_next> <#if operator="<>">and<#else>or#if> #if>#list>
+ )
+#macro>
+
+<#macro sos_gew_restrictions regel>
+ -- has_content liefert seltsamerweise false auch wenn Gewicht Wert enthält, daher hier mit length gearbeitet
+ where 1=1
+ <#if regel.weighting_ident_list?length>0> <@sos_gew_restrict type="char" field="gewichtungs_ident" operator=regel.weighting_ident_operator_id values=regel.weighting_ident_list/>#if>
+ <#if regel.degree_counter_list?length>0> <@sos_gew_restrict type="integer" field="studiengang_nr" operator=regel.degree_counter_operator_id values=regel.degree_counter_list/>#if>
+ <#if regel.subject_counter_list?length>0> <@sos_gew_restrict type="integer" field="fach_nr" operator=regel.subject_counter_operator_id values=regel.subject_counter_list/>#if>
+ <#if regel.subject_count_list?length>0> <@sos_gew_restrict type="integer" field="fachanzahl" operator=regel.subject_count_operator_id values=regel.subject_count_list/>#if>
+ <#if regel.degree_count_list?length>0> <@sos_gew_restrict type="integer" field="abschlussanzahl" operator=regel.degree_count_operator_id values=regel.degree_count_list/>#if>
+ <#if regel.ects_list?length>0> <@sos_gew_restrict type="integer" field="ects" operator=regel.ects_operator_id values=regel.ects_list/>#if>
+ <#if regel.teaching_unit_list?length>0> <@sos_gew_restrict type="char" field="lehr" operator=regel.teaching_unit_operator_id values=regel.teaching_unit_list/>#if>
+ <#if regel.department_list?length>0> <@sos_gew_restrict type="char" field="fb" operator=regel.department_operator_id values=regel.department_list/>#if>
+ <#if regel.subject_list?length>0> <@sos_gew_restrict type="char" field="ch30_fach" operator=regel.subject_operator_id values=regel.subject_list/>#if>
+ <#if regel.degree_list?length>0> <@sos_gew_restrict type="char" field="ch35_ang_abschluss" operator=regel.degree_operator_id values=regel.degree_list/>#if>
+ <#if regel.subject_indicator_list?length>0> <@sos_gew_restrict type="char" field="kz_fach" operator=regel.subject_indicator_operator_id values=regel.subject_indicator_list/>#if>
+ <#if regel.type_of_study_list?length>0> <@sos_gew_restrict type="char" field="stuart" operator=regel.type_of_study_operator_id values=regel.type_of_study_list/>#if>
+ <#if regel.form_of_study_list?length>0> <@sos_gew_restrict type="char" field="stufrm" operator=regel.form_of_study_operator_id values=regel.form_of_study_list/>#if>
+#macro>
+
+<#macro sos_gew_updates table regel>
+ <#switch regel.k_student_weighting_action_type_id?number>
+ <#case 5>
+-- Normierung je Matrikelnummer
+ truncate table tmp_zaehlung;
+insert into tmp_zaehlung(matrikel_nr,gewichtsumme)
+select matrikel_nr,sum(gewicht) from ${table} group by 1;
+update ${table} set gewichtsumme=(select sum(gewichtsumme) from tmp_zaehlung where ${table}.matrikel_nr=tmp_zaehlung.matrikel_nr);
+update ${table} set gewicht= gewicht/gewichtsumme <@sos_gew_restrictions regel=regel/> and gewichtsumme!=0;
+ <#break>
+ <#case 4>
+ -- Normierung je Matrikelnummer und Fach
+ truncate table tmp_zaehlung;
+insert into tmp_zaehlung(matrikel_nr,studiengang_nr,gewichtsumme)
+select matrikel_nr,studiengang_nr,sum(gewicht) from ${table} group by 1,2;
+update ${table} set gewichtsumme_pro_abschluss=(select sum(gewichtsumme) from tmp_zaehlung where ${table}.matrikel_nr=tmp_zaehlung.matrikel_nr
+and ${table}.studiengang_nr=tmp_zaehlung.studiengang_nr);
+ update ${table} set gewicht=gewicht/gewichtsumme_pro_abschluss <@sos_gew_restrictions regel=regel/> and gewichtsumme_pro_abschluss!=0;
+ <#break>
+ <#default>
+<#if regel.weight?length>0>
+ update ${table} set gewicht=<#if regel.k_student_weighting_weight_usage_type_id?number=2>gewicht*#if>${regel.weight?string?replace(',','.')} <@sos_gew_restrictions regel=regel/>;
+#if>
+ #switch>
+
+ <#assign new_a_needed=false/>
+ update ${table} set dummy1=0
+ <#if regel.new_weighting_ident?length>0> , gewichtungs_ident='${regel.new_weighting_ident?replace("\x0027","\x0027\x0027")}'#if>
+ <#if regel.new_degree_counter?length>0>,studiengang_nr=${regel.new_degree_counter} <#assign new_a_needed=true/>#if>
+ <#if regel.new_subject_counter?length>0>, fach_nr=${regel.new_subject_counter} <#assign new_a_needed=true/>#if>
+ <#if regel.newects?length>0> , ects=${regel.newects} <#assign new_a_needed=true/> #if>
+ <#if regel.new_degree?length>0> , ch35_ang_abschluss='${regel.new_degree}' <#assign new_a_needed=true/> #if>
+ <#if regel.new_teaching_unit?length>0> , lehr='${regel.new_teaching_unit}' <#assign new_a_needed=true/> #if>
+ <#if regel.new_department?length>0> , fb='${regel.new_department}' <#assign new_a_needed=true/> #if>
+ <#if regel.new_subject?length>0> ,ch30_fach='${regel.new_subject}' <#assign new_a_needed=true/>#if>
+ <#if regel.new_subject_indicator?length>0> , kz_fach='${regel.new_subject_indicator}' <#assign new_a_needed=true/>#if>
+ <#if regel.new_type_of_study?length>0> , stuart='${regel.new_type_of_study}' <#assign new_a_needed=true/> #if>
+ <#if regel.new_form_of_study?length>0> ,stufrm='${regel.new_form_of_study}' <#assign new_a_needed=true/> #if>
+ <#if new_a_needed>, artifical_id=null#if>
+ ,dummy2=0 <@sos_gew_restrictions regel=regel/>;
+
+#macro>
+
+<#macro update_art_id>
+'fb:'||fb||'l:'||lehr||'stg:'||ch30_fach||'ab:'||ch35_ang_abschluss||'v:'||trim(nvl(ch39_vertief,'n'::char(1)))||'s:'||trim(nvl(schwerpunkt,'n'::char(1)))||'p:'||pversion||'k:'||trim(nvl(kz_fach,'n'::char(1)))||'s:'||trim(nvl(stort,'n'::char(1)))||'von:'||semester_von||'bis:'||semester_bis
+#macro>
+
+<#compress> --entfernt whitespace
+
+ <#if !Maskennummer?exists> -- wenn das Script nachts ausgeführt wird
+ --delete from sos_stg_aggr where summe=0;
+ <#assign durchfuehrungsart="konnektorlauf"/>
+ <#else>
+ <#assign durchfuehrungsart="<>"?replace("'","")/>
+ #if>
+
+ <#assign target_lehr_stg_ab="lehr_stg_ab_gew"/>
+
+ <#if "Tabellenerzeugung"!="">
+
+ <#if !Maskennummer?exists>
+ truncate table msg_abp_aggr_gew; --wenn im Browser läuft wird unten sicherheitshalber noch mal delete pro gewichtung/semester/stichtag gemacht
+ #if>
+ create temp table tmp_regelord (tid serial,dummy integer);
+ create temp table tmp_zaehlung (matrikel_nr integer,abschlussanzahl integer default 0,studiengang_nr integer,fachanzahl integer default 0,
+ gewichtsumme decimal(19,6)) <@informixnolog/>;
+ create index tmp_iz1 on tmp_zaehlung (matrikel_nr);
+
+ CREATE TEMP TABLE tmp_sos
+ (
+ --aus msg_abp_aggr
+ matrikel_nr INTEGER ,
+ alter decimal(14,2) ,
+ geschlecht SMALLINT ,
+ ca12_staat SMALLINT ,
+ ort_der_hzb SMALLINT ,
+ staat_der_hzb INTEGER ,
+ hzbart_int CHAR(10) ,
+ hzbart SMALLINT ,
+ pseudonym VARCHAR(255) ,
+ sem_der_pruefung SMALLINT ,
+ sem_der_pruefung_tsg SMALLINT ,
+ sem_d_abg_pruefung SMALLINT ,
+ sem_d_abg_pruefung_tsg SMALLINT ,
+ bezugssemester SMALLINT ,
+ d_abg_pruefung DATE ,
+ d_abg_pruefung_tsg DATE ,
+ stichtag INTEGER ,
+ tid_stg INTEGER ,
+ stufrm CHAR(10) ,
+ stuart CHAR(10) ,
+ regel SMALLINT ,
+ pordnr INTEGER ,
+ studiengang_nr SMALLINT ,
+ fach_nr SMALLINT ,
+ st_studium_nr INTEGER ,
+ st_studium_nr_tsg INTEGER ,
+ fach_sem_zahl decimal(10,2) ,
+ fach_sem_zahl_tsg SMALLINT ,
+ abschnitt SMALLINT ,
+ studiengangstyp CHAR(10) ,
+ part CHAR(10) ,
+ leistungs_id INTEGER ,
+ pnr INTEGER ,
+ pversuch INTEGER ,
+ sourcesystem INTEGER ,
+ pvermerk CHAR(10) ,
+ note decimal(8,2) ,
+ note_tsg decimal(8,2) ,
+ notenskala CHAR(10) ,
+ pstatus CHAR(10) ,
+ pstatus_tsg CHAR(10) ,
+ prueck SMALLINT ,
+ ects FLOAT ,
+ ects_tsg FLOAT ,
+ summe INTEGER ,
+ ch30_fach char(10),
+ ch35_ang_abschluss char(10),
+ ch39_vertief char(10),
+ schwerpunkt char(10),
+ pversion integer,
+ kz_fach char(10),
+ stort char(10),
+ lehr char(10),
+ -- weitere Feld aus lehr_stg_ab
+ semester_von integer,
+ semester_bis integer ,
+ text char(255),
+ fach_zaehler smallint,anteil decimal(3,2), abstgvnr integer,
+ --bis hier
+ stichtagname varchar(255),
+ fachname varchar(255),
+ abschlussname varchar(255),
+ gewicht decimal(19,6) default 1,
+ gewichtungs_ident varchar(255),
+ original_fb char(10),-- falls der FB geändert wird, wird hiermit kontrolliert, ob überhaupt auf einen anderen FB geändert
+ fb char(10),
+ fachanzahl integer,
+ abschlussanzahl integer,
+ --datensatzanzahl integer,
+ gewichtsumme decimal(19,6),
+ gewichtsumme_pro_abschluss decimal(19,6),
+ regelord integer default 0,
+ dummy1 smallint,
+ dummy2 smallint,
+ artifical_id varchar(255),
+ fach_abschlussarbeit char(10)
+ )
+ ;
+ create index tmp_ix0 on tmp_sos (gewichtungs_ident);
+ create index tmp_ix1 on tmp_sos (studiengang_nr);
+ create index tmp_ix2 on tmp_sos (fach_nr);
+ create index tmp_ix3 on tmp_sos (fachanzahl);
+ create index tmp_ix4 on tmp_sos (abschlussanzahl);
+ create index tmp_ix5 on tmp_sos (ects);
+ create index tmp_ix7 on tmp_sos (fb);
+
+ create index tmp_ix11 on tmp_sos (stuart);
+ create index tmp_ix12 on tmp_sos (stufrm);
+ create index tmp_ix13 on tmp_sos (matrikel_nr);
+
+ create index tmp_ix15 on tmp_sos (artifical_id);
+ #if> --wenn "Tabellenerzeugung"!=""
+
+
+ <#foreach gewichtung in gewichtungen>
+ --war hier:truncate table tmp_sos;
+ select setval('${target_lehr_stg_ab}_tid_neu_seq', (select max(tid)+1 from ${target_lehr_stg_ab}));
+ <#foreach einStichtag in stichtage>
+ select 'Stichtag: ${einStichtag.id}' from xdummy;
+
+ <#foreach einSemester in semester>
+ select 'Semester: ${einSemester.id}' from xdummy;
+ --jetzt hier
+ truncate table tmp_sos;
+ <#if "tmp_sos fuellen"!="">
+ INSERT INTO tmp_sos (
+ ${target_fields_except_stichtag_summe},
+ summe,
+ ch30_fach,
+ ch35_ang_abschluss,
+ ch39_vertief,
+ schwerpunkt,
+ pversion ,
+ stort,
+ kz_fach,
+ lehr ,
+ original_fb,
+ fb,
+ semester_von,
+ semester_bis,
+ text,
+ fach_zaehler ,
+ anteil,
+ abstgvnr,
+ --ects,
+ gewichtungs_ident --,
+ --stutyp
+ )
+ SELECT ${target_fields_except_stichtag_summe},
+ summe,
+ L.stg as ch30_fach,
+ L.abschluss as ch35_ang_abschluss,
+ L.vertfg as ch39_vertief,
+ L.schwerpunkt,
+ L.pversion ,
+ L.stort,
+ L.kz_fach,
+ L.lehr ,
+ L.fb,
+ L.fb,
+ L.semester_von,
+ L.semester_bis,
+ L.text,
+ L.fach_zaehler ,
+ L.anteil,
+ L.abstgvnr,
+ --L.ects,
+ 'Default' as gewichtungs_ident
+
+ FROM msg_abp_aggr S, lehr_stg_ab_gew L
+ WHERE
+ S.abschnitt in (1,2) and --nur Haupt und Vorprüfungen
+ <#assign semester_feld="bezugssemester" />
+ <#assign stichtag_filter="stichtag = "+ einStichtag.id/>
+
+ <#if einStichtag.id?string = sembez_daten?string >
+ <#assign semester_feld="bezugssemester" />
+ <#assign stichtag_filter="stichtag = 2" />
+ #if>
+ S.${semester_feld}=${einSemester.id} and
+ ${stichtag_filter}
+ and S.tid_stg=L.tid
+ <#if Maskennummer?exists&&"<>"!=''> and 's_' || L.tid in <@printkeys Studiengang.allNeededKeysList/> #if>
+ <#if Maskennummer?exists&&"<>"!=''> and L.abschluss in (<>) #if>
+ <#if Maskennummer?exists&&"<>"!=''> and L.kz_fach = <> #if>
+ <#if Maskennummer?exists&&"<>"!=''> and stufrm = <> #if>
+
+ <#if Matrikelnr?exists>
+ /* and matrikel_nr in (${Matrikelnr?replace("'","")}) -- <>) */
+ #if>
+ ;
+ --TODO ects evtl direkt aus lehr_stg_ab
+ update tmp_sos set artifical_id=<@update_art_id/> where artifical_id is null;
+
+ #if>--wenn "tmp_sos fuellen"!=""
+ <#if gewichtung.id!=-1> -- -1 heisst keine Gewichtung (für reine Vorschau)
+
+ <#foreach regel in gewichtungsregeln>
+ <#if regel.student_weighting_variant_id=gewichtung.id>
+ select 'Regel-ID:${regel.id}-${regel.name?replace("\x0027","\x0027\x0027")}' from xdummy;
+ insert into tmp_regelord (dummy) values (1);
+ truncate table tmp_zaehlung;
+ --aus Performancegründen nur wenn abschluss/fach-anzahl benötigt wird
+ <#if regel.degree_count_list?length>0||(Maskennummer?exists&&"<>"!=''&&!"<>"?starts_with('z.B.'))>
+ insert into tmp_zaehlung (matrikel_nr,abschlussanzahl)
+ select matrikel_nr,count(distinct studiengang_nr) from tmp_sos group by 1;
+ update tmp_sos set abschlussanzahl=(select sum(abschlussanzahl) from tmp_zaehlung where tmp_sos.matrikel_nr=tmp_zaehlung.matrikel_nr);
+
+ <#if Maskennummer?exists&&"<>"!=''&&!"<>"?starts_with('z.B.')>
+ delete from tmp_sos where not (abschlussanzahl <>);
+ #if>
+
+ #if>
+ <#if regel.subject_count_list?length>0||(Maskennummer?exists&&"<>"!=''&&!"<>"?starts_with('z.B.'))>
+ insert into tmp_zaehlung (matrikel_nr,studiengang_nr,fachanzahl)
+ select matrikel_nr,studiengang_nr,count(distinct ch30_fach) from tmp_sos group by 1,2;
+ update tmp_sos set fachanzahl=(select sum(fachanzahl) from tmp_zaehlung where tmp_sos.matrikel_nr=tmp_zaehlung.matrikel_nr and
+ tmp_sos.studiengang_nr=tmp_zaehlung.studiengang_nr);
+ <#if Maskennummer?exists&&"<>"!=''&&!"<>"?starts_with('z.B.')>
+ delete from tmp_sos where not (fachanzahl <>);
+ #if>
+ #if>
+ <#switch regel.k_student_weighting_action_type_id?number>
+ <#case 1> --überschreiben
+ <@sos_gew_updates table='tmp_sos' regel=regel/>;
+ <#break>
+ <#case 2> --kopieren
+ <@selectintotmp source="tmp_sos" target="tmp_kopie" select="*">
+ <@sos_gew_restrictions regel=regel/>
+ --and sem_der_pruefung=${einSemester.id}
+ --and stichtag=${einStichtag.id}
+ @selectintotmp> <@informixnolog/>;
+ <@sos_gew_updates table='tmp_kopie' regel=regel/>
+
+ update tmp_kopie set regelord=(select max(tid) from tmp_regelord);
+ insert into tmp_sos select * from tmp_kopie;
+ drop table tmp_kopie;
+ <#break>
+ <#case 3> --löschen
+ delete from tmp_sos <@sos_gew_restrictions regel=regel/> ;
+ <#break>
+
+ <#case 4>
+ -- Normierung nach Matrkelnr und Abschluss
+ <@sos_gew_updates table='tmp_sos' regel=regel/>;
+ <#break>
+ <#case 5>
+ -- Normierung nach Matrkelnr
+ <@sos_gew_updates table='tmp_sos' regel=regel/>;
+
+ <#break>
+ #switch>
+
+ #if> --wenn regel.student_weighting_variant_id=gewichtung.id
+ #foreach>
+ #if> --wenn gewichtung.id!=-1
+
+ <#if durchfuehrungsart="konnektorlauf">
+ update tmp_sos set artifical_id=<@update_art_id/> where artifical_id is null;
+ update tmp_sos set tid_stg=(select min(tid) from lehr_stg_ab_gew where tmp_sos.artifical_id=lehr_stg_ab_gew.artifical_id
+ -- bugfix #173885
+ and (lehr_stg_ab_gew.gewichtung_id is null or lehr_stg_ab_gew.gewichtung_id=${gewichtung.id})
+ );
+ --Gewichtung füllen
+ delete from msg_abp_aggr_gew where gewichtung_id=${gewichtung.id} and
+ ${semester_feld}=${einSemester.id} and stichtag=${einStichtag.id};
+ insert into msg_abp_aggr_gew ( ${target_fields_except_stichtag_summe},
+ stichtag,
+ gewichtung_id,
+ summe
+ )
+ select
+ ${target_fields_except_stichtag_summe},
+ ${einStichtag.id} ,
+ ${gewichtung.id},
+ gewicht
+ from tmp_sos;
+
+ #if>
+ #foreach> --Schleife Semester
+ #foreach> --Schleife Stichtag
+ #foreach> --Schleife gewichtung
+#compress>
+
+drop table tmp_regelord;
+
+<#if !Maskennummer?exists>
+ drop table tmp_sos; drop table tmp_zaehlung; ANALYZE msg_abp_aggr_gew;
+#if>
+<#if Maskennummer?exists>
+ --dieser Block wird nur gebraucht für eine Vorschau bei denen aber Fachanzahl oder Abschlussanzahl eingeschränkt ist
+ <#if "<>"=="'-1'">
+ <#foreach einStichtag in stichtage>
+ <#foreach einSemester in semester>
+ truncate table tmp_zaehlung;
+ insert into tmp_zaehlung (matrikel_nr,abschlussanzahl)
+ select matrikel_nr,count(distinct studiengang_nr) from tmp_sos
+ where sem_der_pruefung = ${einSemester.id} and stichtag = ${einStichtag.id}
+ group by 1;
+ update tmp_sos set abschlussanzahl=(select sum(abschlussanzahl) from tmp_zaehlung where tmp_sos.matrikel_nr=tmp_zaehlung.matrikel_nr)
+ where sem_der_pruefung = ${einSemester.id} and stichtag = ${einStichtag.id};
+
+ insert into tmp_zaehlung (matrikel_nr,studiengang_nr,fachanzahl)
+ select matrikel_nr,studiengang_nr,count(distinct ch30_fach) from tmp_sos
+ where sem_der_pruefung = ${einSemester.id} and stichtag = ${einStichtag.id} group by 1,2;
+ update tmp_sos set fachanzahl=(select sum(fachanzahl) from tmp_zaehlung where tmp_sos.matrikel_nr=tmp_zaehlung.matrikel_nr and
+ tmp_sos.studiengang_nr=tmp_zaehlung.studiengang_nr)
+ where sem_der_pruefung = ${einSemester.id} and stichtag = ${einStichtag.id};
+
+ <#if "<>"!=''&&!"<>"?starts_with('z.B.')>
+ delete from tmp_sos where not (fachanzahl <>);
+ #if>
+ <#if "<>"!=''&&!"<>"?starts_with('z.B.')>
+ delete from tmp_sos where not (abschlussanzahl <>);
+ #if>
+ #foreach>
+ #foreach>
+ #if> --Gewichtungsvariante -1
+ analyze tmp_sos;
+ update tmp_sos set ch30_fach=(select L.stg from ${target_lehr_stg_ab} L where L.tid=tid_stg);
+ update tmp_sos set kz_fach=(select L.kz_fach from ${target_lehr_stg_ab} L where L.tid=tid_stg);
+ update tmp_sos set ch35_ang_abschluss=(select L.abschluss from ${target_lehr_stg_ab} L where L.tid=tid_stg);
+ --update tmp_sos set gewichtungs_ident=null;
+ update tmp_sos set fachname = (select druck from cifx where key = 30 and apnr = ch30_fach);
+ update tmp_sos set abschlussname = (select druck from cifx where key = 35 and apnr = ch35_ang_abschluss);
+ update tmp_sos set stichtagname=(select name from sos_stichtag where tmp_sos.stichtag=sos_stichtag.tid);
+ update tmp_sos set fachname=nvl(fachname,''::char(1))||' Achtung kein passender Studiengang gefunden!' where tid_stg is null;
+ update tmp_sos set fb=(select min(fb) from ${target_lehr_stg_ab} L where L.tid=tid_stg) where (fb is null or fb='');
+ update tmp_sos set lehr=(select min(lehr) from ${target_lehr_stg_ab} L where L.tid=tid_stg) where lehr is null;
+ drop table tmp_zaehlung;
+ #if>--Maskennummer
+ --Übertragung in sos_lab_aggr
+ <#if durchfuehrungsart="konnektorlauf">
+
+ <#if Maskennummer?exists>
+ select stichtagname,sem_der_pruefung,matrikel_nr,studiengang_nr,fach_nr,ch30_fach,fachname,kz_fach,ch35_ang_abschluss,abschlussname,stuart,stufrm,ects,
+ round(gewicht,2), <#if durchfuehrungsart=="vorschau">gewichtungs_ident,#if> lehr,fb from tmp_sos
+ order by stichtagname,sem_der_pruefung,matrikel_nr,studiengang_nr,fach_nr,regelord;
+ #if>
+
+ SELECT
+ now(),
+ 'Anzahl Sätze in msg_abp_aggr_gew:'::CHAR(30),
+ count(*)
+ FROM msg_abp_aggr_gew
+ GROUP BY 1,2;
+ #if> --konnektorlauf
+
+#if>--sourcesystem CO
diff --git a/src-modules/module/msg/hilfstabellen/msg_fkombi_aggr_fuellen.sql b/src-modules/module/msg/hilfstabellen/msg_fkombi_aggr_fuellen.sql
index 1a17e06..0334d8d 100644
--- a/src-modules/module/msg/hilfstabellen/msg_fkombi_aggr_fuellen.sql
+++ b/src-modules/module/msg/hilfstabellen/msg_fkombi_aggr_fuellen.sql
@@ -1,4 +1,10 @@
--freemarker template
+
+
+select id,content from sx_repository where art='MSG_FKOMBI_KENNZ' and aktiv=1 order by sort1,sort2,sort3;
+
+
+
<#assign max_fachnr=6 />
<#if MSG_FKOMBI_TID_STG?exists>
@@ -17,12 +23,41 @@ hrst CHAR(10) ,
stufrm char(10),
fach_sem_zahl SMALLINT not null,
kz_rueck_beur_ein SMALLINT not null,
-kombi_kennz CHAR(10) ,
+pversion_uniquename varchar(255),
+kombi_kennz varchar(255),
kombi_tid_stg_2 INTEGER ,
kombi_fach_nr SMALLINT ,
kombi_fach_sem_zahl SMALLINT ,
kombi_ch30_fach CHAR(10) ,
kombi_anz smallint,
+kombi_anz_spr smallint,
+summe decimal(19,6)
+)
+;
+
+create temp table tmp_msg_fkombi_aggr2(
+ matrikel_nr INTEGER ,
+studiengang_nr SMALLINT not null,
+fach_nr SMALLINT not null,
+sem_rueck_beur_ein SMALLINT not null,
+tid_stg INTEGER ,
+ca12_staat SMALLINT not null,
+geschlecht SMALLINT not null,
+alter decimal(14,2) ,
+hzbart SMALLINT ,
+hrst CHAR(10) ,
+stufrm CHAR(10),
+fach_sem_zahl SMALLINT not null,
+kz_rueck_beur_ein SMALLINT not null,
+pversion_uniquename varchar(255),
+kombi_kennz varchar(255),
+kombi_anz smallint,
+kombi_anz_spr INTEGER ,
+kombi_ist_auszuschliessen INTEGER default 0,
+kombi_tid_stg INTEGER ,
+kombi_fach_nr SMALLINT not null,
+kombi_fach_sem_zahl SMALLINT not null,
+kombi_ch30_fach CHAR(10) ,
summe decimal(19,6)
)
;
@@ -41,6 +76,7 @@ matrikel_nr,
stufrm,
fach_sem_zahl,
kz_rueck_beur_ein,
+ pversion_uniquename,
summe)
select matrikel_nr,
studiengang_nr,
@@ -55,18 +91,17 @@ select matrikel_nr,
stufrm,
fach_sem_zahl,
kz_rueck_beur_ein,
+ pversion_uniquename,
summe
- from sos_stg_aggr S, sos_stichtag I
+ from sos_stg_aggr S, dim_studiengang D,sos_stichtag I
where S.stichtag=I.tid
+ and S.tid_stg=D.tid
and I.appl_key='0'
and ${MSG_FKOMBI_TID_STG}
;
-truncate table msg_fkombi_aggr;
-<#list 1..max_fachnr as fach_nr>
-#list>
-insert into msg_fkombi_aggr
+insert into tmp_msg_fkombi_aggr2
(matrikel_nr,
studiengang_nr,
fach_nr,
@@ -80,6 +115,7 @@ insert into msg_fkombi_aggr
stufrm,
fach_sem_zahl,
kz_rueck_beur_ein,
+ pversion_uniquename,
kombi_kennz,
kombi_tid_stg,
kombi_fach_nr,
@@ -100,7 +136,8 @@ T.hrst,
T.stufrm,
T.fach_sem_zahl,
T.kz_rueck_beur_ein,
-''::varchar(10) as kombi_kennz,
+T.pversion_uniquename,
+''::varchar(255) as kombi_kennz,
S.tid_stg as kombi_tid_stg,
S.fach_nr as kombi_fach_nr,
S.fach_sem_zahl as kombi_fach_sem_zahl,
@@ -113,10 +150,10 @@ and D.tid=S.tid_stg
and T.matrikel_nr=S.matrikel_nr
and T.studiengang_nr=S.studiengang_nr
and T.sem_rueck_beur_ein=S.sem_rueck_beur_ein
---and T.fach_nr !=S.fach_nr
+and S.tid_stg != T.tid_stg
;
-update msg_fkombi_aggr F set kombi_anz=(select count(*)
+update tmp_msg_fkombi_aggr2 F set kombi_anz=(select count(*)
from sos_stg_aggr S, dim_studiengang D, sos_stichtag I
where S.stichtag=I.tid
and I.appl_key='0'
@@ -126,19 +163,61 @@ and S.sem_rueck_beur_ein=F.sem_rueck_beur_ein
and S.studiengang_nr=F.studiengang_nr
);
---TODO: Hildesheim spezifisch:
-update msg_fkombi_aggr F set kombi_kennz='SPRACHE_F3'
-where exists(select S.matrikel_nr
-from sos_stg_aggr S, dim_studiengang D, sos_stichtag I
-where S.stichtag=I.tid
-and I.appl_key='0'
-and D.tid=S.tid_stg
-and S.matrikel_nr=F.matrikel_nr
-and S.sem_rueck_beur_ein=F.sem_rueck_beur_ein
-and S.studiengang_nr=F.studiengang_nr
-and D.stg in ('008','150','059')
-and S.fach_nr=3
-);
+<#if kombi_kennz?has_content>
+<#foreach kennz in kombi_kennz>
+update tmp_msg_fkombi_aggr2 set kombi_kennz='${kennz.id}'
+where ${kennz.content};
+
+#foreach>
+#if>
+
+
+truncate table msg_fkombi_aggr;
+
+
+insert into msg_fkombi_aggr
+(matrikel_nr,
+ studiengang_nr,
+ fach_nr,
+ sem_rueck_beur_ein,
+ tid_stg,
+ ca12_staat,
+ geschlecht,
+ alter,
+ hzbart,
+ hrst,
+ stufrm,
+ fach_sem_zahl,
+ kz_rueck_beur_ein,
+ kombi_anz,
+ kombi_kennz,
+ kombi_tid_stg,
+ kombi_fach_nr,
+ kombi_fach_sem_zahl,
+ kombi_ch30_fach,
+ summe)
+ select
+ matrikel_nr,
+ studiengang_nr,
+ fach_nr,
+ sem_rueck_beur_ein,
+ tid_stg,
+ ca12_staat,
+ geschlecht,
+ alter,
+ hzbart,
+ hrst,
+ stufrm,
+ fach_sem_zahl,
+ kz_rueck_beur_ein,
+ kombi_anz,
+ kombi_kennz,
+ kombi_tid_stg,
+ kombi_fach_nr,
+ kombi_fach_sem_zahl,
+ kombi_ch30_fach,
+ summe
+ from tmp_msg_fkombi_aggr2;
drop table tmp_msg_fkombi_aggr;
diff --git a/src-modules/module/msg/masken/160770_felderinfo.unl b/src-modules/module/msg/masken/160770_felderinfo.unl
new file mode 100644
index 0000000..03b0ebe
--- /dev/null
+++ b/src-modules/module/msg/masken/160770_felderinfo.unl
@@ -0,0 +1,45 @@
+160770^Köpfe oder Fälle ?^1^0^0^140^150^1^sql^70^0^1^<> select apnr, eintrag from koepfe_oder_faelle order by 2^apnr, eintrag^<> select apnr, eintrag from koepfe_oder_faelle where eintrag = 'Fälle';^
+160771^Seit Semester^3^0^0^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by 1 DESC;^ ^<> select tid, eintrag from semester where today()-365 between sem_beginn and sem_ende;^
+160772^Studiengang^6^0^0^140^150^50^char^30^0^12^<> select tid,name,sortnr from sichten where art in ('SOS-Kostenstellen-Sicht', 'SOS-Studiengang-Sicht') order by 3,2;^ ^ ^
+160773^Staatsangehörigkeit^36^0^0^130^150^10^char^30^0^12^<> select tid,name,sortnr from sichten where art='SOS-Staaten-Sicht' order by 3,2;^ ^ ^
+160774^Stichtag Prüfungen^1^350^-1^140^100^1^sql^30^0^1^<> select tid, name from sos_stichtag where stichtagsart='Prüfungen' order by 2;^ ^<> select tid, name from sos_stichtag where stichtagsart='Prüfungen' and appl_key='2';^
+160775^Prüfungsstatus^13^0^0^140^70^1^char^30^0^1^<> select apnr,druck from sos_k_pstatus;^hidden^ ^
+160776^Weitere Tabellen^123^0^0^140^140^10^char^30^0^1^<> \
+--freemarker template\
+select name,string_not_null(caption) || ' - ' || name from sx_tables where name in ('dim_studiengang')\
+<#if <>!='tabelle_html_datenblatt.xsl'>\
+ and name in (select distinct tablename from stylesheet_field where stylesheet_id in (select tid from sx_stylesheets where filename=<>)) \
+#if>\
+order by 2^ ^ ^
+160777^bis Fachsemester^20^350^-1^140^10^1^integer^30^0^0^^ ^ ^
+160778^Studienabschnitt^12^330^-1^130^150^1^integer^4^1^1^<> select tid, eintrag from studienabschnitt where tid <= 2 order by 1;^hidden^<> select tid, eintrag from studienabschnitt where tid = 2;^
+160779^Bis Semester^4^350^-1^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by 1 DESC;^ ^<> select tid, eintrag from semester where today() between sem_beginn and sem_ende;^
+160780^Prüfungsart^15^0^0^140^150^1^char^4^0^1^<> select apnr,druck from sos_k_part order by 2^ ^ ^
+160781^Geschlecht^37^0^0^140^80^1^integer^30^0^1^<> SELECT apnr,druck FROM cif WHERE cif.key = 9003 order by 2;^ ^ ^
+160782^Felder^125^0^0^150^190^10^char^30^0^1^<>\
+--freemarker template\
+ select trim(F.table_name) || '.' || F.name,trim(T.caption) || ':' || trim(F.caption) || ' - ' || trim(F.name) from sx_fields F,\
+ sx_tables T where F.table_name=T.name and F.currentlyused=1\
+ <#if <>='tabelle_html_datenblatt.xsl'>\
+ and (F.table_name ='msg_abp_aggr'\
+ /* or F.table_name in (<>) */) \
+<#else>\
+and trim(F.table_name) || '.' || F.name in (select trim(tablename)||'.'||trim(fieldname) from stylesheet_field where stylesheet_id in \
+(select tid from sx_stylesheets where filename=<>))\
+#if>\
+ order by 2;^ ^ ^
+160783^Fächer^8^0^0^150^200^6^char^30^0^12^<> select tid,name,sortnr from sichten where art='Fächer-Sicht' order by 3,2;^ ^ ^
+160784^Schlüssel anzeigen^150^0^0^100^100^1^integer^30^1^1^<> select 1,'Ja' from xdummy union select 0,'Nein' from xdummy^ ^<> select 1,'Ja' from xdummy^
+160785^tablestylesheet^121^0^0^100^200^1^char^200^1^1^<> select distinct filename,X.caption,ord from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=160770 order by ord^ ^<> select distinct filename,X.caption,ord from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=160770 order by ord limit 1^
+160786^Ausgabeformat^2001^0^0^100^150^1^char^200^1^1^<> select element_value,description from menu_element where element='Ausgabeformat' and nature::smallint<100 order by nature::smallint^ ^<> select element_value,description from menu_element where element='Ausgabeformat' and description='HTML'^
+160789^AbsolventInnen oder Abschlussprüfungen^11^0^0^100^200^1^integer^255^1^1^<> \
+select 1,'AbsolventInnen'\
+union select 2,'Abschlussprüfungen'\
+union select 3,'AbsolventInnenfachfälle'\
+union select 4,'Teilstudienabschlussprüfungen'\
+from xdummy \
+order by 1^ ^<> select 2,'Abschlussprüfungen' from xdummy^
+160790^##line##^10^0^0^100^100^1^char^5000^0^8^^ ^1^
+160791^Abschluss^9^0^0^140^170^5^char^30^0^12^<> select tid,name,sortnr from sichten where art in ('SOS-Abschluss-Sicht') and aktiv=1 order by 3,2;^ ^ ^
+160792^Matrikel-Nr.^30^350^-1^150^180^1^char^200^0^0^^ ^ ^
+160793^##line##^40^0^0^100^100^1^char^5000^0^8^^ ^1^
diff --git a/src-modules/module/msg/masken/160770_maske_system_bez.unl b/src-modules/module/msg/masken/160770_maske_system_bez.unl
new file mode 100644
index 0000000..9b35bc4
--- /dev/null
+++ b/src-modules/module/msg/masken/160770_maske_system_bez.unl
@@ -0,0 +1 @@
+160770^7^
diff --git a/src-modules/module/msg/masken/160770_masken_felder_bez.unl b/src-modules/module/msg/masken/160770_masken_felder_bez.unl
new file mode 100644
index 0000000..aa9d3b5
--- /dev/null
+++ b/src-modules/module/msg/masken/160770_masken_felder_bez.unl
@@ -0,0 +1,22 @@
+160770^160770^
+160770^160771^
+160770^160772^
+160770^160773^
+160770^160774^
+160770^160775^
+160770^160776^
+160770^160777^
+160770^160778^
+160770^160779^
+160770^160780^
+160770^160781^
+160770^160782^
+160770^160783^
+160770^160784^
+160770^160785^
+160770^160786^
+160770^160789^
+160770^160790^
+160770^160791^
+160770^160792^
+160770^160793^
diff --git a/src-modules/module/msg/masken/160770_maskeninfo.unl b/src-modules/module/msg/masken/160770_maskeninfo.unl
new file mode 100644
index 0000000..4d0a53b
--- /dev/null
+++ b/src-modules/module/msg/masken/160770_maskeninfo.unl
@@ -0,0 +1,140 @@
+160770^Abschlussprüfungen Datenblatt^--Freemarker Template\
+<#include "SQL_lingua_franca"/>\
+<#include "SuperX_general"/>\
+<#include "DatenblattSQLGenerator"/>\
+\
+--ram excelexport \
+\
+\
+\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)}\
+ \
+ )\
+ order by 1;]]>\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)} )\
+and foreignkey_tab in ('-xy'\
+ ${DatenblattTables(<>,"<>",.vars["Weitere TabellenObject"].allKeys)})\
+;]]>\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)}\
+ )\
+ and currentlyused=1\
+ ${DatenblattFields(<>,"<>",FelderObject.allKeys)}\
+ order by 2,3;]]>\
+\
+\
+\
+--#### Filter Abschlusstyp festlegen #########################\
+--Filterbedingung für select der Prüfungsdatensätze und zu verwendendes Prüfungssemester (1,2,3: des Gesamtabschlusses, 4: des Teilstudienabschlusses) festlegen\
+-- S für quelltabelle (da im Filter "Köpfe oder Fälle?" verwendet)\
+<#if "<>" == "1" > --AbsolventInnen\
+<#assign pruefabschlusstyp = " and ${SOS_ABSCHLUSSTYP_GES} and studiengangstyp in ('ESG','MSG') " />\
+<#assign pruefstatus = " and pstatus = 'BE' " />\
+<#assign pruefsemester = "sem_der_pruefung" />\
+<#elseif "<>" == "2" > --Abschlussprüfungen\
+<#assign pruefabschlusstyp = " and ${SOS_ABSCHLUSSTYP_GES} and studiengangstyp in ('ESG','MSG') " />\
+<#assign pruefstatus = " " />\
+<#assign pruefsemester = "sem_der_pruefung" />\
+<#elseif "<>" == "3" > --AbsolventInnenfachfälle\
+<#assign pruefabschlusstyp = " and ((studiengangstyp='ESG' and ${SOS_ABSCHLUSSTYP_GES}) or (studiengangstyp='TSG' and ${SOS_ABSCHLUSSTYP_TSTG})) " />\
+<#assign pruefstatus = " and pstatus = 'BE' and ((studiengangstyp='TSG' and pstatus_tsg = 'BE') or studiengangstyp='ESG') " />\
+<#assign pruefsemester = "sem_der_pruefung" />\
+<#elseif "<>" == "4" > --Teilstudienabschlussprüfungen\
+<#assign pruefabschlusstyp = " and ${SOS_ABSCHLUSSTYP_TSTG} and studiengangstyp in ('TSG') " />\
+<#assign pruefstatus = " " />\
+<#assign pruefsemester = "sem_der_pruefung_tsg" />\
+#if>\
+\
+\
+<#assign filter="and prueck=0\
+/* AND fach_sem_zahl <= <> */\
+/* and stichtag = <> */\
+/* and geschlecht=<> */\
+/* and part = <> */\
+/* and matrikel_nr=<> */\
+" />\
+<#if "<>"?index_of("S.gewichtung_id=")!=-1>\
+ <#assign filter=filter+" and "+.vars["Köpfe oder Fälle ?"]?replace('S.','msg_abp_aggr_gew.')/>\
+ <#if "<>"?index_of("dim_studiengang_gew")>-1>\
+ <#assign filter=filter+" and (dim_studiengang_gew.gewichtid is null or "+.vars["Köpfe oder Fälle ?"]?replace('S.','dim_studiengang_gew.')?replace("gewichtung_id","gewichtid")+")"/>\
+ #if>\
+<#elseif "<>"!="">\
+<#assign filter=filter+" and "+.vars["Köpfe oder Fälle ?"]/>\
+#if>\
+ \
+<#assign filter = filter + " and 's_' || tid_stg in "+Studiengang.allNeededKeysList /> --<> \
+/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.stg in "+Fächer.allNeededKeysList +")" /> --<> */\
+\
+/* <#assign filter = filter + " and '' || ca12_staat in "+Staatsangehörigkeit.allNeededKeysList /> --<> */\
+/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.abschluss in " + Abschluss.allNeededKeysList +")" /> --<> */\
+\
+\
+/* <#assign filter=filter+ " and "+ pruefsemester+" >= <> " /> */\
+/* <#assign filter=filter+ " and "+ pruefsemester+" <= <> " /> */\
+<#assign filter=filter+ pruefstatus /> \
+<#assign filter=filter+ pruefabschlusstyp /> \
+ \
+\
+\
+\
+\
+\
+<@generateDatenblatt \
+p_basetable = basetable\
+p_joinTables = getJoinTables\
+p_joinWhereClauses = getJoinWhereClauses\
+p_selectClause = getSelectClause\
+p_aggregationsfeld ="summe"\
+p_aggregatfunktion = "sum("\
+p_filter = filter\
+p_show_keys= <>\
+p_postProcessing= ""\
+/>^--Freemarker Template \
+XIL List\
+ sizable_columns horizontal_scrolling\
+ white_space_color=COLOR_WHITE fixed_columns=1\
+ min_heading_height=35\
+<#assign i=1 />\
+<#if getSelectClause?has_content >\
+<#foreach myfield in getSelectClause>\
+<#assign i=i+1 />\
+Column CID=${i} heading_text="${myfield.caption}" explanation="" center_heading\
+ row_selectable col_selectable rightJust heading_platform readonly\
+ width=20\
+<#if myfield.foreignkey_tab != '' && <>==1>\
+<#assign i=i+1 />\
+Column CID=${i} heading_text="${myfield.caption}\\n(Schlüssel)" explanation="" center_heading\
+ row_selectable col_selectable rightJust heading_platform readonly\
+ width=20\
+ #if>\
+#foreach>\
+#if>\
+@@@^Altersgruppe^Anzahl^Abschlussprüfungen Einfach,- Mehrfach- und Teilstudiengänge^drop table tmp_tabelle;^^2^700^360^^1^ ^
diff --git a/src-modules/module/msg/masken/160770_sachgeb_maske_bez.unl b/src-modules/module/msg/masken/160770_sachgeb_maske_bez.unl
new file mode 100644
index 0000000..faf25f2
--- /dev/null
+++ b/src-modules/module/msg/masken/160770_sachgeb_maske_bez.unl
@@ -0,0 +1 @@
+16^160770^
diff --git a/src-modules/module/msg/masken/49000_felderinfo.unl b/src-modules/module/msg/masken/49000_felderinfo.unl
new file mode 100644
index 0000000..0d410a8
--- /dev/null
+++ b/src-modules/module/msg/masken/49000_felderinfo.unl
@@ -0,0 +1,45 @@
+49000^Köpfe oder Fälle ?^1^0^0^140^150^1^sql^70^0^1^<> select apnr, eintrag from koepfe_oder_faelle order by 2^apnr, eintrag^<> select apnr, eintrag from koepfe_oder_faelle where eintrag = 'Fälle';^
+49001^Seit Semester^3^0^0^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by 1 DESC;^ ^<> select tid, eintrag from semester where today()-365 between sem_beginn and sem_ende;^
+49002^Studiengang^6^0^0^140^150^50^char^30^0^12^<> select tid,name,sortnr from sichten where art in ('SOS-Kostenstellen-Sicht', 'SOS-Studiengang-Sicht') order by 3,2;^ ^ ^
+49003^Staatsangehörigkeit^36^0^0^130^150^10^char^30^0^12^<> select tid,name,sortnr from sichten where art='SOS-Staaten-Sicht' order by 3,2;^ ^ ^
+49004^Stichtag Prüfungen^1^350^-1^140^100^1^sql^30^0^1^<> select tid, name from sos_stichtag where stichtagsart='Prüfungen' order by 2;^ ^<> select tid, name from sos_stichtag where stichtagsart='Prüfungen' and appl_key='2';^
+49005^Prüfungsstatus^13^0^0^140^70^1^char^30^0^1^<> select apnr,druck from sos_k_pstatus;^hidden^ ^
+49006^Weitere Tabellen^123^0^0^140^140^10^char^30^0^1^<> \
+--freemarker template\
+select name,string_not_null(caption) || ' - ' || name from sx_tables where name in ('dim_studiengang')\
+<#if <>!='tabelle_html_datenblatt.xsl'>\
+ and name in (select distinct tablename from stylesheet_field where stylesheet_id in (select tid from sx_stylesheets where filename=<>)) \
+#if>\
+order by 2^ ^ ^
+49007^bis Fachsemester^20^350^-1^140^10^1^integer^30^0^0^^ ^ ^
+49008^Studienabschnitt^12^330^-1^130^150^1^integer^4^1^1^<> select tid, eintrag from studienabschnitt where tid <= 2 order by 1;^hidden^<> select tid, eintrag from studienabschnitt where tid = 2;^
+49009^Bis Semester^4^350^-1^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by 1 DESC;^ ^<> select tid, eintrag from semester where today() between sem_beginn and sem_ende;^
+49010^Prüfungsart^15^0^0^140^150^1^char^4^0^1^<> select apnr,druck from sos_k_part order by 2^ ^ ^
+49011^Geschlecht^37^0^0^140^80^1^integer^30^0^1^<> SELECT apnr,druck FROM cif WHERE cif.key = 9003 order by 2;^ ^ ^
+49012^Felder^125^0^0^150^190^10^char^30^0^1^<>\
+--freemarker template\
+ select trim(F.table_name) || '.' || F.name,trim(T.caption) || ':' || trim(F.caption) || ' - ' || trim(F.name) from sx_fields F,\
+ sx_tables T where F.table_name=T.name and F.currentlyused=1\
+ <#if <>='tabelle_html_datenblatt.xsl'>\
+ and (F.table_name ='msg_abp_aggr'\
+ /* or F.table_name in (<>) */) \
+<#else>\
+and trim(F.table_name) || '.' || F.name in (select trim(tablename)||'.'||trim(fieldname) from stylesheet_field where stylesheet_id in \
+(select tid from sx_stylesheets where filename=<>))\
+#if>\
+ order by 2;^ ^ ^
+49013^Fächer^8^0^0^150^200^6^char^30^0^12^<> select tid,name,sortnr from sichten where art='Fächer-Sicht' order by 3,2;^ ^ ^
+49014^Schlüssel anzeigen^150^0^0^100^100^1^integer^30^1^1^<> select 1,'Ja' from xdummy union select 0,'Nein' from xdummy^ ^<> select 1,'Ja' from xdummy^
+49015^tablestylesheet^121^0^0^100^200^1^char^200^1^1^<> select distinct filename,X.caption,ord from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=49000 order by ord^ ^<> select distinct filename,X.caption,ord from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=49000 order by ord limit 1^
+49016^Ausgabeformat^2001^0^0^100^150^1^char^200^1^1^<> select element_value,description from menu_element where element='Ausgabeformat' and nature::smallint<100 order by nature::smallint^ ^<> select element_value,description from menu_element where element='Ausgabeformat' and description='HTML'^
+49019^AbsolventInnen oder Abschlussprüfungen^11^0^0^100^200^1^integer^255^1^1^<> \
+select 1,'AbsolventInnen'\
+union select 2,'Abschlussprüfungen'\
+union select 3,'AbsolventInnenfachfälle'\
+union select 4,'Teilstudienabschlussprüfungen'\
+from xdummy \
+order by 1^ ^<> select 2,'Abschlussprüfungen' from xdummy^
+49020^##line##^10^0^0^100^100^1^char^5000^0^8^^ ^1^
+49021^Abschluss^9^0^0^140^170^5^char^30^0^12^<> select tid,name,sortnr from sichten where art in ('SOS-Abschluss-Sicht') and aktiv=1 order by 3,2;^ ^ ^
+49022^Matrikel-Nr.^30^350^-1^150^180^1^char^200^0^0^^ ^ ^
+49023^##line##^40^0^0^100^100^1^char^5000^0^8^^ ^1^
diff --git a/src-modules/module/msg/masken/49000_maske_system_bez.unl b/src-modules/module/msg/masken/49000_maske_system_bez.unl
new file mode 100644
index 0000000..0df1418
--- /dev/null
+++ b/src-modules/module/msg/masken/49000_maske_system_bez.unl
@@ -0,0 +1 @@
+49000^370^
diff --git a/src-modules/module/msg/masken/49000_masken_felder_bez.unl b/src-modules/module/msg/masken/49000_masken_felder_bez.unl
new file mode 100644
index 0000000..1bb468d
--- /dev/null
+++ b/src-modules/module/msg/masken/49000_masken_felder_bez.unl
@@ -0,0 +1,22 @@
+49000^49000^
+49000^49001^
+49000^49002^
+49000^49003^
+49000^49004^
+49000^49005^
+49000^49006^
+49000^49007^
+49000^49008^
+49000^49009^
+49000^49010^
+49000^49011^
+49000^49012^
+49000^49013^
+49000^49014^
+49000^49015^
+49000^49016^
+49000^49019^
+49000^49020^
+49000^49021^
+49000^49022^
+49000^49023^
diff --git a/src-modules/module/msg/masken/49000_maskeninfo.unl b/src-modules/module/msg/masken/49000_maskeninfo.unl
new file mode 100644
index 0000000..9b25f20
--- /dev/null
+++ b/src-modules/module/msg/masken/49000_maskeninfo.unl
@@ -0,0 +1,140 @@
+49000^Abschlussprüfungen Datenblatt^--Freemarker Template\
+<#include "SQL_lingua_franca"/>\
+<#include "SuperX_general"/>\
+<#include "DatenblattSQLGenerator"/>\
+\
+--ram excelexport \
+\
+\
+\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)}\
+ \
+ )\
+ order by 1;]]>\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)} )\
+and foreignkey_tab in ('-xy'\
+ ${DatenblattTables(<>,"<>",.vars["Weitere TabellenObject"].allKeys)})\
+;]]>\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)}\
+ )\
+ and currentlyused=1\
+ ${DatenblattFields(<>,"<>",FelderObject.allKeys)}\
+ order by 2,3;]]>\
+\
+\
+\
+--#### Filter Abschlusstyp festlegen #########################\
+--Filterbedingung für select der Prüfungsdatensätze und zu verwendendes Prüfungssemester (1,2,3: des Gesamtabschlusses, 4: des Teilstudienabschlusses) festlegen\
+-- S für quelltabelle (da im Filter "Köpfe oder Fälle?" verwendet)\
+<#if "<>" == "1" > --AbsolventInnen\
+<#assign pruefabschlusstyp = " and ${SOS_ABSCHLUSSTYP_GES} and studiengangstyp in ('ESG','MSG') " />\
+<#assign pruefstatus = " and pstatus = 'BE' " />\
+<#assign pruefsemester = "sem_der_pruefung" />\
+<#elseif "<>" == "2" > --Abschlussprüfungen\
+<#assign pruefabschlusstyp = " and ${SOS_ABSCHLUSSTYP_GES} and studiengangstyp in ('ESG','MSG') " />\
+<#assign pruefstatus = " " />\
+<#assign pruefsemester = "sem_der_pruefung" />\
+<#elseif "<>" == "3" > --AbsolventInnenfachfälle\
+<#assign pruefabschlusstyp = " and ((studiengangstyp='ESG' and ${SOS_ABSCHLUSSTYP_GES}) or (studiengangstyp='TSG' and ${SOS_ABSCHLUSSTYP_TSTG})) " />\
+<#assign pruefstatus = " and pstatus = 'BE' and ((studiengangstyp='TSG' and pstatus_tsg = 'BE') or studiengangstyp='ESG') " />\
+<#assign pruefsemester = "sem_der_pruefung" />\
+<#elseif "<>" == "4" > --Teilstudienabschlussprüfungen\
+<#assign pruefabschlusstyp = " and ${SOS_ABSCHLUSSTYP_TSTG} and studiengangstyp in ('TSG') " />\
+<#assign pruefstatus = " " />\
+<#assign pruefsemester = "sem_der_pruefung_tsg" />\
+#if>\
+\
+\
+<#assign filter="and prueck=0\
+/* AND fach_sem_zahl <= <> */\
+/* and stichtag = <> */\
+/* and geschlecht=<> */\
+/* and part = <> */\
+/* and matrikel_nr=<> */\
+" />\
+<#if "<>"?index_of("S.gewichtung_id=")!=-1>\
+ <#assign filter=filter+" and "+.vars["Köpfe oder Fälle ?"]?replace('S.','sos_abp_aggr_gew.')/>\
+ <#if "<>"?index_of("dim_studiengang_gew")>-1>\
+ <#assign filter=filter+" and (dim_studiengang_gew.gewichtid is null or "+.vars["Köpfe oder Fälle ?"]?replace('S.','dim_studiengang_gew.')?replace("gewichtung_id","gewichtid")+")"/>\
+ #if>\
+<#elseif "<>"!="">\
+<#assign filter=filter+" and "+.vars["Köpfe oder Fälle ?"]/>\
+#if>\
+ \
+<#assign filter = filter + " and 's_' || tid_stg in "+Studiengang.allNeededKeysList /> --<> \
+/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.stg in "+Fächer.allNeededKeysList +")" /> --<> */\
+\
+/* <#assign filter = filter + " and '' || ca12_staat in "+Staatsangehörigkeit.allNeededKeysList /> --<> */\
+/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.abschluss in " + Abschluss.allNeededKeysList +")" /> --<> */\
+\
+\
+/* <#assign filter=filter+ " and "+ pruefsemester+" >= <> " /> */\
+/* <#assign filter=filter+ " and "+ pruefsemester+" <= <> " /> */\
+<#assign filter=filter+ pruefstatus /> \
+<#assign filter=filter+ pruefabschlusstyp /> \
+ \
+\
+\
+\
+\
+\
+<@generateDatenblatt \
+p_basetable = basetable\
+p_joinTables = getJoinTables\
+p_joinWhereClauses = getJoinWhereClauses\
+p_selectClause = getSelectClause\
+p_aggregationsfeld ="summe"\
+p_aggregatfunktion = "sum("\
+p_filter = filter\
+p_show_keys= <>\
+p_postProcessing= ""\
+/>^--Freemarker Template \
+XIL List\
+ sizable_columns horizontal_scrolling\
+ white_space_color=COLOR_WHITE fixed_columns=1\
+ min_heading_height=35\
+<#assign i=1 />\
+<#if getSelectClause?has_content >\
+<#foreach myfield in getSelectClause>\
+<#assign i=i+1 />\
+Column CID=${i} heading_text="${myfield.caption}" explanation="" center_heading\
+ row_selectable col_selectable rightJust heading_platform readonly\
+ width=20\
+<#if myfield.foreignkey_tab != '' && <>==1>\
+<#assign i=i+1 />\
+Column CID=${i} heading_text="${myfield.caption}\\n(Schlüssel)" explanation="" center_heading\
+ row_selectable col_selectable rightJust heading_platform readonly\
+ width=20\
+ #if>\
+#foreach>\
+#if>\
+@@@^Altersgruppe^Anzahl^Abschlussprüfungen Einfach,- Mehrfach- und Teilstudiengänge^drop table tmp_tabelle;^^2^700^360^^1^ ^
diff --git a/src-modules/module/msg/masken/49000_sachgeb_maske_bez.unl b/src-modules/module/msg/masken/49000_sachgeb_maske_bez.unl
new file mode 100644
index 0000000..d5165e9
--- /dev/null
+++ b/src-modules/module/msg/masken/49000_sachgeb_maske_bez.unl
@@ -0,0 +1 @@
+370^49000^
diff --git a/src-modules/module/msg/masken/49040_felderinfo.unl b/src-modules/module/msg/masken/49040_felderinfo.unl
new file mode 100644
index 0000000..6e6d7ac
--- /dev/null
+++ b/src-modules/module/msg/masken/49040_felderinfo.unl
@@ -0,0 +1,34 @@
+49040^Filter Kombinationen^60^0^0^140^150^1^sql^70^0^1^<> select id,caption from sx_repository where art='MSG_FKOMBI_FILTER' order by 2^ ^ ^
+49041^Seit Semester^3^0^0^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by 1 DESC;^ ^<> select tid, eintrag from semester where today()-365 between sem_beginn and sem_ende;^
+49042^Studiengang^6^0^0^140^150^50^char^30^0^12^<> select tid,name,sortnr from sichten where art in ('SOS-Kostenstellen-Sicht', 'SOS-Studiengang-Sicht') order by 3,2;^ ^ ^
+49043^Staatsangehörigkeit^36^0^0^130^150^10^char^30^0^12^<> select tid,name,sortnr from sichten where art='SOS-Staaten-Sicht' order by 3,2;^ ^ ^
+49046^Weitere Tabellen^123^0^0^140^140^10^char^30^0^1^<> \
+--freemarker template\
+select name,string_not_null(caption) || ' - ' || name from sx_tables where name in ('dim_studiengang')\
+<#if <>!='tabelle_html_datenblatt.xsl'>\
+ and name in (select distinct tablename from stylesheet_field where stylesheet_id in (select tid from sx_stylesheets where filename=<>)) \
+#if>\
+order by 2^ ^ ^
+49047^bis Fachsemester^20^350^-1^140^10^1^integer^30^0^0^^ ^ ^
+49049^Bis Semester^4^350^-1^140^80^1^integer^30^0^1^<> select tid, eintrag from semester order by 1 DESC;^ ^<> select tid, eintrag from semester where today() between sem_beginn and sem_ende;^
+49051^Geschlecht^37^0^0^140^80^1^integer^30^0^1^<> SELECT apnr,druck FROM cif WHERE cif.key = 9003 order by 2;^ ^ ^
+49052^Felder^125^0^0^150^190^10^char^30^0^1^<>\
+--freemarker template\
+ select trim(F.table_name) || '.' || F.name,trim(T.caption) || ':' || trim(F.caption) || ' - ' || trim(F.name) from sx_fields F,\
+ sx_tables T where F.table_name=T.name and F.currentlyused=1\
+ <#if <>='tabelle_html_datenblatt.xsl'>\
+ and (F.table_name ='msg_fkombi_aggr'\
+ /* or F.table_name in (<>) */) \
+<#else>\
+and trim(F.table_name) || '.' || F.name in (select trim(tablename)||'.'||trim(fieldname) from stylesheet_field where stylesheet_id in \
+(select tid from sx_stylesheets where filename=<>))\
+#if>\
+ order by 2;^ ^ ^
+49053^Fächer^8^0^0^150^200^6^char^30^0^12^<> select tid,name,sortnr from sichten where art='Fächer-Sicht' order by 3,2;^ ^ ^
+49054^Schlüssel anzeigen^150^0^0^100^100^1^integer^30^1^1^<> select 1,'Ja' from xdummy union select 0,'Nein' from xdummy^ ^<> select 1,'Ja' from xdummy^
+49055^tablestylesheet^121^0^0^100^200^1^char^200^1^1^<> select distinct filename,X.caption,ord from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=49040 order by ord^ ^<> select distinct filename,X.caption,ord from sx_stylesheets X,sx_mask_style S where X.tid=S.stylesheet_id and S.maskeninfo_id=49040 order by ord limit 1^
+49056^Ausgabeformat^2001^0^0^100^150^1^char^200^1^1^<> select element_value,description from menu_element where element='Ausgabeformat' and nature::smallint<100 order by nature::smallint^ ^<> select element_value,description from menu_element where element='Ausgabeformat' and description='HTML'^
+49060^##line##^10^0^0^100^100^1^char^5000^0^8^^ ^1^
+49061^Abschluss^9^0^0^140^170^5^char^30^0^12^<> select tid,name,sortnr from sichten where art in ('SOS-Abschluss-Sicht') and aktiv=1 order by 3,2;^ ^ ^
+49062^Matrikel-Nr.^30^350^-1^150^180^1^char^200^0^0^^ ^ ^
+49063^##line##^40^0^0^100^100^1^char^5000^0^8^^ ^1^
diff --git a/src-modules/module/msg/masken/49040_maske_system_bez.unl b/src-modules/module/msg/masken/49040_maske_system_bez.unl
new file mode 100644
index 0000000..8f12e89
--- /dev/null
+++ b/src-modules/module/msg/masken/49040_maske_system_bez.unl
@@ -0,0 +1 @@
+49040^370^
diff --git a/src-modules/module/msg/masken/49040_masken_felder_bez.unl b/src-modules/module/msg/masken/49040_masken_felder_bez.unl
new file mode 100644
index 0000000..d8ec2a5
--- /dev/null
+++ b/src-modules/module/msg/masken/49040_masken_felder_bez.unl
@@ -0,0 +1,17 @@
+49040^49040^
+49040^49041^
+49040^49042^
+49040^49043^
+49040^49046^
+49040^49047^
+49040^49049^
+49040^49051^
+49040^49052^
+49040^49053^
+49040^49054^
+49040^49055^
+49040^49056^
+49040^49060^
+49040^49061^
+49040^49062^
+49040^49063^
diff --git a/src-modules/module/msg/masken/49040_maskeninfo.unl b/src-modules/module/msg/masken/49040_maskeninfo.unl
new file mode 100644
index 0000000..9bae993
--- /dev/null
+++ b/src-modules/module/msg/masken/49040_maskeninfo.unl
@@ -0,0 +1,109 @@
+49040^Fächerkombinatorik Datenblatt^--Freemarker Template\
+<#include "SQL_lingua_franca"/>\
+<#include "SuperX_general"/>\
+<#include "DatenblattSQLGenerator"/>\
+\
+--ram excelexport \
+\
+\
+\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)}\
+ \
+ )\
+ order by 1;]]>\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)} )\
+and foreignkey_tab in ('-xy'\
+ ${DatenblattTables(<>,"<>",.vars["Weitere TabellenObject"].allKeys)})\
+;]]>\
+\
+>,"<>",.vars["Weitere TabellenObject"].allKeys)}\
+ )\
+ and currentlyused=1\
+ ${DatenblattFields(<>,"<>",FelderObject.allKeys)}\
+ order by 2,3;]]>\
+\
+\
+\
+\
+\
+<#assign filter="and 1=1\
+/* AND fach_sem_zahl <= <> */\
+/* and geschlecht=<> */\
+/* and matrikel_nr=<> */\
+" />\
+\
+ \
+<#assign filter = filter + " and 's_' || tid_stg in "+Studiengang.allNeededKeysList /> --<> \
+/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.stg in "+Fächer.allNeededKeysList +")" /> --<> */\
+\
+/* <#assign filter = filter + " and '' || ca12_staat in "+Staatsangehörigkeit.allNeededKeysList /> --<> */\
+/* <#assign filter = filter + " and tid_stg in (select L2.tid from lehr_stg_ab L2 where L2.abschluss in " + Abschluss.allNeededKeysList +")" /> --<> */\
+\
+\
+/* <#assign filter=filter+ " and sem_rueck_beur_ein >= <> " /> */\
+/* <#assign filter=filter+ " and sem_rueck_beur_ein <= <> " /> */\
+ \
+\
+\
+\
+\
+\
+<@generateDatenblatt \
+p_basetable = basetable\
+p_joinTables = getJoinTables\
+p_joinWhereClauses = getJoinWhereClauses\
+p_selectClause = getSelectClause\
+p_aggregationsfeld ="summe"\
+p_aggregatfunktion = "sum("\
+p_filter = filter\
+p_show_keys= <>\
+p_postProcessing= ""\
+/>^--Freemarker Template \
+XIL List\
+ sizable_columns horizontal_scrolling\
+ white_space_color=COLOR_WHITE fixed_columns=1\
+ min_heading_height=35\
+<#assign i=1 />\
+<#if getSelectClause?has_content >\
+<#foreach myfield in getSelectClause>\
+<#assign i=i+1 />\
+Column CID=${i} heading_text="${myfield.caption}" explanation="" center_heading\
+ row_selectable col_selectable rightJust heading_platform readonly\
+ width=20\
+<#if myfield.foreignkey_tab != '' && <>==1>\
+<#assign i=i+1 />\
+Column CID=${i} heading_text="${myfield.caption}\\n(Schlüssel)" explanation="" center_heading\
+ row_selectable col_selectable rightJust heading_platform readonly\
+ width=20\
+ #if>\
+#foreach>\
+#if>\
+@@@^Altersgruppe^Anzahl^Auswertung von Fächerkombinationen^drop table tmp_tabelle;^^2^700^360^^1^ ^
diff --git a/src-modules/module/msg/masken/49040_sachgeb_maske_bez.unl b/src-modules/module/msg/masken/49040_sachgeb_maske_bez.unl
new file mode 100644
index 0000000..32f539a
--- /dev/null
+++ b/src-modules/module/msg/masken/49040_sachgeb_maske_bez.unl
@@ -0,0 +1 @@
+370^49040^
diff --git a/src-modules/module/msg/msg_modul_entfernen.x b/src-modules/module/msg/msg_modul_entfernen.x
new file mode 100755
index 0000000..d194f92
--- /dev/null
+++ b/src-modules/module/msg/msg_modul_entfernen.x
@@ -0,0 +1,5 @@
+#!/bin/bash
+echo "------------------------------------------------------------"
+echo
+module_drop.x lm $LM_PFAD
+
diff --git a/src-modules/module/msg/msg_modul_erzeugen.x b/src-modules/module/msg/msg_modul_erzeugen.x
new file mode 100755
index 0000000..d7a2241
--- /dev/null
+++ b/src-modules/module/msg/msg_modul_erzeugen.x
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+module_install.x lm $LM_PFAD
+
diff --git a/src-modules/module/msg/msg_update.x b/src-modules/module/msg/msg_update.x
new file mode 100755
index 0000000..e1be22e
--- /dev/null
+++ b/src-modules/module/msg/msg_update.x
@@ -0,0 +1,65 @@
+#!/bin/bash
+
+#Arbeitsverzeichnis fuer crontab
+PFAD=$2
+if [ "$PFAD" != "" ]
+then
+
+cd $PFAD
+
+fi
+#Umgebung einlesen:
+if [ "$MSG_PFAD" = "" ]
+then
+echo "ACHTUNG: Die Umgebungsvariable MSG_PFAD ist nicht gesetzt. Bitte prüfen Sie $SUPERX_DIR/db/bin/SQL_ENV"
+
+exit 1
+
+fi
+if [ "$MSG_ERRORMAIL" != "" ]
+then
+ERRORMAIL=$MSG_ERRORMAIL
+export ERRORMAIL
+fi
+if [ "$MSG_LOGMAIL" != "" ]
+then
+LOGMAIL=$MSG_LOGMAIL
+export LOGMAIL
+fi
+if [ "$MSG_BACKUP" != "" ]
+then
+MODULE_BACKUP=$MSG_BACKUP
+export MODULE_BACKUP
+fi
+
+#hier geht es los
+#runAndCheck.x path command (EXIT_ON_ERROR|CONT_ON_ERROR) (SEND_ERRORMAIL|NO_ERRORMAIL) (SEND_LOGMAIL|NO_LOGMAIL) [description] "
+echo "msg-Update startet" >$MSG_ERRORDAT
+#Tagesdatum für Systeminfo
+date +'%d.%m.%Y' > $MSG_LOAD_PFAD/superx.datum
+
+runAndCheck.x $MSG_PFAD "module_etl.x msg $MSG_PFAD $MSG_LOAD_PFAD" EXIT_ON_ERROR SEND_ERRORMAIL SEND_LOGMAIL "MSG update$MANDANTID"
+cat $MSG_PFAD/L_MSG_update$MANDANTID.log >>$MSG_ERRORDAT
+
+
+fgrep -s "not found" $MSG_ERRORDAT
+FLAG1=$?
+fgrep -i -s "error" $MSG_ERRORDAT
+FLAG2=$?
+fgrep -i -s "nicht gefunden" $MSG_ERRORDAT
+FLAG3=$?
+if [ $FLAG1 -eq 0 -o $FLAG2 -eq 0 -o $FLAG3 -eq 0 ]
+then
+ echo "Fehler beim MSG-Update "
+ echo "---------------------------------------"
+ echo "Fehlerprotokoll in $MSG_ERRORDAT"
+ echo "---------------------------------------"
+ cp $MSG_LOAD_PFAD/superx.datum.alt $MSG_LOAD_PFAD/superx.datum
+else
+ echo "MSG-Update erfolgreich"
+fi
+
+echo "---------------------------Beginn Prüfroutine-----------------------------------" >>$MSG_ERRORDAT
+#cat $MSG_PFAD/L_msg_Test$MANDANTID.log >>$MSG_ERRORDAT
+pruefmail.x $MSG_PFAD/L_msg_Test$MANDANTID.log $ERRORMAIL
+
diff --git a/src-modules/module/msg/msg_update_cron.x.sam b/src-modules/module/msg/msg_update_cron.x.sam
new file mode 100644
index 0000000..cc07462
--- /dev/null
+++ b/src-modules/module/msg/msg_update_cron.x.sam
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+#Beispielscript für cronjobs
+#Im cronjob ist keine Umgebung vorhanden, deshalb vorher laden.
+#Selbstredend als normaler user, nicht als root z.B.
+. /home/superx/db/bin/SQL_ENV
+
+cd $MSG_LOAD_PFAD
+./msg_unload.x
+
+
+$MSG_PFAD/msg_update.x $MSG_PFAD
+
+#In der crontab sähe das so aus:
+# msg-Update
+# -0 4 * * 2,3,4,5,6 /home/superx/db/module/msg/msg_update_cron.x >/home/superx/db/module/msg/msg_update_cron.log 2>&1
+# Bedeutung: Der MSG-Update wird Di-Sa morgens um 4:00 Uhr ausgeführt
+
diff --git a/src-modules/module/msg/msg_update_cron_costage.x.sam b/src-modules/module/msg/msg_update_cron_costage.x.sam
new file mode 100644
index 0000000..3376b2b
--- /dev/null
+++ b/src-modules/module/msg/msg_update_cron_costage.x.sam
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+#Beispielscript für cronjobs
+#Im cronjob ist keine Umgebung vorhanden, deshalb vorher laden.
+#Selbstredend als normaler user, nicht als root z.B.
+. /home/superx/db/bin/SQL_ENV
+
+cd $MSG_LOAD_PFAD
+./msg_costage_unload.x
+
+
+$MSG_PFAD/msg_update.x $MSG_PFAD
+
+#In der crontab sähe das so aus:
+# msg-Update
+# -0 4 * * 2,3,4,5,6 /home/superx/db/module/msg/msg_update_cron.x >/home/superx/db/module/msg/msg_update_cron.log 2>&1
+# Bedeutung: Der MSG-Update wird Di-Sa morgens um 4:00 Uhr ausgeführt
+
diff --git a/src-modules/module/msg/rohdaten/MSG_ENV.sam b/src-modules/module/msg/rohdaten/MSG_ENV.sam
new file mode 100644
index 0000000..7c3abff
--- /dev/null
+++ b/src-modules/module/msg/rohdaten/MSG_ENV.sam
@@ -0,0 +1,207 @@
+#!/bin/bash
+
+#Entladeumgebung für SuperX
+#Die folgenden Parameter müssen angepasst werden
+
+# SX_CLIENT ist die Client-Anwendung zum Zugriff auf die DB
+# Mögliche Werte: dbaccess (Informix), psql (Postgres), jdbc (Alle anderen)
+#SX_CLIENT=dbaccess; export SX_CLIENT
+SX_CLIENT=psql; export SX_CLIENT
+#SX_CLIENT=jdbc; export SX_CLIENT
+#Wichtig bei jdbc und psql: Die Umgebungsvariable DB_PROPERTIES gibt des Pfad zur db-xxx.properties an.
+#Dies wird in allen Programmen des jdbc-Clients genutzt.
+#DB_PROPERTIES=./db-sos_pg.properties
+#export DB_PROPERTIES
+#auch die Logging-Ausgabe kann variiert werden: (./logging.properties.sam umbenennen)
+#LOGGER_PROPERTIES=./logging.properties.sam
+#export LOGGER_PROPERTIES
+#Für jdbc auch JAVA_OPTS: viel RAM
+#JAVA_OPTS="-Xmx500M"
+#export JAVA_OPTS
+#Database: POSTGRES, INFORMIX
+DATABASE=POSTGRES
+export DATABASE
+#Aus welchem System wird entladen ? SOSPOS-GX oder HISinOne?
+#SOURCESYSTEM=hisinone
+SOURCESYSTEM=sospos
+export SOURCESYSTEM
+
+
+#Achtung: Wichtig ist unter UNIX, dass LANG korrekt (auf UTF-8,ISO-8859-1 oder de_DE@euro) gesetzt ist.
+#Wir haben die Variable hier nicht definiert, weil das eigentlich
+#sytsemweit definiert sein muss. LANG ist bereits beim Entpacken
+#den Kernmoduls massgeblich.
+#LANG=de_DE@euro
+#LANG=de_DE.UTF-8
+#export LANG
+
+case $SX_CLIENT in
+
+dbaccess)
+
+
+INFORMIXDIR=/home/informix
+export INFORMIXDIR
+INFORMIXSERVER=sospos_host
+export INFORMIXSERVER
+ONCONFIG=onconfig.sospos
+export ONCONFIG
+INF_BIN=$INFORMIXDIR/bin
+export INF_BIN
+
+DBMONEY=. ; export DBMONEY
+DBDATE=DMY4. ; export DBDATE
+DBDELIMITER="^" ; export DBDELIMITER
+CLIENT_LOCALE=de_de.8859-1@bund
+export CLIENT_LOCALE
+SERVER_LOCALE=de_de.8859-1@bund
+export SERVER_LOCALE
+;;
+
+psql)
+ PGPORT=5432
+ export PGPORT
+ #Bei Betrieb von Postgres (remote) muss für psql
+ #unter cygwin die Umgebungsvariable PGHOST gesetzt sein
+ #Sonst versucht er eine Socket Connection
+ #PGHOST und PGPORT müssen auf den SOS-Rechner zeigen
+ PGHOST=sospos_host
+ export PGHOST
+ #PGUSER: nur Datenbank, nicht Betriebssystem
+ PGUSER=sospos
+ export PGUSER
+ #Prüfen ob der PATH erweitert werden muss
+ #Standard-Installationsverz. von Postgres ist
+ PGPATH=/usr/local/pgsql
+ #Nur bei hisinone:
+ #JDBC_PARAM="set search_path to hisinone;"
+ #unter Win wäre dies PGPATH=/cygdrive/c/Programme/PostgreSQL/8.0-beta1
+ #unter cygwin liegen die binaries direkt in /bin
+ export PGPATH
+ #Diese Variablen dürfen nicht verändert werden:
+ export PGDATESTYLE=German
+ O_DESCR=$SUPERX_DIR/db/conf/unldescr_postgres_copy.xml
+ export O_DESCR
+
+;;
+
+esac
+
+
+#SOS-Versionsnummer (Ganzzahl) 6,7,8,9,10,11
+#Wenn Sie eine höhere Versionnummer einsetzen, nehmen Sie einfach
+#die letztmögliche.
+VERSION=11
+export VERSION
+#ab hier werden Daten ausgewertet:
+start_stud_sem=19881; export start_stud_sem #sos-studenten und fächer
+start_pruef_sem=19881; export start_pruef_sem #Prüfungen
+#
+
+#Wird immer komplett entladen, oder nur die Änderungen? (true/false)
+#Bie derErstinstallation und in der Implementierungsphase empfehlen wir true
+SOS_UNL_COMPLETE=true
+export SOS_UNL_COMPLETE
+
+
+#Transaktionen abschalten?
+TRANSACTION_OFF=""
+#Wenn Transaktionen eingeschaltet sind und die Protokoll-Tabellen groß sind,
+#dann sollte dieses ent-kommentiert sein.
+#TRANSACTION_OFF="SET ISOLATION TO DIRTY READ;"
+export TRANSACTION_OFF
+
+#Sollen die Daten bzgl. matrikelnr anonymisiert werden (Namen kommen sowieso nicht rüber)?
+#Wenn Sie true wählen, müssen Sie das Script ausführen, das die Matrikelnummern
+SOS_UNL_ANON=false
+export SOS_UNL_ANON
+
+#setzen Sie POS_PNR auf 0, um alle Prüfungen zu entladen:
+POS_PNR=0
+#Vorsicht: viele Daten...
+#Sinnvoller ist es die Einzelprüfungen zu entladen, die gewünscht sind
+#z.B.
+#POS_PNR='9390,9490,9690,9700'
+#Dies sind Prüfungsnummern, die nicht in hskonst verzeichnet sind.
+export POS_PNR
+
+
+#gibt es weitere Filter für die LAB oder nicht.
+#Standardmäßig werden anerkannte Prüfungen gefiltert mit dem Ausdruck
+LAB_FILTER="AND (lab.panerk is null or lab.panerk != 'J')"
+export LAB_FILTER
+
+#Sollen Name/Vorname/Handynr(Semesteranschrift) der Studierenden entladen werden?
+#Wenn ja, dann ist der Wert "true", wenn nein, dann ist es "false"
+STUD_IDENT=false
+export STUD_IDENT
+#Sollen Name/Vorname der Prüfer entladen werden?
+#Wenn ja, dann ist der Wert "true", wenn nein, dann ist es "false"
+PRUEFER_NAME=false
+export PRUEFER_NAME
+
+#Nur HISinOne-STU: sollen Personattribute entladen werden, z.B. personattributetype.id 1,2,3:
+#PERSONATTRIBUTE_IDS="1,2,3"
+#export PERSONATTRIBUTE_IDS
+
+
+ERRORMAIL=superx@localhost
+export ERRORMAIL
+LOGMAIL="$ERRORMAIL"
+export LOGMAIL
+#Name des ausführbaren Mailprogramms, mail oder mutt:
+MAILPROG="mail"
+export MAILPROG
+
+
+
+#Die folgenden Parameter müssen wahrscheinlich nicht geändert werden:
+#DBNLS=2 ; export DBNLS
+#PATH=${PATH}:${INFORMIXDIR}/bin ; export PATH
+DBASE=sospos ; export DBASE
+DBDELIMITER="^" ; export DBDELIMITER
+##
+DBDATE=DMY4. ; export DBDATE
+##Pfad für Entladedaten:
+SOS_PFAD=.
+export SOS_PFAD
+SOS_LOAD_PFAD=$SOS_PFAD
+export SOS_LOAD_PFAD
+##hier muss Unterverzeichnis unl existieren!
+LOG=$SOS_PFAD/sos_unload.err
+export LOG
+DATEFILE=$SOS_PFAD/superx.datum
+export DATEFILE
+
+if [ "$SOS_UNL_COMPLETE" = "true" ]
+then
+DATUM="01.01.1900"
+else
+DATUM=`tail -1 $SOS_PFAD/superx.datum`
+fi
+
+#Beim Push Entladen benötigte jars nach ./lib/kopieren:
+#jfor-0.7.2rc1.jar, postgresql-9.2-1002.jdbc4.jar, superx4.9.jar
+#LIB_PATH=$SOS_LOAD_PFAD/lib
+#JDBC_CLASSPATH="." ; for i in `ls $LIB_PATH/*.jar` ; do JDBC_CLASSPATH=$JDBC_CLASSPATH:$i ; done
+#export JDBC_CLASSPATH
+#XML_CLASSPATH=""
+#export XML_CLASSPATH
+
+
+#COPY_METHOD kann rsync oder scp sein
+COPY_METHOD=rsync; export COPY_METHOD
+#OPTIONEN für scp z.B.
+#SCP_OPTS="-p -B -i /home/sospos/.ssh/superxkey"
+#export SCP_OPTS
+#Default für $SOS_LOAD_PFAD: Hier muss Unterverzeichnus unl existieren.
+REMOTE_DIR="/home/superx/db/module/sos/rohdaten"
+export REMOTE_DIR
+#Defaultuser
+REMOTE_USER="superx"
+export REMOTE_USER
+#Defaulthostname / IP-Nr. des SuperX-DB-Servers, auf den die Rohdaten kopiert werden
+REMOTE_HOST="superx"
+export REMOTE_HOST
+
+
diff --git a/src-modules/module/msg/rohdaten/msg_unload.xml b/src-modules/module/msg/rohdaten/msg_unload.xml
new file mode 100644
index 0000000..7c00a7c
--- /dev/null
+++ b/src-modules/module/msg/rohdaten/msg_unload.xml
@@ -0,0 +1,33 @@
+
+
+MSG-Modul
+
+
+
+
+ Wird nicht mehr gepflegt. Ab SOSPOS-Version 13 immer auf 13 setzen, bei HISinOne wird sie automatisch gesetzt.
+
+ Ab welchem Prüfungssemester sollen Prüfungen entladen werden? z.B. 20221 für SoSe 2022
+ Wenn ja, dann ist der Wert "true", wenn nein, dann ist er "false"
+
+
+
+
+
+
+
+
+
+ Abschlussprüfungen
+
+
+
+
+
+
diff --git a/src-modules/module/msg/schluesseltabellen/sx_repository_fuellen.sql b/src-modules/module/msg/schluesseltabellen/sx_repository_fuellen.sql
index fb425d7..9ba7fd4 100644
--- a/src-modules/module/msg/schluesseltabellen/sx_repository_fuellen.sql
+++ b/src-modules/module/msg/schluesseltabellen/sx_repository_fuellen.sql
@@ -3,7 +3,16 @@
<#assign systeminfo_id="370" />
<#assign repos = [
{"id":"MSG_FKOMBI_TID_STG", "caption":"Studiengänge für Fächerkombinationen", "art":"MSG_TID_STG", "art2":"",
-"content":" tid_stg in (select D.tid from dim_studiengang D where D.ist_lehramt=1)"}
+"content":" tid_stg in (select D.tid from dim_studiengang D where D.ist_lehramt=1)"},
+
+{"id":"SOS_ABSCHLUSSTYP_GES", "caption":"Gesamtabschluss", "art":"SOS_ABSCHLUSSTYP", "art2":"",
+"content":"pnr=9000"},
+
+{"id":"SOS_ABSCHLUSSTYP_TSTG", "caption":"Teilstudienabschluss", "art":"SOS_ABSCHLUSSTYP", "art2":"",
+"content":"pnr=8600"}
+
+{"id":"MSG_FKOMBI_KENNZ_MINT", "caption":"MINT-Fach", "art":"MSG_FKOMBI_KENNZ", "art2":"",
+"content":"kombi_ch30_fach in (select distinct D.stg from dim_studiengang D where D.fgrp in (''04'',''08''))"}
] />
diff --git a/src-modules/module/msg/schluesseltabellen/sx_stylesheets_fuellen.sql b/src-modules/module/msg/schluesseltabellen/sx_stylesheets_fuellen.sql
new file mode 100644
index 0000000..30bbdac
--- /dev/null
+++ b/src-modules/module/msg/schluesseltabellen/sx_stylesheets_fuellen.sql
@@ -0,0 +1,208 @@
+--(c) 2011 Andre Knieschewski
+--Freemarker Template
+--Achtung: Macro fügt Inhalte ein
+--Bitte nur Freemarker Variablen füllen
+
+<#assign masken = [
+{"mask":"49000", "filename":"tabelle_html_datenblatt.xsl", "ord":"1"},
+{"mask":"49040", "filename":"tabelle_html_datenblatt.xsl", "ord":"1"}
+] />
+
+<#assign stylesheet = [
+] />
+
+<#assign stylesheet_field = [
+
+] />
+
+--Hier eventuell notwendige updates/delete's auf die Tabellen sx_mask_style, sx_stylesheets oder stylesheet_field einfügen.
+
+
+ <@sx_stylesheets_insert
+m_masken=masken
+m_stylesheet=stylesheet
+m_stylesheet_field=stylesheet_field
+/>
+
+
+<#macro sx_stylesheets_insert m_masken m_stylesheet m_stylesheet_field>
+
+--Sicherstellen, dass keine Duplikate vorkommen:
+--####################################################################################################
+<#foreach column in m_masken>
+delete from sx_mask_style where maskeninfo_id=${column.mask} and stylesheet_id in (select tid from sx_stylesheets where filename ='${column.filename}') and ord=${column.ord};
+#foreach>
+
+<#foreach column in m_stylesheet_field>
+delete from stylesheet_field where stylesheet_id in (select tid from sx_stylesheets where filename ='${column.filename}');
+#foreach>
+
+
+
+
+-- Stylesheets füllen
+--####################################################################################################
+create temp table tmp_stylesheets (
+tid serial not null,
+filename CHAR(255) ,
+caption CHAR(255) ,
+description CHAR(255) ,
+relation CHAR(10) ,
+useragent CHAR(255) ,
+contenttype CHAR(200) ,
+is_generic smallint,
+toolbar_icon_filepath VARCHAR(255) ,
+usage_resultset_data CHAR(10) default 'T' ,
+stylesheet_type CHAR(10) default 'XSL' ,
+jr_datasource CHAR(10)
+
+);
+
+create temp table tmp_hilf (tid integer);
+insert into tmp_hilf select max(tid) from sx_stylesheets;
+update tmp_hilf set tid=1 where tid is null;
+
+<#assign counter_tid = 1 />
+<#foreach column in m_stylesheet>
+insert into tmp_stylesheets (tid,
+filename,
+caption,
+description,
+relation,
+contenttype,
+is_generic,
+toolbar_icon_filepath ,
+usage_resultset_data ,
+stylesheet_type ,
+jr_datasource)
+select max(tid)+${counter_tid},'${column.filename}',
+'${column.caption}',
+ '${column.description}',
+ '${column.relation}',
+'${column.contenttype}',
+${column.is_generic},
+'${column.toolbar_icon_filepath}' ,
+'${column.usage_resultset_data}' ,
+'${column.stylesheet_type}' ,
+'${column.jr_datasource}'
+from tmp_hilf;
+<#assign counter_tid = counter_tid + 1 />
+#foreach>
+
+<#if TableFieldExists?exists && TableFieldExists('sx_stylesheets','is_generic')>
+update sx_stylesheets set is_generic=1
+where filename in (select T.filename from tmp_stylesheets T where T.is_generic=1);
+#if>
+
+<#if TableFieldExists?exists && TableFieldExists('sx_stylesheets','stylesheet_type')>
+update sx_stylesheets set stylesheet_type=T.stylesheet_type,
+contenttype=T.contenttype,
+usage_resultset_data=T.usage_resultset_data,
+jr_datasource=T.jr_datasource
+from tmp_stylesheets T
+where T.filename=sx_stylesheets.filename
+and sx_stylesheets.filename in (select T2.filename from tmp_stylesheets T2);
+#if>
+
+--delete für tml_stylesheets hinzugefügt #ak 06.03.2013
+delete from tmp_stylesheets where filename in (select filename from sx_stylesheets);
+
+
+insert into sx_stylesheets (tid,
+filename, caption, description, relation, useragent, contenttype
+<#if TableFieldExists?exists && TableFieldExists('sx_stylesheets','is_generic')>
+,is_generic
+#if>
+<#if TableFieldExists?exists && TableFieldExists('sx_stylesheets','toolbar_icon_filepath')>
+,toolbar_icon_filepath ,
+usage_resultset_data ,
+stylesheet_type ,
+jr_datasource
+#if>
+)
+SELECT tid, filename, caption, description, relation, useragent, contenttype
+<#if TableFieldExists?exists && TableFieldExists('sx_stylesheets','is_generic')>
+,is_generic
+#if>
+<#if TableFieldExists?exists && TableFieldExists('sx_stylesheets','toolbar_icon_filepath')>
+,toolbar_icon_filepath ,
+usage_resultset_data ,
+stylesheet_type ,
+jr_datasource
+#if>
+FROM tmp_stylesheets;
+
+drop table tmp_stylesheets;
+
+
+-- Mask Style füllen
+--####################################################################################################
+create temp table tmp_mask_style (
+tid serial not null,
+maskeninfo_id INTEGER ,
+stylesheet_id INTEGER ,
+ord SMALLINT,
+filename char(255)
+);
+
+delete from tmp_hilf;
+insert into tmp_hilf select max(tid) from sx_mask_style;
+update tmp_hilf set tid=1 where tid is null;
+
+<#assign counter_tid = 1 />
+<#foreach column in m_masken>
+insert into tmp_mask_style (tid,maskeninfo_id,ord,filename)
+select max(tid)+${counter_tid},${column.mask},${column.ord},'${column.filename}' from tmp_hilf;
+
+update tmp_mask_style set stylesheet_id=(select max(tid) from sx_stylesheets where filename='${column.filename}')
+where filename='${column.filename}';
+<#assign counter_tid = counter_tid + 1 />
+#foreach>
+
+insert into sx_mask_style ( tid, maskeninfo_id, stylesheet_id, ord)
+SELECT tid, maskeninfo_id, stylesheet_id, ord
+FROM tmp_mask_style;
+
+drop table tmp_mask_style;
+
+
+--Field zu Stylesheet Zuordnungen:
+--####################################################################################################
+CREATE temp TABLE tmp_stylesheet_field
+(
+tid serial NOT NULL,
+stylesheet_id INTEGER,
+tablename char(255),
+fieldname char(255),
+filename char(255)
+);
+
+delete from tmp_hilf;
+insert into tmp_hilf select max(tid) from stylesheet_field;
+update tmp_hilf set tid=1 where tid is null;
+
+<#assign counter_tid = 1 />
+<#foreach column in m_stylesheet_field>
+INSERT INTO tmp_stylesheet_field (tid, filename, tablename, fieldname)
+select max(tid)+${counter_tid}, '${column.filename}', '${column.tablename}', '${column.fieldname}' from tmp_hilf;
+
+update tmp_stylesheet_field set stylesheet_id=(select max(tid) from sx_stylesheets where filename='${column.filename}')
+where filename='${column.filename}';
+<#assign counter_tid = counter_tid + 1 />
+#foreach>
+
+insert into stylesheet_field ( tid, stylesheet_id, tablename, fieldname)
+SELECT tid, stylesheet_id, tablename, fieldname
+FROM tmp_stylesheet_field;
+
+drop table tmp_stylesheet_field;
+drop table tmp_hilf;
+
+
+<#if SQLdialect='Postgres'>
+select sp_update_sequence('sx_stylesheets');
+select sp_update_sequence('sx_mask_style');
+select sp_update_sequence('stylesheet_field');
+#if>
+
+#macro>
diff --git a/src-modules/module/msg/upgrade/msg_modul_upgrade_man.sql b/src-modules/module/msg/upgrade/msg_modul_upgrade_man.sql
new file mode 100644
index 0000000..d5c0cfc
--- /dev/null
+++ b/src-modules/module/msg/upgrade/msg_modul_upgrade_man.sql
@@ -0,0 +1,3 @@
+--
+alter table msg_fkombi_aggr alter column kombi_kennz type varchar(255);
+