Тег foreach выполняет перебор по элементу-контейнеру всех пар ключ-значение и размещает их в области видимости дочерних узлов.
Атрибуты тега foreach
| Наименование | Тип данных | Описание | Примечания |
|---|---|---|---|
| var | строковый | Имя или значение переменной | Не обязателен |
| container | строковый в формате JSON | Область перебора |
В переменную counter из таблицы documents.carditem получаются значения счетчиков, которые затем выводятся при печати в отчет. На печать для каждого счетчика будут выведены переменные ключ counter.key и значение counter.value.
<select query="select coalesce(counters) as counters from documents.carditem where documentid = $document.id$">
<foreach var="counter" container="counters">
<var name="counter.key"/><text>: </text><var name="counter.value"/><br/>
</foreach>
</select>
Если атрибут counter не задан, то переменным с id счетчика и значением счетчика можно сразу присвоить имена key и value:
<select query="select coalesce(counters) as counters from documents.carditem where documentid = $document.id$">
<foreach container="counters">
<var name="key"/><text>: </text><var name="value"/><br/>
<if var="key" op="eq" value="777">
<text>Сработала акция со счетчиком 777</text><br/>
<text>и его значение:</text><var name="value"/><br/>
</if>
</foreach>
</select>
Используя значения счетчика, можно настроить различное поведение для печати на чеке.
Пусть существует набор счетчиков, значения которых необходимо проверить и указать соответственно каждому некоторый статус карты.
| Счетчик | Значение |
|---|---|
| 777 | 22 |
| 444 | 8 |
| xxx | 4 |
| 123 | отсутствует |
Если в файле sale.xml задать следующую схему, где вместо ??? указать id счетчика:
<select query="select coalesce(counters) as counters from documents.carditem where documentid = $document.id$">
<op var="isCounterExist" set="0"/>
<foreach container="counters">
<if var="key" op="eq" value="???">
<op var="isCounterExist" set="1.000"/>
<if var="value" op="ge" value="0">
<if var="value" op="le" value="7">
<text>Статус вашей карты:</text><br/>
<text>Серебро</text><br/>
</if>
</if>
<if var="value" op="ge" value="10">
<if var="value" op="le" value="50">
<text>Статус вашей карты:</text><br/>
<text>Золото</text><br/>
</if>
</if>
</if>
</foreach>
<if var="$isCounterExist$" op="ne" value="1.000"><br/>
<text>Статус вашей карты:</text><br/>
<text>Бронза</text><br/>
</if>
</select>
В этом случае при печати чека в каждом из случаев будет следующее поведение:
value="???" | Поведение |
|---|---|
| 777 | Значение счетчика попадает в диапазон от 10 до 50. На печать будет выведен текст: «Статус вашей карты: Золото» |
| 444 | Значение счетчика не входит ни в один из заданных диапазонов. На печать статус карты не выводится |
| xxx | Значение счетчика входит в диапазон от 0 до 7. На печать будет выведен текст: «Статус вашей карты: Серебро» |
| 123 | Счетчик отсутствует в карте. На печать будет выведен текст: "Статус вашей карты: Бронза" |