使用 Freemarker 为发票上的特定项目返回数量 1

Posted

技术标签:

【中文标题】使用 Freemarker 为发票上的特定项目返回数量 1【英文标题】:Returning a quantity of 1 for specific items on an invoice with Freemarker 【发布时间】:2019-01-07 07:57:12 【问题描述】:

我在 NetSuite 的高级 PDF/html 模板中使用 Freemarker 来生成发票。对于特定的项目类型,我想在发票上显示“1”而不是实际数量。这基于“服务”的项目类别下拉字段选择。我目前的尝试如下。

<#if record.custitem_item_category?string?contains("Services")>
<td align="center" colspan="3" line->1</td>
<#else>
<td align="center" colspan="3" line->$item.quantity</td>
</#if>

我尝试使用 ?has_content 验证最初的 #if 语句,但它只是跳到了 #else 语句,所以我认为我在那里遗漏了一些东西。

【问题讨论】:

【参考方案1】:

从字段名称custitem_xx 看来,您正在尝试访问自定义项目字段。这里有两个问题。首先,您需要从每一行读取值(即它应该是 item.item.custitem_item_category 而不是 record.custitem_item_category。但另外(除非它最近已修复),在 NetSuite 中这样做只会返回子列表第一行的值单个订单项。

您需要做的是创建一个自定义交易行字段并从项目中获取值,然后您可以像item.custcol_item_category 一样访问它。

[当您创建自定义字段时,取消选中 Store Value 以确保它始终以最新值采购,并确保在表单上的 Screen Fields 下选中它以显示在 UI 中 - 否则它不可用到您的模板。如果您确实想在 UI 中隐藏它,您可以将标签空白。]

【讨论】:

这解决了这个问题。您对 item.item.custitem_item_category 只是返回子列表中第一行的值是正确的,因此创建了自定义交易行字段并按说明进行了来源。【参考方案2】:

您的 if 语句看起来是正确的,这意味着 record.custitem_item_category?string?contains("Services") 没有返回您认为的值。通常,您只会在数字上使用?string 将其转换为字符串,如果它已经是字符串,则这是不必要的。

试着在每一行打印出$record.custitem_item_category,看看你会得到什么结果。如果其中一些包含“服务”,那么在 if 语句中使用 record.custitem_item_category?contains("Services") 应该没问题。

【讨论】:

谢谢乔恩。我尝试打印出 $record.custitem_item_category 并没有得到任何结果,所以看起来这至少是问题的一部分。 就像 michoel 提到的,这个字段是销售订单上的正文字段,还是行项目上的项目字段?如果它是一个行字段,您应该会看到类似&lt;#list record.item as item&gt; 的内容,它开始您的项目列表。然后要访问项目列表上的字段,您可以在列表中使用$item.description,或者在您的情况下使用$item.item.custitem_item_category(这是您可以从项目记录中获取字段的方式)。【参考方案3】:

下面的东西有效...

(这里可以设置1)

(这里可以设置2)

【讨论】:

以上是关于使用 Freemarker 为发票上的特定项目返回数量 1的主要内容,如果未能解决你的问题,请参考以下文章

在 Netsuite Advanced PDF 模板中使用 Freemarker 语法进行日期翻译

执行 <#list> 时如何正确分组记录

表视图绑定中的特定行内容

如何在 Freemarker 中按特定值对列表进行分组?

如何使用 Freemarker 和 Apache FOP 将项目列表呈现为 4 个块?

Freemarker使用总结