Achtung: Diese Dokumentation ist veraltet, bitte rufen Sie die Übersichtsseite auf, um zur aktuellen Dokumentation zu gelangen.

2.2.2.3.3 Variablen

assign

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,

 

 

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 gibt Abhilfe:

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>

Auf die dritte Spalte kann man zugreifen über das Attribut " .strukturStr ", und die vierte Spalte mit .strukturInt , also für das orbige Beispiel mit:

<#foreach gg in geldgeber >

-- Hier steht der Inhalt der Spalte klr_geldgeber: ${gg.strukturStr}

...

  Analog für strukturInt.

 

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>

</sqlvar>

Achtung : bei den SQL-Statements innerhalb von SQLVAR-Abschnitten dürfen Sie keine "<" oder ">"-Zeichen nutzen, sondern mit der html-Notation &lt; und &gt; umschreiben, also statt:

<sqlvar name="Semester">

select distinct tid, eintrag

from semester

where tid < =20101

order by 1;

</sqlvar>

schreiben Sie besser:

<sqlvar name="Semester">

select distinct tid, eintrag

from semester

where tid &lt; =20101

order by 1;

</sqlvar>

Bei Problemen mit sqlvars, deren SQL dynamisch generiert werden, ist es schwierig, sich den produzierten SQL anzusehen (insb. wenn nur Browserzugriff besteht).
Beispiel


<sqlvar name="hhanssum"><![CDATA[
select sum(hhans) from fin_konto_aggr where
  rechnungsjahr= <<Haushaltsjahr>>
and ch110_institut in ${Kostenstelle.allNeededElements}
</sqlvar>


Trick: Einen SQL-Syntaxfehler einbauen.

<sqlvar name="hhanssum"><![CDATA[
select
XXXXX sum(hhans) from fin_konto_aggr where
rechnungsjahr= <<Haushaltsjahr>>
and ch110_institut in ${Kostenstelle.allNeededElements}
</sqlvar>


Dadurch wird ein SQL-Fehler erzeugt, der im Browser angezeigt wird und man kann sehen, wie <<Haushaltsjahr>> ersetzt wurde und Freemarker arbeitet.


Man kann auch Inhalt von Freemarker-Variablen bzw. vorhergehenden SQLVars anzeigen lassen.
Beispiel Konstante FIN_Quellsystem und vorhergehende sqlvar instname:

<sqlvar name="instname">select drucktext from fin_inst where key_apnr=<<Kostenstelle>></sqlvar>
<sqlvar name="hhanssum"><![CDATA[
select '${K_FIN_Quellsystem} - ${instname}' from xdummy;
select
XX sum(hhans) from fin_konto_aggr where
rechnungsjahr= <<Haushaltsjahr>>
and ch110_institut in ${Kostenstelle.allNeededElements}
</sqlvar>

neu:

in sqlvars kann man auch auf die vorherigen sqlvars zugreifen

<sqlvars>

<sqlvar name="v1">select ..</sqlvar>

<sqlvar name="v2"> <![CDATA[select .. where <#if v1=1> feld=1<#else>feld=2</#if>]]></sqlvar>

</sqlvars>

geht bisher nur innerhalb von if-Anweisungen o.ä.

CDATA ist wichtig, damit wohlgeformtes xml

<sqlvar name="COB_FIN_STARTJAHR">select apnr from konstanten where beschreibung=' COB_FIN_STARTJAHR '</sqlvar>

<sqlvar name="vorhandene_fin_monate"><![CDATA[select distinct klrjahr*12+klrmonat,'monat' from fin_buch_akt where klrjahr>0 and klrjahr>=${COB_FIN_TO_BUSA_STARTJAHR}]]></sqlvar>

hier kommt Fehlermeldung smallint Operator >= existiert nicht

Hintergrund

${COB_FIN_TO_BUSA_STARTJAHR} wird als $-Kommentar vom klassischen general-sql gelöscht und

select distinct klrjahr*12+klrmonat,'monat' from fin_buch_akt where klrjahr>0 and klrjahr>=

abgeschickt

neu typ: hash / hashsequence

<sqlvar name="kennzahl" type="hash">\

select id, shortname,sqlchunk,calcratio,decimalplaces,linksub,linktimeline from man_catalogue \

where id=<<Kennzahl>>;\

</sqlvar>

kann beliebig viele Spalten enthalten, bei concat  as benutzen wie  id||'-'||name as bezeichnung

auf diese kann man später so zugreifen

t ${kennzahl.shortname} .

 

Falls mehrere Werte gefunden werden können benutzt man am besten type='hashsequence' (neu Mai 2013)

 

man kann zwar auch type='hash' benutzen, falls aber weniger als zwei Einträge gefunden werden und man ein foreach macht:

<#foreach entry in entries>

${entry.id}','${entry.shortname}','${entry.description} '${entry.bezeichnung}

  kommt der fehler:

Expected collection or sequence. auswertungids evaluated instead to de.superx.common.TemplateProcessor$SxHash

also am besten, wenn nur ein wert gefunden werden kann type='hash', wenn es mehrere sein können type='hashsequence'

Neu in Kern4.2

Man kann sich auch in einem SQL-File, das per DOSQL ausgeführt wird, eine Sicht bauen.

Im select_stmt von Masken   geht dies nicht, da gibt es ja Sichten ja schon als Feld.

Beispiel:

<sqlvars>

<sqlvar name="auswertungsdefinition" type="sicht" name_intern="fibu_auswertung_def" stand="1.1.1900"/>

</sqlvars>

– (Stand ist optional als default wird today genommen)

<#foreach def in auswertungsdefinition.elements>

${def.name} ${def.key}

</#foreach>

SuperX Konstanten

Es gibt in SuperX Konstanten, welche in der Maskenprogrammierung immer zur Verfügung stehen.

in HttpSession für Zugriff in jsp ist

(Am Anfang und Ende ist jeweils ein Komma, dann kann z.B. Rechte prüfen

mit indexOf(",23000,") und bekommt keine Probleme wenn es eine Maske

523000 gibt)

   

Ähnlich und noch komfortabler auch in Freemarker

<#if UserIsAdmin>admin</#if>

<#if UserHasMaskRight("17070,23000")> ERLAUBT<#else>VERBOTEN </#if>  

--Klammer kann ein oder mehrere Maskennummern enthalten

<#if IsUserInGroup("2")> in ADMIN-GROUP<#else> nicht in

ADMIN-group</#if> -- eine Gruppe in Klammer

<#if IsUserInGroupWithName("Administratoren")> NAME ADMIN-GROUP<#else>

NAME nicht in ADMIN-group</#if>

  --eine Gruppe in Klammer

<#if IsUserInAtLeastOneGroup("3,2,4")>

 

user ist in mindestens einer

Gruppe <#else> user ist in keiner der angegebenen Gruppen</#if>

 

<#if UserHasSachgebRight("152")>

 

neu in kern44 ab Nov 2014

<#if UserHasAllKostenstellenRights> ...


Druckversion HTML

Zur Superx-Homepage SuperX ist auch ein CampusSource-Projekt. Zur CampusSource-Homepage | Powered by FreeMarker Seite 35 / 190
Letzter Update: 29.1.2024
Impressum| Datenschutz