> ## 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.

# DC- (Zähler und Rechnen)

> Die Rechen-Tags des Templates: Positionen durchnummerieren, mit Ganzzahlen rechnen und kaufmännische Beträge samt Mehrwertsteuer ermitteln.

Im Template lässt sich rechnen, und zwar mit vier Familien von Tags, die sich in dem unterscheiden, womit sie rechnen.

| Familie | Rechnet mit | Typisch für |
| - | - | - |
| `DC-Counter1…3` | ganzen Zahlen, nur aufwärts in Einerschritten | Positionen in einer Schleife durchnummerieren |
| `DC-Int1…3` | ganzen Zahlen, alle Grundrechenarten und Modulo | jede zweite Zeile einfärben, Raster berechnen |
| `DC-CommercialCalc1…3` | Dezimalzahlen mit Preisformatierung | Preise, Mehrwertsteuer, Rabatte |
| `DC-Add()`, `DC-Sub()`, `DC-Mul()`, `DC-Div()` | zwei Werten in einem einzigen Tag | eine einmalige Rechnung an Ort und Stelle |

Von den ersten drei Familien gibt es je drei Stück, angesprochen über die Ziffer im Namen: `DC-Counter1` bis `DC-Counter3`. Mehr sind es nicht, und sie gelten für die gesamte Seite. Wer drei Zähler gleichzeitig braucht und einen vierten benötigt, muss einen davon zurücksetzen und wiederverwenden.

## Der Zähler

`DC-Counter1…3` zählt und gibt seinen Stand aus. Mehr kann er nicht, und genau darum ist er die richtige Wahl für die häufigste Aufgabe: Nummerieren, was eine Schleife durchläuft.

| Tag | Wirkung |
| - | - |
| `DC-Counter1…3_reset` | setzt den Stand auf 0 |
| `DC-Counter1…3_inc` | erhöht den Stand um 1 |
| `DC-Counter1…3` | gibt den Stand aus |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-Counter1_reset~

{@PR-Data}
   ~DC-Counter1_inc~
   <span class="position">~DC-Counter1~</span>
   ~PR-Name~
{/@PR-Data}
```

> [!WARNING]
>
> Setzen Sie den Zähler vor jeder Schleife zurück. Sonst zählt er von dem Stand weiter, den eine frühere Schleife auf derselben Seite hinterlassen hat.

### Auf bestimmte Positionen reagieren

Als Bereichs-Tag prüft `DC-Counter1…3` gegen eine kommagetrennte Liste von Zählerständen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@PR-Data}
   ~DC-Counter1_inc~

   {DC-Counter1(1)}
      <!-- nur das erste Produkt -->
   {/DC-Counter1(1)}

   {DC-Counter1(2,4,6)}
      <!-- das zweite, vierte und sechste Produkt -->
   {/DC-Counter1(2,4,6)}
{/@PR-Data}
```

Für regelmäßige Muster ist die Aufzählung unpraktisch, weil die Liste mit der Produktzahl wächst. Nehmen Sie dafür `DC-Int1…3_mod()`, siehe unten.

### Zwei Listen getrennt zählen

Soll jede Liste bei 1 beginnen, gehört das Zurücksetzen an den Anfang jeder Liste.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{CAT-AdvData($C-Links,999)}
   ~DC-Counter1_reset~
   {@PR-Data}
      ~DC-Counter1_inc~ ~PR-Name~
   {/@PR-Data}
{/CAT-AdvData($C-Links,999)}

{CAT-AdvData($CS-Links,999)}
   ~DC-Counter1_reset~
   {@PR-Data}
      ~DC-Counter1_inc~ ~PR-Name~
   {/@PR-Data}
{/CAT-AdvData($CS-Links,999)}
```

## Die Ganzzahl-Variable

`DC-Int1…3` rechnet mit ganzen Zahlen. Alle Zusätze verändern den gespeicherten Wert, ausgegeben wird er allein durch `DC-Int1…3`.

| Zusatz | Wirkung |
| - | - |
| `_set()` | setzt den Ausgangswert |
| `_add()` | addiert |
| `_sub()` | subtrahiert |
| `_mul()` | multipliziert |
| `_div()` | dividiert |
| `_mod()` | ersetzt den Wert durch den Rest der Division |
| `_inc` | erhöht um 1 |

Alle Zusätze mit Argument sind Tag-in-Tag-fähig, der Ausgangswert kann also aus einem anderen Tag kommen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@PR-Data}
   ~DC-Counter1_inc~
   ~DC-Int1_set($DC-Counter1$)~
   ~DC-Int1_add(3)~
   Ergebnis: ~DC-Int1~
{/@PR-Data}
```

> [!WARNING]
>
> Eine Division durch 0 bleibt wirkungslos: Der Wert behält seinen bisherigen Stand, es gibt weder Fehlermeldung noch Abbruch. Prüfen Sie den Divisor deshalb selbst, wenn er aus einem Tag kommt.

### Jede zweite Zeile

