Mam następujący kod szablonu HTML Netsuite Advanced PDF, który daje mi błąd:

<#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>

Problem polega na linii:

<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>

Wygląda na to, że Freemarker ocenia następującą część

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

Nawet gdy element linii nie ma nic dla stawki. Pewno

<#if item.rate?has_content>

Powinien zapobiec tej oceny. Próbowałem utrzymać 2 odcinków danych walutowych i wszystkich innych metod, które próbowałem stracić symbol waluty.

Jesteśmy w najnowszej wersji Netsuite (2018.2).

Komunikat o błędzie to:

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.

Każdy ma jakieś pomysły tego, co robię źle lub jak mogę to naprawić?

1
Superdooperhero 25 luty 2019, 14:20

2 odpowiedzi

Najlepsza odpowiedź

Funkcja Freemarker {X0}} może udzielić nieoczekiwanych wyników - zwłaszcza gdy nie kontrolujesz podstawowego modelu danych (czyli w przypadku Netsuite). Zasadniczo, co się dzieje, jest to, że przekazano item.rate nie jest null i nie spełnia definicji ?has_content "s Definicja" pustego ", nawet jeśli wygląda pustym. Zamiast tego możesz użyć ?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>

Nadal byłoby to problem, jeśli na przykład, item.rate był z jakiegoś powodu przekazany szablonowi bez ".", Ponieważ nadal skończy się pustym łańcuchem, dla którego [0..1] indeks byłby nieprawidłowy.

Więc możesz przetestować, czy item.rate ?contains separator dziesiętny zamiast tego:

<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>

Ale najprostszą rzeczą do zrobienia może być użycie wbudowanego swego formatowania strun walutowych:

<td align="right" colspan="4">${item.rate?string.currency}</td>
3
Krypton 25 luty 2019, 21:51

Ponieważ powiedziałeś stawkę NULL, możesz użyć? Operator testów:

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

Również jeśli chcesz sprawdzić wiele warunku, możesz sprawdzić <#if item.rate?? && item.rate?has_content></#if>

W formacie pieniędzy możesz odnieść się do tego linku Docs. Jeśli chcesz niestandardowy format, możesz spróbować To

${item.rate:M2}
1
soorapadman 26 luty 2019, 04:11