2

我一直在努力尝试在 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>

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

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

4

1 回答 1

3

这里发生了一些事情:

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

has_content

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

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

  1. line.datecol?date("M/d/yyyy")将不起作用,因为Freemarker 将datecollikeduedate识别为date_like- 不是字符串。其中为空,duedate被识别为字符串,但当然与格式不匹配,为空。
  2. 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}在其中一列中使用。您可以按照类似的过程来计算和显示开放天数。

于 2019-05-20T20:45:23.673 回答