NetSuite FreeMarker Расширенный PDF HTML-шаблон, ЕСЛИ ошибка - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующий код HTML-шаблона NetSuite Advanced PDF, который выдает мне ошибку:

<#if record.item?has_content>

<table class="itemtable" style="width: 100%;"><!-- start items --><#list record.item as item><#if item_index==0>
<thead>
  <tr>
  <th colspan="4">Item Code</th>
  <th colspan="12">Item Description</th>
  <th align="right" colspan="2">UOM1</th>
  <th align="right" colspan="3">${item.quantity@label}</th>
  <th align="right" colspan="3">UOM2</th>
  <th align="right" colspan="4">Unit Price (excl. VAT)</th>
  <th align="right" colspan="3">${item.amount@label}</th>
  </tr>
</thead>
</#if><tr>
  <td colspan="4">${item.item}</td>
  <td colspan="12">${item.description}</td>
  <td align="right" colspan="2">${item.custcolsyn_uom}&nbsp;${item.custcolsyn_unit_measure}</td>
  <td align="right" colspan="3">${item.quantity}</td>
  <td align="right" colspan="3">${item.units}</td>
  <td align="right" colspan="4"><#if item.rate?has_content>${item.rate?keep_before_last(".")}.${item.rate?keep_after_last(".")[0..1]}<#else>&nbsp;</#if></td>
  <td align="right" colspan="3">${item.amount}</td>
  </tr>
  </#list><!-- end items --></table>
</#if>

Проблема связана со строкой:

<td align="right" colspan="4"><#if item.rate?has_content>${item.rate?keep_before_last(".")}.${item.rate?keep_after_last(".")[0..1]}<#else>&nbsp;</#if></td>

Похоже, FreeMarkerоценивая следующую часть

${item.rate?keep_before_last(".")}.${item.rate?keep_after_last(".")[0..1]}

, даже если в позиции ничего нет для ставки.Конечно,

<#if item.rate?has_content>

должен предотвратить эту оценку.Я пытался сохранить только валютные данные на 2 десятичных знака, а все другие методы, которые я пытался, потеряли символ валюты.

Мы находимся на последней версии NetSuite (2018.2).

Сообщение об ошибкеэто:

The template cannot be printed due to the following errors: 

Error on line 239, column 95 in template.

Detail...

Range start index 0 is out of bounds, because the sliced string has only 0 character(s). (Note that indices are 0-based).
The blamed expression:
==> 0..1 [in template "template" at line 239, column 128]

----
FTL stack trace ("~" means nesting-related):
- Failed at: ${item.rate?keep_after_last(".")[0..1]} [in template "template" at line 239, column 95]
----


Please contact your administrator.

У кого-нибудь есть идеи, что я делаю неправильно или как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Функция Freemarker ?has_content может дать неожиданные результаты, особенно если вы не управляете базовой моделью данных (как в случае с NetSuite).По сути, происходит то, что передаваемый item.rate не является null и не соответствует определению ?has_content «пустой», даже если он выглядит пустым.Вместо этого вы можете использовать ?length gt 0:

  <td align="right" colspan="4"><#if item.rate?length gt 0>${item.rate?keep_before_last(".")}.${item.rate?keep_after_last(".")[0..1]}<#else>&nbsp;</#if></td>

Это все равно будет проблемой, если, например, item.rate по какой-то причине было передано в шаблон без ".", Как это было бы до сих пор.заканчивается пустой строкой, для которой индекс [0..1] будет недействительным.

Таким образом, вы можете проверить, является ли item.rate ?contains десятичным разделителем вместо:

<td align="right" colspan="4"><#if item.rate?contains(".")>${item.rate?keep_before_last(".")}.${item.rate?keep_after_last(".")[0..1]}<#else>&nbsp;</#if></td>

Но самое простое, что можно сделать, это использовать вместо этого встроенное форматирование строки валюты Freemarker.:

<td align="right" colspan="4">${item.rate?string.currency}</td>
0 голосов
/ 25 февраля 2019

Так как вы сказали, что скорость равна нулю, вы можете использовать ??оператор теста:

<#if item.rate??></#if>

Также, если вы хотите проверить несколько условий, вы можете проверить <#if item.rate?? && item.rate?has_content></#if>

Для формата денег вы можете обратиться по этой ссылке docs .Если вы хотите пользовательский формат, попробуйте this

${item.rate:M2}
...