使用 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 提到的,这个字段是销售订单上的正文字段,还是行项目上的项目字段?如果它是一个行字段,您应该会看到类似<#list record.item as item>
的内容,它开始您的项目列表。然后要访问项目列表上的字段,您可以在列表中使用$item.description
,或者在您的情况下使用$item.item.custitem_item_category
(这是您可以从项目记录中获取字段的方式)。【参考方案3】:
下面的东西有效...
(这里可以设置1)
(这里可以设置2)
【讨论】:
以上是关于使用 Freemarker 为发票上的特定项目返回数量 1的主要内容,如果未能解决你的问题,请参考以下文章
在 Netsuite Advanced PDF 模板中使用 Freemarker 语法进行日期翻译