Beim Einsatz von Untertabellen im JobRouter geht es häufig um das Abbilden von Positionen. Rechnungs- oder Lieferpositionen oder eine ähnliche Reihenfolge sollen dargestellt werden. Im einfachsten Fall lässt man diese Arbeit vom Benutzer gleich mit erledigen. Aber wirklich schön ist diese Lösung nicht. Idealerweise sollte das die Untertabelle doch selbst machen. Wer schon einmal in die Tabelle in der Datenbank geschaut hat, der ist auch schon auf ein Feld gestoßen, das die Zeilennummer enthält. Das müsste man nun nur noch anzeigen. Aber auch hier gibt es einige Hürden. Zunächst einmal lassen sich die Systemfelder (also jene Felder, die der JobRouter intern selbst erzeugt) der Tabellen gar nicht so leicht zur Anzeige bringen. Zum Anderen ist dies eine fortlaufende Nummer, die technisch zwischen den Schritten gleich bleiben muss. Wird eine Position gelöscht, wird nicht neu nummeriert. Genau diese Funktionalität benötigen wir jedoch für unsere Positionsnummer.
Wir kommen also um eine eigene Lösung nicht herum. Zum Glück lässt sich die gewünschte Funktionalität mit wenigen Zeilen Javascript erreichen.
Anpassung der Untertabellenansicht
Zunächst einmal benötigen wir in der Untertabellenansicht eine Spalte für die Positionsnummer. Ob diese Tabelle auch in der realen Untertabelle enthalten ist, hängt davon ab, ob Sie den Wert für die Positionsnummer weiterverwenden möchten. Der Datentyp ist Integer und den Standardwert setzen wir auf „1“. Zusätzlich ist es notwendig, einen Funktionsaufruf „UpdatePosNumbers“ für die Ereignisse „AfterAdd“ und „AfterRemove“ hinzuzufügen. In unserem Beispiel rufen wir in beiden Fällen die gleiche Funktion auf. Sollten Sie zusätzliche Aktionen ausführen, die sich beim Hinzufügen und Löschen unterscheiden, müssen Sie hier ggf. 2 verschiedene Funktionen angeben.
Implementierung der Skripte
Nun ist die Funktion „UpdatePosNumbers“ zu implementieren. Die ist verhältnismäßig kurz und sorgt nur dafür, dass die Tabelle durchlaufen wird und für jede Zeile eine weitere Funktion aufgerufen wird. Und so sieht sie aus:
function updatePosNumbers() { var rowIds = jr_get_subtable_row_ids('UTV_PosNumbers'); rowIds.forEach(updatePosNumberForRow); }
Wir holen uns mit der ersten Zeile die Id’s der Tabellenzeilen und mit der zweiten Zeile durchlaufen wir diese und rufen jeweils eine weitere Funktion auf. In der zweiten Funktion wird die eigentliche Positionsnummer ermittelt und gesetzt.
function updatePosNumberForRow(rowId, index) { jr_set_subtable_value('UTV_PosNumbers', rowId, 'Position', index+1); }
Diese Funktion setzt den Wert der Spalte ‚Position‘ in der Untertabelle ‚UTV_PosNumbers‘ in der Zeile rowId. Der Wert wird auf „index+1“ gesetzt. Die Variable index stellt der JobRouter zur Verfügung, es handelt sich um die fortlaufende Zeilennummer der konkret dargestellten Tabelle. Da dieser Wert nullbasiert ist, müssen wir für eine „schöne“ Positionsnummer den Wert noch um 1 erhöhen.
Damit ist die Programmierarbeit auch schon abgeschlossen und wir können die Funktionalität testen.
Test
Beim Starten eines Vorgangs mit der angepassten Untertabelle wird nun beim Hinzufügen einer Zeile auch die Positionsnummer automatisch eingefügt. Das funktioniert auch, wenn Zeilen, aus der Mitte gelöscht werden. Wenn Sie zum Beispiel drei Zeilen haben, dann die zweite Zeile löschen, werden die verbleibenden Position korrekt neu durchnummeriert.
Erweiterungen
Das Skript kann leicht an zusätzliche Anforderungen angepasst werden. Zum Beispiel können Sie auch komplexere Nummerierungsformeln einfügen oder aber die Zeilen mit Buchstaben durchnummerieren. Sie müssen dazu nur die Funktion, die für jede Zeile die Positionsnummer ersetzt erweitern. Gegebenenfalls ist der Datentyp anzupassen.