Das ist der klassische Einsatz von `_mod()`: Der Rest der Division durch 2 ist bei geraden Positionen 0 und bei ungeraden 1.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{@PR-Data}
   ~DC-Counter1_inc~
   ~DC-Int1_set($DC-Counter1$)~
   ~DC-Int1_mod(2)~

   {DC-Int1(0)}<tr class="gerade">{/DC-Int1(0)}
   {DC-Int1(1)}<tr class="ungerade">{/DC-Int1(1)}
      <td>~PR-Name~</td>
   </tr>
{/@PR-Data}
```

Genauso legen Sie ein Raster an: `_mod(3)` ergibt 0, 1, 2 und wiederholt sich, das Ergebnis 0 markiert also jede dritte Position und damit den Anfang einer neuen Zeile.

Materialien: [Modulo-Rechnung](https://dokumentation.websale.de/v8s/materialien/materialien-modulo-rechnung.md)

### Auf Werte klammern

Wie der Zähler prüft auch `DC-Int1…3` als Bereichs-Tag gegen eine kommagetrennte Liste.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{DC-Int1(0,2,4)}
   <!-- greift bei den Werten 0, 2 und 4 -->
{/DC-Int1(0,2,4)}
```

## Die kaufmännische Rechnung

`DC-CommercialCalc1…3` rechnet mit Dezimalzahlen und gibt das Ergebnis in der Preisformatierung aus, die in der Shopkonfiguration `shop.config` eingestellt ist. Gerechnet wird intern mit voller Genauigkeit, gerundet wird erst bei der Ausgabe.

| Zusatz | Wirkung auf den gespeicherten Wert |
| - | - |
| `_set()` | setzt den Ausgangswert |
| `_add()` | addiert das Argument |
| `_sub()` | subtrahiert das Argument |
| `_mul()` | multipliziert mit dem Argument |
| `_div()` | dividiert durch das Argument |
| `_percent()` | ersetzt den Wert durch den angegebenen Prozentsatz davon |
| `_VAT()` | ersetzt den Wert durch die enthaltene Mehrwertsteuer, der Wert gilt als brutto |
| `_VATadd()` | schlägt den Mehrwertsteuersatz auf, der Wert gilt als netto |
| `_VATsub()` | zieht die enthaltene Mehrwertsteuer ab, der Wert gilt als brutto |

> [!WARNING]
>
> `_percent()`, `_VAT()`, `_VATadd()` und `_VATsub()` unterscheiden sich in einem Punkt, der leicht übersehen wird. `_VATadd()` rechnet vom Nettowert aufwärts, `_VAT()` und `_VATsub()` rechnen aus einem Bruttowert heraus. Bei 100,00 € und 19 Prozent ergibt `_VATadd(19)` also 119,00 €, `_VAT(19)` dagegen 15,97 € und `_VATsub(19)` 84,03 €.

### Preise als Ausgangswert

Als Argument sind alle Einzel-Tags zulässig, die einen von WEBSALE formatierten Preis ausgeben. Die Preisformatierung wird dabei automatisch abgeschaltet, bevor der Wert übernommen wird.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-CommercialCalc1_set($PR-Price$)~
~DC-CommercialCalc1_VATadd(19)~
Bruttopreis: ~DC-CommercialCalc1~
```

> [!WARNING]
>
> Feste Werte im Argument schreiben Sie ohne Tausendertrennzeichen und mit einem Punkt als Dezimaltrenner. Eine Währungsangabe darf nicht mitkommen, sonst ist das Ergebnis unbrauchbar.

### Ein Rabatt in zwei Schritten

Zwei der drei Rechner lassen sich kombinieren: einer hält den Ausgangswert, der andere berechnet den abzuziehenden Betrag.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-CommercialCalc1_set($PR-Price$)~
~DC-CommercialCalc2_set($PR-Price$)~
~DC-CommercialCalc2_percent(10)~
~DC-CommercialCalc1_sub($DC-CommercialCalc2$)~

Rabatt: ~DC-CommercialCalc2~
Ihr Preis: ~DC-CommercialCalc1~
```

### Mehr Nachkommastellen

`DC-CommercialCalc1…3` rundet auf zwei Nachkommastellen. Brauchen Sie mehr, hängen Sie `_prec` und die gewünschte Stellenzahl an.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-CommercialCalc1_set(20)~
~DC-CommercialCalc1_div(3)~

