执行 <#list> 时如何正确分组记录
Posted
技术标签:
【中文标题】执行 <#list> 时如何正确分组记录【英文标题】:How to properly group records when executing a <#list> 【发布时间】:2020-08-18 01:54:46 【问题描述】:这里有新人。我一直在 NetSuite 中构建一个高级表单(使用 Freemarker)来显示发票数据。一切看起来和工作都很好,但是,我想按位置对发票行项目进行分组。我正在使用一个简单的 循环来提取行项目记录。我目前在每个订单项上显示位置。
代码(为简单起见已删除格式/样式):
<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
我已尝试嵌套第二个 ,但它无法正常工作。任何建议或指示都会有助于将我推向正确的方向。
谢谢!
【问题讨论】:
我们需要有关允许您将 标记转换为表格的软件的更多信息。也许你要求的东西在那个软件上是可行的。 你能分享你从中获取数据的记录吗? 我正在创建来自 NetSuite 的“高级表单”(他们称之为)。 【参考方案1】: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>
请注意,<@listGroups ...>
中的 groupName
和 groupItems
只是您指定的任意循环变量名称,它们不需要与 #macro
定义中使用的变量名称匹配。
【讨论】:
谢谢!在输出数据之前,我通过循环遍历数据和分组来采用类似的思维模式,但仍在研究如何准确地实现“组”,我正在考虑循环并构建一个数组。然而,使用宏让我得到了我想要的结果。我由衷地感谢您!我肯定也会将它用于其他形式。 如果是多个分组呢?行首先应该按位置分组,然后按描述然后按费率?这在 Freemarker 中是否可以使用宏? @ClemenCanaria 上面的listGroups
宏可以通过多层嵌套调用:<@listGroups myFlatList "location"; groupNameLv1, groupItemsLv1>...<@listGroups groupItemsLv1 "description"; groupNameLv2, groupItemsLv2>...</@listGroups>...</@listGroups>
。以上是关于执行 <#list> 时如何正确分组记录的主要内容,如果未能解决你的问题,请参考以下文章