Browse Source

Bugfix Spaltenbreiten in JR-Export bei verknüpften Spaltenüberschriften #2

(cherry picked from commit 87e5524734)
master
Daniel Quathamer 1 month ago
parent
commit
e9d33449f3
  1. 56
      superx/xml/rpta_templates.xsl

56
superx/xml/rpta_templates.xsl

@ -426,6 +426,8 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:param name="ergebniselementOrdnr" /> <xsl:param name="ergebniselementOrdnr" />
<xsl:param name="colId" /> <xsl:param name="colId" />
<xsl:param name="colCount" /> <xsl:param name="colCount" />
<xsl:param name="isLastVisibleColumInRow" />
<xsl:variable name="x"><xsl:text>0</xsl:text> <xsl:variable name="x"><xsl:text>0</xsl:text>
<xsl:for-each select="/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[ @width &gt; 0 and not(starts-with(f_name,'hidden')) and not(starts-with(f_name,'next')) and @id &lt; $colId ]"> <xsl:for-each select="/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[ @width &gt; 0 and not(starts-with(f_name,'hidden')) and not(starts-with(f_name,'next')) and @id &lt; $colId ]">
<xsl:variable name="previousColumnWidth"> <xsl:variable name="previousColumnWidth">
@ -436,6 +438,7 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:with-param name="colId" select="@id" /> <xsl:with-param name="colId" select="@id" />
<xsl:with-param name="colCount" select="$colCount"/> <xsl:with-param name="colCount" select="$colCount"/>
<xsl:with-param name="previousX" select="0"/> <xsl:with-param name="previousX" select="0"/>
<xsl:with-param name="isLastVisibleColumInRow" select="''"/>
</xsl:call-template> </xsl:call-template>
</xsl:variable> </xsl:variable>
@ -455,14 +458,17 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:param name="colId" /> <xsl:param name="colId" />
<xsl:param name="colCount" /> <xsl:param name="colCount" />
<xsl:param name="previousX" /> <xsl:param name="previousX" />
<xsl:param name="isLastVisibleColumInRow" />
<xsl:variable name="defbreite"><xsl:value-of select="sum(/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[ @width &gt; 0 and not(starts-with(f_name,'hidden')) and not(starts-with(f_name,'next')) ]/@width )" /></xsl:variable> <xsl:variable name="defbreite"><xsl:value-of select="sum(/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[ @width &gt; 0 and not(starts-with(f_name,'hidden')) and not(starts-with(f_name,'next')) ]/@width )" /></xsl:variable>
<xsl:variable name="ndefbreite"><xsl:value-of select="count(/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[ @width = '' and not(starts-with(f_name,'hidden')) and not(starts-with(f_name,'next'))])" /></xsl:variable> <xsl:variable name="ndefbreite"><xsl:value-of select="count(/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[ @width = '' and not(starts-with(f_name,'hidden')) and not(starts-with(f_name,'next'))])" /></xsl:variable>
<xsl:variable name="gesamtbreite"><xsl:value-of select="$defbreite+($ndefbreite* $std_spaltenbreite)" /></xsl:variable> <xsl:variable name="gesamtbreite"><xsl:value-of select="$defbreite+($ndefbreite* $std_spaltenbreite)" /></xsl:variable>
<xsl:variable name="width"><xsl:value-of select="/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[@id=$colId]/@width"/></xsl:variable> <xsl:variable name="width"><xsl:value-of select="/ergebnisse/ergebnis/ergebniselement[@ordnr=$ergebniselementOrdnr]/sqlerg/headers/header[@id=$colId]/@width"/></xsl:variable>
<xsl:comment><xsl:value-of select="concat('defbreite=',$defbreite)" /></xsl:comment> <xsl:comment><xsl:value-of select="concat('defbreite=',$defbreite)" /></xsl:comment>
<xsl:choose> <xsl:choose>
<xsl:when test="($colCount - 1) =$colId "> <xsl:when test="$isLastVisibleColumInRow='+' or ($colCount - 1) =$colId">
<!-- letzte Spalte --> <!-- letzte Spalte wird immer vom rechten Seitenrand minus vorherige Spalten gerechnet,
weil es Rundungsfehler bei der Spaltenbreite geben kann.-->
<xsl:value-of select="$druckbreite - $previousX"/> <xsl:value-of select="$druckbreite - $previousX"/>
</xsl:when> </xsl:when>
<xsl:when test="$width != ''"> <xsl:when test="$width != ''">
@ -643,7 +649,7 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:variable name="colCount"> <xsl:variable name="colCount">
<xsl:choose> <xsl:choose>
<xsl:when test="($rowCounter - 1)=$rowCount"> <xsl:when test="($rowCounter - 1)=$rowCount">
<xsl:value-of select="$totalColCount"/> <xsl:value-of select="$currentRowColCount"/>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<xsl:value-of select="$totalColCount"/> <xsl:value-of select="$totalColCount"/>
@ -654,7 +660,17 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:for-each select="th" > <xsl:for-each select="th" >
<xsl:variable name="colId"><xsl:value-of select="position()-1" /></xsl:variable> <xsl:variable name="colId"><xsl:value-of select="position()-1" /></xsl:variable>
<xsl:if test="@isHidden='false'"> <xsl:if test="@isHidden='false'">
<xsl:comment><xsl:text>colId=</xsl:text><xsl:value-of select="$colId"/></xsl:comment> <xsl:variable name="isLastVisibleColumInRow">
<xsl:call-template name="getLastVisibleColumInRow">
<xsl:with-param name="currentColId" select="$colId" />
<xsl:with-param name="remainingRows" select="$rowCount - ($rowCounter + 1)" />
</xsl:call-template>
</xsl:variable>
<xsl:comment><xsl:text>colId=</xsl:text><xsl:value-of select="$colId"/>
<xsl:text>
isLastVisibleColumInRow=</xsl:text><xsl:value-of select="$isLastVisibleColumInRow"/>
</xsl:comment>
<xsl:variable name="columnX"> <xsl:variable name="columnX">
<xsl:call-template name="getColumnX"> <xsl:call-template name="getColumnX">
<xsl:with-param name="druckbreite" select="$druckbreite"/> <xsl:with-param name="druckbreite" select="$druckbreite"/>
@ -662,6 +678,7 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:with-param name="ergebniselementOrdnr" select="$ordnr"/> <xsl:with-param name="ergebniselementOrdnr" select="$ordnr"/>
<xsl:with-param name="colId" select="$colId" /> <xsl:with-param name="colId" select="$colId" />
<xsl:with-param name="colCount" select="$colCount"/> <xsl:with-param name="colCount" select="$colCount"/>
<xsl:with-param name="isLastVisibleColumInRow" select="$isLastVisibleColumInRow"/>
</xsl:call-template> </xsl:call-template>
</xsl:variable> </xsl:variable>
<xsl:comment><xsl:text>columnX=</xsl:text><xsl:value-of select="$columnX"/></xsl:comment> <xsl:comment><xsl:text>columnX=</xsl:text><xsl:value-of select="$columnX"/></xsl:comment>
@ -675,6 +692,7 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:with-param name="colId" select="$colId" /> <xsl:with-param name="colId" select="$colId" />
<xsl:with-param name="colCount" select="$colCount"/> <xsl:with-param name="colCount" select="$colCount"/>
<xsl:with-param name="previousX" select="$columnX"/> <xsl:with-param name="previousX" select="$columnX"/>
<xsl:with-param name="isLastVisibleColumInRow" select="$isLastVisibleColumInRow"/>
</xsl:call-template> </xsl:call-template>
</xsl:variable> </xsl:variable>
@ -700,10 +718,22 @@ isIgnorePagination="{$isIgnorePagination}" >
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:variable> </xsl:variable>
<xsl:variable name="computedWidth">
<!--wenn eine Spalte die letzte sichtbare ist, wird der berechnete Wert
genommen. Wenn nicht, wird mit colspan multipliziert.-->
<xsl:choose>
<xsl:when test="$isLastVisibleColumInRow='+'">
<xsl:value-of select="$columnWidth"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$columnWidth * $colspan"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<textField isStretchWithOverflow="true"> <textField isStretchWithOverflow="true">
<reportElement style="TableColumnHeader" mode="Opaque" stretchType="ContainerHeight" <reportElement style="TableColumnHeader" mode="Opaque" stretchType="ContainerHeight"
x="{$columnX}" y="{$y_offset+( $rowCounter * $zeilenhoehe )}" width="{$columnWidth * $colspan}" height="{$zeilenhoehe*$rowspan}" /> x="{$columnX}" y="{$y_offset+( $rowCounter * $zeilenhoehe )}" width="{$computedWidth}" height="{$zeilenhoehe*$rowspan}" />
<textFieldExpression><xsl:text>"</xsl:text> <textFieldExpression><xsl:text>"</xsl:text>
<xsl:call-template name="newline_to_backslash_n"> <xsl:call-template name="newline_to_backslash_n">
<xsl:with-param name="string" select="."/> <xsl:with-param name="string" select="."/>
@ -1100,4 +1130,20 @@ isIgnorePagination="{$isIgnorePagination}" >
<xsl:text disable-output-escaping="yes"><![CDATA[ +"Datenstand: "+ $F{standdatum} + "; " + "Erstellt: "+ DATEFORMAT( TODAY(), "dd.MM.YYYY")]]></xsl:text></textFieldExpression> <xsl:text disable-output-escaping="yes"><![CDATA[ +"Datenstand: "+ $F{standdatum} + "; " + "Erstellt: "+ DATEFORMAT( TODAY(), "dd.MM.YYYY")]]></xsl:text></textFieldExpression>
</textField> </textField>
</xsl:template> </xsl:template>
<xsl:template name="getLastVisibleColumInRow">
<xsl:param name="currentColId" />
<xsl:param name="remainingRows" />
<!--ermittelt ob eine Spalte die letzte sichtbare ist
bei verknüpften Spalten ist die letzte Header-Zeile immer relevant, egal ob sichtbar oder nicht.
Zurückgegeben werden die Anzahl der sichtbaren Zellen als "+",
d.h. genau ein "+" bedeutet, dass es die letzte Spalte ist.
-->
<xsl:for-each select="../th">
<xsl:variable name="nr" select="position()" />
<xsl:if test="$nr &gt; $currentColId and (@isHidden='false' or $remainingRows=0)">
<xsl:text>+</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

Loading…
Cancel
Save