Как правильно сгруппировать записи при выполнении <#list> - PullRequest
0 голосов
/ 03 мая 2020

Новый парень здесь. Я строил расширенную форму в NetSuite (использует Freemarker) для отображения данных счета. Все выглядит и работает отлично, однако я хочу сгруппировать позиции счета-фактуры по местоположению. Я использую простой <#list> l oop для извлечения записей позиции. В настоящее время я отображаю местоположение каждой позиции.

Код (форматы / стили удалены для простоты):

<table>
  <#list record.item as item>
     <tr>
        <td> ${item.location} </td>
        <td> ${item.description} </td>
        <td> ${item.quantity} </td>
        <td> ${item.rate} </td>
        <td> ${item.amount} </td>
    </tr>
  </#list>
</table>

Пример текущего вывода:

Location A     Des 1              1        $100     $100
Location B     Des 1              1        $100     $100
Location C     Des 1              1        $100     $100
Location A     Des 2              1        $100     $100
Location B     Des 2              1        $100     $100
Location C     Des 2              1        $100     $100
Location A     Des 3              1        $100     $100
Location C     Des 3              1        $100     $100

Пример требуемого вывода:

Location A
Des 1              1        $100     $100
Des 2              1        $100     $100
Des 3              1        $100     $100
Location B
Des 1              1        $100     $100
Des 2              1        $100     $100
Location C
Des 1              1        $100     $100
Des 2              1        $100     $100
Des 3              1        $100     $100

Я пытался вложить второй <#list>, но он не работал правильно. Любые предложения или указатели будут полезны, чтобы вы sh меня в правильном направлении.

Спасибо!

1 Ответ

0 голосов
/ 04 мая 2020

FreeMarker ожидает, что такая группировка будет производиться независимо от того, какие переменные установлены, что в данном случае является NetSuite. (Тем не менее, я думаю, что это можно рассматривать как чисто презентационную проблему, и поэтому, возможно, FreeMarker должен справиться с этим в будущем.) Если NetSuite действительно не будет группировать данные для вас, то вы должны сделать это во FreeMarker, что будет быть немного неловким, так как это не настоящий язык программирования ... но здесь он есть.

Определите макрос следующим образом:

<#macro listGroups items groupField>
  <#if items?size == 0><#return></#if>
  <#local sortedItems = items?sort_by(groupField)>
  <#local groupStart = 0>
  <#list sortedItems as item>
    <#if !item?is_first && item[groupField] != lastItem[groupField]>
      <#local groupEnd = item?index>
      <#nested lastItem[groupField], sortedItems[groupStart ..< groupEnd]>
      <#local groupStart = groupEnd>
    </#if>
    <#local lastItem = item>
  </#list>
  <#local groupEnd = sortedItems?size>
  <#nested lastItem[groupField], sortedItems[groupStart ..< groupEnd]>
</#macro>

Вы можете использовать этот макрос позже, например так:

<@listGroups record.item "location"; groupName, groupItems>
  <p>${groupName}</p>
  <table>
    <#list groupItems as groupItem>
       <tr>
          <td>${groupItem.location}</td>
          <td>${groupItem.description}</td>
          <td>${groupItem.quantity}</td>
          <td>${groupItem.rate}</td>
          <td>${groupItem.amount}</td>
      </tr>
    </#list>
  </table>
</@listGroups>

Обратите внимание, что groupName и groupItems в <@listGroups ...> являются просто произвольными l oop именами переменных, которые вы указываете, и они не должны совпадать с именами переменных, используемыми в определении #macro .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...