在 Freemarker 中使用 NetSuite 日期

Posted

技术标签:

【中文标题】在 Freemarker 中使用 NetSuite 日期【英文标题】:Working With NetSuite Dates in Freemarker 【发布时间】:2019-10-07 03:05:28 【问题描述】:

我一直在努力尝试在 NetSuite 中的报表高级 PDF 模板中添加“开放天数”列和“逾期天数”列。但是,在处理源自 NetSuite 记录的日期值时,我一直遇到问题。试图操纵日期值不断导致未指定的错误。我有点困惑,我现在能不能完成这项工作。

例如,如果我将以下内容应用于模板,则可以格式化输入到模板中的任何日期和日期/时间值:

<#setting date_format="dd-MM-yyyy">
<#setting datetime_format="dd-MM-yyyy hh:mm a">

但是,如果我尝试将值用作日期/日期时间对象,则会出错。因此尝试执行以下操作失败:

<#assign d2 = line.duedate?long>

虽然这有效:

<#assign d1 = .now?date?long>

此外,尝试假设该值实际上是传入的字符串并转换为日期/日期时间也会失败。执行以下操作会导致错误:

<#assign d2 = line.datecol?date("M/d/yyyy")> // format used by default in NetSuite date output

另一件毫无意义的事情是检查到期日并仅在有到期日时才显示值(防止显示实际上不是发票的报表条目的数据)。因此,即使在完成的 PDF 中设置并显示了截止日期,以下内容也无法显示正确的结果:

<#if line.duedate?has_content>$daysoverdue<#else>empty</#if>

它不会显示过期值(此时只是用于测试的静态值),而是显示“空”。无论到期日期值是否可用,每一行的整个列都将显示为好像该字段为空一样。所以,我不知道这是否相关。

我已经研究了一段时间,到目前为止还没有找到任何有用的搜索。

【问题讨论】:

【参考方案1】:

这里发生了一些事情:

    line.duedate 并不总是具有有效的日期值 - 即:当该行是贷项凭单时,不适用到期日。在这种情况下,尝试将line.duedate?long 分配给变量将导致错误。为避免这种情况,您可以先检查以确保其有效。 但是,使用?has_content 并不能如您所愿。很难确切地确定这是为什么,但在 Freemarker 文档中提供了一个线索(强调添加):

有内容

如果变量存在(并且不是Java null)并且不是“空”,则为真,否则为假。 “空”的含义取决于具体情况。这遵循直观的常识性想法。以下是空的:长度为 0 的字符串、长度为 0 标记的标记输出值、没有子变量的序列或散列、已传递最后一个元素的集合。如果该值不属于这些类型中的任何一种,则如果它是数字、日期或布尔值(例如 0 和 false 不为空),则它计为非空,否则计为空。 请注意,当您的数据模型实现多个模板模型接口时,您可能会得到意想不到的结果。但是,当您有疑问时,您可以始终使用 expr!?size > 0 或 expr!?length > 0 而不是expr?has_content.

这个内置的特殊之处在于您可以像使用默认值运算符一样使用括号技巧。也就是说,您可以同时编写 product.color?has_content 和 (product.color)?has_content。第一个不处理产品丢失的情况,最后一个处理。

    line.datecol?date("M/d/yyyy") 不起作用,因为 datecol,就像 duedate 被 Freemarker 识别为 date_like - 不是字符串。其中为空,duedate 被识别为字符串,但随后当然与格式不匹配,为空。 daysoverdue 在语句的数据模型中似乎不可用,但可以计算出来。

要将所有这些点放在一起,您可以首先检查到期日是否有效,然后计算逾期天数:

<#if line.duedate?is_date_like>
  <#assign d2 = line.duedate?long>
  <#assign daysoverdue = ((.now?date?long - d2) / (24*60*60*1000))?floor>
<#else>
  <#assign d2 = "">
  <#assign daysoverdue = "">
</#if>

然后,您可以在其中一列中使用$daysoverdue。您可以按照类似的过程来计算和显示营业日。

【讨论】:

我需要的是“is_date_like”,谢谢。我在文档中没有看到。

以上是关于在 Freemarker 中使用 NetSuite 日期的主要内容,如果未能解决你的问题,请参考以下文章

Freemarker / Netsuite - 将变量分配给特定的项目数量

在变量 freemarker 中显示引号 - netsuite 高级 pdf

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

Netsuite / Freemarker - 访问电子邮件模板中的交易行级别数据

使用 BFO、Freemarker 和 HTML 在多个页面上重复表格列标题 - NetSuite

使用 NetSuite 高级 PDF 和保存的搜索编写 Freemarker 脚本