> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# Modulo-Rechnung in WEBSALE V8s

> Warum Zähler-Tags mit Klammerzusatz nie null liefern, wie die abgewandelte Modulo-Rechnung von WEBSALE V8s funktioniert und welche Tags sie verwenden.

Mehrere Tags nehmen eine Zahl in Klammern entgegen und zählen damit reihum, typischerweise für abwechselnde Zeilenfarben in einer Tabelle. Dahinter steckt eine Modulo-Rechnung, die in einem Punkt von der mathematischen Regel abweicht. Wer das nicht weiß, vergibt die falschen Klassennamen im Stylesheet.

## Modulo im mathematischen Sinn

Modulo liefert den Rest einer Division zweier ganzer Zahlen. Das Ergebnis der Division selbst wird verworfen.

| Rechnung | Ergebnis | Weil |
| - | - | - |
| 10 mod 3 | 1 | 10 geteilt durch 3 ist 3, Rest 1 |
| 15 mod 3 | 0 | 15 geteilt durch 3 ist 5, Rest 0 |
| 7 mod 2 | 1 | 7 geteilt durch 2 ist 3, Rest 1 |

Der Wertebereich liegt damit zwischen `0` und der um eins verminderten Zahl, bei Divisor 3 also zwischen 0 und 2.

## Die Abweichung in WEBSALE V8s

Für einen Zähler ist die Null unpraktisch. Beim ersten Durchlauf einer Schleife soll eine `1` herauskommen und nicht eine `0`, und ein Klassenname `zeile0` liest sich schlechter als `zeile1`.

Deshalb gilt in WEBSALE V8s: **Wäre das Ergebnis null, wird stattdessen der Divisor ausgegeben.**

```text theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
ergebnis(x, n) = x mod n,  solange x mod n nicht 0 ist
ergebnis(x, n) = n,        wenn x mod n gleich 0 ist
```

Dabei ist `x` der interne Zähler, der bei jeder Ausführung des Tags um eins steigt, und `n` die Zahl in der Klammer.

Gleichwertig und oft bequemer zu lesen ist die geschlossene Form `((x − 1) mod n) + 1`. Beide Schreibweisen liefern dieselben Werte.

### Was dabei herauskommt

Bei einem Divisor von 3 ergibt sich diese Folge:

| Durchlauf | mathematisch | in WEBSALE V8s |
| - | - | - |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 0 | **3** |
| 4 | 1 | 1 |
| 5 | 2 | 2 |
| 6 | 0 | **3** |

> [!WARNING]
>
> Der Wertebereich liegt damit immer zwischen `1` und `n`, beide eingeschlossen. Eine `0` kommt nie vor.
>
> Wenn Sie also mit `~PR-Position(2)~` abwechselnde Zeilenfarben erzeugen, heißen die Klassen `…1` und `…2`, nicht `…0` und `…1`. Legen Sie Ihr Stylesheet entsprechend an.

Ein Zähler, der noch bei null steht, liefert bei einem Divisor von 3 ebenfalls eine `3`, weil 0 mod 3 null ergibt und damit die Ersetzung greift. Das fällt in einer Schleife nicht auf, weil dort beim ersten Durchlauf bereits hochgezählt wurde. Es kann aber auffallen, wenn Sie einen Zähler vor dem ersten Erhöhen auslesen.

## Ein Beispiel

Abwechselnde Zeilenfarben in einer Produktliste:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@PR-Data}
   <tr class="zeile~PR-Position(2)~">
      <td>~PR-Name~</td>
      <td>~PR-Price~</td>
   </tr>
{/@PR-Data}
```

```css theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
.zeile1 { background: #ffffff; }
.zeile2 { background: #f0f0f0; }
```

Für reine Zebrastreifen braucht es das Tag heute nicht mehr, dafür genügt `tr:nth-child(even)` im Stylesheet. Sinnvoll bleibt der Zähler dort, wo die Zahl selbst gebraucht wird, beispielsweise um nach jedem dritten Eintrag eine Spalte umzubrechen.

## Welche Tags so rechnen

Diese abgewandelte Modulo-Rechnung greift bei allen Tags, die eine Zahl als Klammerzusatz entgegennehmen und damit einen Zähler ausgeben. Dazu gehören unter anderem:

| Tag | Zählt |
| - | - |
| `PR-Position()` | die Position in der Produktliste |
| `BASKET-PR-Position()` | die Position im Warenkorb |
| `WS-CounterInc()` und `WS-Counter2Inc()` | einen freien Zähler, den Sie selbst hochzählen |
| `DC-Int1_mod()` bis `DC-Int3_mod()` | das Ergebnis einer eigenen Rechnung |

> [!WARNING]
>
> Die Liste ist nicht abschließend. Prüfen Sie im Zweifel in der Referenz des jeweiligen Tags, ob der Klammerzusatz als Divisor gemeint ist. Ein Klammerzusatz kann je nach Tag auch etwas ganz anderes bedeuten, beispielsweise die Zahl der Nachkommastellen.

`PR-Position()` kennt zusätzlich eine Form mit zwei Zahlen. Dann arbeitet das Tag nicht als Einzel-Tag, sondern als Klammerung, und greift, wenn das Ergebnis der Modulo-Rechnung der zweiten Zahl entspricht. So geben Sie beispielsweise nur bei jedem dritten Produkt etwas aus.

Referenz: [PR-Position()](https://dokumentation.websale.de/v8s/referenz/tags/pr/grundlagen-und-produktdaten.md#die-stellung-in-der-liste) · [BASKET-PR-Position()](https://dokumentation.websale.de/v8s/referenz/tags/basket/besondere-produktarten-im-warenkorb.md) · [WS-CounterInc()](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md#die-tags-im-uberblick) · [WS-Counter2Inc()](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md#die-tags-im-uberblick) · [DC-Int1…3\_mod()](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md#die-tags-im-uberblick)


## Related topics

- [Materialien Produktvergleich](https://dokumentation.websale.de/v8s/materialien/materialien-produktvergleich.md)
- [DC- (Zähler und Rechnen)](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md)
- [OH- (Bestellhistorie)](https://dokumentation.websale.de/v8s/referenz/tags/oh-bestellhistorie.md)
- [Zähler und Vergleiche im Template](https://dokumentation.websale.de/v8s/fortgeschrittene-designtechniken/zaehler-und-vergleiche-im-template.md)
- [PR- (Grundlagen und Produktdaten)](https://dokumentation.websale.de/v8s/referenz/tags/pr/grundlagen-und-produktdaten.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.