Feature der Woche: Zwischensummen in Tabellen
Manchmal möchte man in Tabellen in Kopf- bzw. Fußzeilen eine Zwischensumme bzw. Übertrag (engl. etwa »running sum«) ausgeben. Hier ist das Problem, dass das eine dynamische Information ist, die sich aus dem zur Verfügung stehenden Platz ergibt. Ist die Seite kürzer, so ist die Summe eine andere. Das heißt, dass man die Zahl nicht im Vorfeld als Kopf- oder Fußzeile definieren kann.
Dafür gibt gibt es die Möglichkeit, Daten in einer Tabellenzeile zu speichern:
<Tr data="..." >
Diese Daten können später in Kopf- und Fußzeilen mit der speziellen Variablen
$_last_tr_data
abgefragt werden. Die Variable wird bei jeder Benutzung von
data="..."
überschrieben. Um dies zu illustrieren, gibt es ein vollständiges
Regelwerk, das diesen Mechanismus nutzt:
<Layout
xmlns="urn:speedata.de:2009/publisher/en"
xmlns:sd="urn:speedata:2009/publisher/functions/en">
<Pageformat width="80mm" height="80mm" />
<Record element="data">
<!-- Wert für die erste Kopfzeile initialisieren -->
<SetVariable variable="_last_tr_data" select="0"/>
<SetVariable variable="sum" select="0"/>
<PlaceObject>
<Table stretch="max">
<Tablefoot>
<Tr>
<Td>
<Paragraph>
<Value>Wert von $_last_tr_data: </Value>
<Value select="$_last_tr_data"/>
</Paragraph>
</Td>
</Tr>
</Tablefoot>
<Tablehead>
<Tr>
<Td>
<Paragraph>
<Value>Wert von $_last_tr_data: </Value>
<Value select="$_last_tr_data"/>
</Paragraph>
</Td>
</Tr>
</Tablehead>
<Loop select="100" variable="i">
<SetVariable variable="sum" select="$sum + $i"/>
<Tr data="$sum">
<Td>
<Paragraph>
<Value>i = </Value>
<Value select="$i"/>
</Paragraph>
</Td>
</Tr>
</Loop>
</Table>
</PlaceObject>
</Record>
</Layout>
Wie immer mit sp --dummy
ausführen, da keine Datendatei vorliegt.
Hier werden erst die Kopf- und Fußzeilen definiert (siehe auch Feature der
Woche: Wiederholender Tabellenkopf (1)), dann 100
Zeilen erzeugt (<Loop select="100">
), die Schleifenzahl gespeichert (die
voreingestellte Variable für Loop
ist _loopcounter
), und anschließend in
jeder Zeile mit data="$sum"
den errechneten Wert gespeichert, der später in der Kopfzeile
und Fußzeile ausgegeben wird.
Die Breite der dynamischen Kopf- und Fußzeile wird ohne $_last_tr_data
berechnet. Das kann zu Problemen führen, wenn die neu errechnete Kopf- oder
Fußzeile ein anderes Format hat.
Dieser Artikel bezieht sich auf den speedata Publisher in der Version 2.7.7. Andere Versionen haben womöglich andere Befehle oder die genannten Befehle zeigen ein anderes Verhalten. Bitte schau im Zweifelsfall in der Anleitung nach.
In der Serie »Feature der Woche« beschreibe ich einmal in der Woche mehr oder weniger nützliche Eigenschaften des Publishers. Kommentare gerne an mich per E-Mail oder einfach im Kommentarfeld.