~DC-CommercialCalc1~         <!-- 6,67 -->
~DC-CommercialCalc1_prec3~   <!-- 6.667 -->
~DC-CommercialCalc1_prec9~   <!-- 6.666666667 -->
```

> [!WARNING]
>
> Die Ausgabe mit `_prec` verwendet nicht die Preisformatierung des Shops, sondern das technische Format: kein Tausendertrennzeichen, Punkt als Dezimaltrenner. Für Beträge, die der Käufer lesen soll, ist deshalb das Tag ohne Zusatz die richtige Wahl. `_prec` ist für Werte gedacht, die weiterverarbeitet werden, beispielsweise in einer Schnittstelle.

Zulässig sind 1 bis 10 Nachkommastellen. Eine höhere Angabe macht das Tag ungültig.

* Materialien: [Kaufmännische Berechnungen](https://dokumentation.websale.de/v8s/referenz/tags/dc/rechnen.md)
* Wegweiser: [Preisformatierung an bestimmten Stellen aufheben](https://dokumentation.websale.de/v8s/preise/preisformatierungen.md#preisformatierung-an-bestimmten-stellen-aufheben)

## Einzelrechnungen ohne Zwischenspeicher

Für eine Rechnung, die nur an einer Stelle gebraucht wird, gibt es vier Tags, die beide Werte im Argument entgegennehmen und das Ergebnis sofort ausgeben. Ein Rechner wird dafür nicht belegt.

| Tag | Ergebnis |
| - | - |
| `DC-Add(a,b)` | a plus b |
| `DC-Sub(a,b)` | a minus b |
| `DC-Mul(a,b)` | a mal b |
| `DC-Div(a,b)` | a geteilt durch b |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
~DC-Mul($PR-Price$,$BASKET-PR-Quantity$)~
~DC-Div(20,3)~          <!-- 6,67 -->
```

Beide Argumente sind Tag-in-Tag-fähig, und `_prec` funktioniert genauso wie bei `DC-CommercialCalc1…3`.

> [!WARNING]
>
> Ist der zweite Wert bei `DC-Div()` gleich 0, gibt das Tag nichts aus. An der Stelle bleibt die Seite dann einfach leer.

## Die Tags im Überblick

| Tag | Einzel-Tag | Bereichs-Tag | negatives Bereichs-Tag | Schleifen-Tag |
| - | - | - | - | - |
| `DC-Counter1…3()` | ja | ja | ja | – |
| `DC-Counter1…3_inc` | ja | – | – | – |
| `DC-Counter1…3_reset` | ja | – | – | – |
| `DC-Int1…3()` | ja | ja | ja | – |
| `DC-Int1…3_set()` | ja | – | – | – |
| `DC-Int1…3_add()` | ja | – | – | – |
| `DC-Int1…3_sub()` | ja | – | – | – |
| `DC-Int1…3_mul()` | ja | – | – | – |
| `DC-Int1…3_div()` | ja | – | – | – |
| `DC-Int1…3_mod()` | ja | – | – | – |
| `DC-Int1…3_inc` | ja | – | – | – |
| `DC-CommercialCalc1…3` | ja | – | – | – |
| `DC-CommercialCalc1…3_prec1…10` | ja | – | – | – |
| `DC-CommercialCalc1…3_set()` | ja | – | – | – |
| `DC-CommercialCalc1…3_add()` | ja | – | – | – |
| `DC-CommercialCalc1…3_sub()` | ja | – | – | – |
| `DC-CommercialCalc1…3_mul()` | ja | – | – | – |
| `DC-CommercialCalc1…3_div()` | ja | – | – | – |
| `DC-CommercialCalc1…3_percent()` | ja | – | – | – |
| `DC-CommercialCalc1…3_VAT()` | ja | – | – | – |
| `DC-CommercialCalc1…3_VATadd()` | ja | – | – | – |
| `DC-CommercialCalc1…3_VATsub()` | ja | – | – | – |
| `DC-Add()` | ja | – | – | – |
| `DC-Sub()` | ja | – | – | – |
| `DC-Mul()` | ja | – | – | – |
| `DC-Div()` | ja | – | – | – |

Zulässig sind alle Tags auf allen Templates.

Die Zusätze der Familien `DC-Int` und `DC-CommercialCalc` werden mit einem Unterstrich angehängt: `~DC-Int1_add(3)~`.

## Verwandte Themen

* Wegweiser: Bereiche abhängig von Zählerwerten anzeigen
* Wegweiser: [Preisformatierung an bestimmten Stellen aufheben](https://dokumentation.websale.de/v8s/preise/preisformatierungen.md#preisformatierung-an-bestimmten-stellen-aufheben)
* Materialien: Kaufmännische Berechnungen
* Materialien: Modulo-Rechnung
* Referenz: [DC- (Schleifen)](https://dokumentation.websale.de/v8s/referenz/tags/dc/schleifen.md)


## Related topics

- [DC- (Schleifen)](https://dokumentation.websale.de/v8s/referenz/tags/dc/schleifen.md)
- [DC- (Freie Parameter und Session-Parameter)](https://dokumentation.websale.de/v8s/referenz/tags/dc/parameter.md)
- [WS-DataFlowManager: Tag-Referenz](https://dokumentation.websale.de/v8s/schnittstellen/marketing-seo-und-portale/ws-dataflowmanager/tag-referenz.md)
- [Modulo-Rechnung in WEBSALE V8s](https://dokumentation.websale.de/v8s/materialien/materialien-modulo-rechnung.md)
- [Zähler und Vergleiche im Template](https://dokumentation.websale.de/v8s/fortgeschrittene-designtechniken/zaehler-und-vergleiche-im-template.md)


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