Тег 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>

Используя значения счетчика, можно настроить различное поведение для печати на чеке.

Пример

Пусть существует набор счетчиков, значения которых необходимо проверить и указать соответственно каждому некоторый статус карты.

СчетчикЗначение
77722
4448
xxx4
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Счетчик отсутствует в карте. На печать будет выведен текст: "Статус вашей карты: Бронза"
  • No labels