Mit assign kann man eigene Variabeln definieren.
z.B.
<#assign sortnr=0>
<#assign sortnr=sortnr+1>
insert into ? values (${sortnr},?.)
<#if "<<Stichtagsbezogen>>"="NEIN">
<#assign quelltabelle = "sos_statistik">
<#else>
<#assign quelltabelle = "sos_statistik">
</#if>
select .... from ${quelltabelle} where ...
<<Stichtagsbezogen>> wird von der SuperX-Transformation ersetzt, sodass Freemarker vergleicht:
<#if "JA"="NEIN"> oder <#if "NEIN"="NEIN">
Auf alle Felder einer Maske kann man neben der klassischen SuperX-Notation <<FELDNAME>> auch per FreeMarker zugreifen. Es ginge z.B. auch
<#if Haushaltsjahr=2005>...
insert into ... select ... from ? where jahr=${Haushaltsjahr}
(Außerhalb von
FreeMarker-Anweisungen, muss die Variable mit ${} umschlossen sein, wenn Leerzeichen
oder Sonderzeichen vorkommen muss man die .vars-Notation benutzen,
z.B. "alles
aufsummieren?"))
Wenn man wissen möchte, ob eine Variable mit Inhalt gefüllt ist, kann man dies mit has_content Abfragen, z.B.
<#if lehr_abg?has_content >
Folgender Effekt ist schon mal aufgetreten:
Wenn man ein einer Abfrage z.B. schreibt
<#assign sortnr=sortnr+1>
insert into tmp_rs_base
(struktur,text, ch30_fach, kz_fach, fach_nr, ch35_ang_abschluss, sortnr,
...
dann klappt das nicht, man muss unter dem assign eine Leerzeile machen:
<#assign sortnr=sortnr+1>
insert into tmp_rs_base
(struktur,text, ch30_fach, kz_fach, fach_nr, ch35_ang_abschluss, sortnr,
Exkurs für Fortgeschrittene: sqlvars
Manchmal wünscht man sich mit FreeMarker auf Variablen zugreifen zu können, die aus der Datenbank gefüllt werden müssten, weil sie nicht als Felder auf der Maske vorkommen.
Allerdings muss die Freemarker-Transformation ja schon laufen, bevor der fertige SQL an die Datenbank geschickt wird, weil Postgres/Informix ja mit FreeMarker-Befehlen nichts anfangen können.
Man kann also nicht so etwas
<#assign gegename="select name from fin_geldgeber G where G.xyz=<<XYZ>>">
machen, weil die Variable gegename dann einfach nur select... als String enthält, Freemarker hat mit der Datenbank keinen direkten Kontakt.
SuperX wäre aber nicht so krass, wenn es nicht Abhilfe gäbe:
man legt einen Block an
<sqlvars>
<!-- einfache Variable-->
<sqlvar name="fin_geldgeber_exists">
select sp_table_exists('fin_geldgeber') from xdummy
</sqlvar>
<!-- Listenvariable -- 1. Spalte key (darf nicht null sein!), 2. Spalte name-->
<sqlvar name="geldgeber">
select ggnr,ggname1 from fin_geldgeber
</sqlvar>
</sqlvars>
Anschließend kann man in der Abfrage mit FreeMarker auf diese aus der Datenbank gefüllten Variablen zugreifen:
<#if fin_geldgeber_exists=1>
insert into .. select * from fin_geldgeber;
<#else>
insert into .. select * from fin_geldgeber;
</#if>
Die Variable wird als einfacher Wert erkannt, weil nur eine Spalte im SQL selektiert wurde.
(Achtung: Sofern der Select mehrere Zeilen liefert, wird nur der letzte gefundene Wert hinterlegt, wenn man abfragen möchte, ob überhaupt etwas in der Datenbank gefunden wurde kann man <#if fin_geldgeber_exists?has_content> benutzen)
Die zweite Art von Variable (Geldgeber) wird als Liste von Items geführt und kann in der Abfrage benutzt werden z.B. mit
where ggnr in (
<#foreach gg in geldgeber>
${gg.key},
</#foreach>
Die erste per SQL eingelesene Spalte,ist das Attribut key, die zweite name.
optional kann auch noch dritte/vierte Spalte mit Strukturinfo eingelesen werden
<sqlvar name="geldgeber">
select ggnr,ggname1,klr_geldgeber,strukturint from fin_geldgeber
</sqlvar>
In den sqlvars kann auch freemarker-syntax und repository/konstanten benutzt werden,
obstruses Beispiel:
<sqlvar name="spezial_gege">
<#if K_FIN_Quellsystem=1>
select ggnr,ggname1 from fin_geldgeber where ggnr in ${FIN_Drittmittel}
<#else>
select ggnr,ggname2 from fin_geldgeber where ggnr in ${FIN_Drittmittel}
</#if>
![]() |
![]() ![]() |
Seite 23 / 102 Letzter Update: 17.06.2008 Impressum |