von Patrick Gundlach |

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.

Die berechneten Zwischensummen

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.