TextHTMLWriterMultiOutput Problem

Hallo, ich habe eine etwas komplizierte Struktur mit zahlreichen IFs und Elses. Wenn ich das Ganze mit dem einfachen TextHTMLWriter erstelle, bekomme ich am Ende folgende Struktur:


<9029872>

BES;12345;2145;6789;111083;3;xxx 94315;04000;

K;111083;;12345;9029872;;;;;;;;3;;ABC;;DEF 13/1;74343 GHI;DE;9029872;;

P;1;301082125;5;;;;

P;2;301082155;5;;;;

P;3;301082135;5;;;;

</9029872>

<9029870>

BES;12345;1816;6789;111083;1;xxx 94315;04000;

K;111083;;12345;9029870;;;;;;;;1;;JKL;;MNO;97225 P;DE;9029870;;

P;1;305227095;3;;;;

</9029870>


Es handelt sich dabei um Daten, die ich an eine API übergeben muß - dabei sind die in den eckigen Klammern stehenden Zahlen immer die jeweilige OrderID. Ich muß nun jeden dieser Blöcke als Datei speichern. Im ersten Fall wäre das der Bereich von BES bis zum letzten Semikolon, Name der Datei wäre der Inhalt der eckigen Klammern. Danach die nächste Datei genauso, usw.


Mir ist klar, daß dafür eigentlich der ...MultiOutput-Step der Richtige wäre.

Leider komme ich damit aber nicht weiter, weil die notwendigen <#assign filecontent>...</#assign>-Befehle in der verschachtelten Struktur nicht funktionieren - wenn ich sie aus meiner Sicht Schleifen-korrekt anordne, erzeugt das Fehler. Ordne ich sie als erste und letze Tags innerhalb <#list> an, werden mir Einzeldateien mit Teilen aus der Struktur erzeugt, mit denen ich nichts anfangen kann. Am Einfachsten wäre es vermutlich, aus dem vorliegenden Zwischenergebnis nun irgendwie (wie geschildert) Einzeldateien zu machen. Habt ihr eine Idee?


Gruß Micha

Hallo Micha,


der ...MultiOutput-Step wäre sicherlich der bessere Weg. Kannst du mal grob die Freemarker Struktur deines TextHtmlWriter schicken, die du verwendest um zum Ergebnis von oben zu kommen ?


Im Prinzip musst du nach der <...OrderID..>mit <#assign content> starten und vor </...OrderID> den assign Block schließen (</#assign>)



Die Grundstruktur sieht eigentlich immer wie folgt aus:


<#list ... .getRows() as row> <#-- Spreadsheet mit den Orders -->

<#assign content><?xml version="1.0" encoding="UTF-8"?>  

 ...

</#assign>${output(content, (row.get("orderId")+".xml"), "UTF-8")}

</#list>



VG Torsten

Gerne! Ich weiß nicht, ob das nicht zu abstrakt ist, aber hier ist die Struktur:


<#list spreadsheet@SpreadsheetMapper_17.getRows() as row>

<#if row.get("OrderHeadOrderTypeID")! == '1'>

<#assign zeile = 0>

<#if row?is_first>

<${row.get('OrderHeadOrderID')}>

<#else>

</${orderalt!}>

<${row.get('OrderHeadOrderID')}>

</#if>

<#assign order = row.get('OrderHeadOrderID')>

BES;${row.get('OrderCreatedAt')};${row.get('Uhrzeit')};2350001110832;111083;${row.get('AnzahlPositionen')};Selent 94315;04000;

K;111083;;${row.get('OrderCreatedAt')};${row.get('OrderHeadOrderID')};;;;;;;;${row.get('AnzahlPositionen')};;${row.get('OrderDeliveryAddressFirstName')} ${row.get('OrderDeliveryAddressSurname')};;${row.get('OrderDeliveryAddressStreet')} ${row.get('OrderDeliveryAddressHouseNumber')};${row.get('OrderDeliveryAddressZIP')} ${row.get('OrderDeliveryAddressCity')};${row.get('OrderDeliveryAddressCountryID')};${row.get('OrderHeadOrderID')};;

<#else>

<#if row.get('OrderHeadOrderID') == order>

<#assign zeile = zeile + 1>

P;${zeile!};${row.get("OrderItemsVariantNumber")!};${row.get("OrderItemsQuantity")!};;;;

<#assign orderalt = order>

<#if row?is_last>

</${orderalt!}>

</#if>

</#if>

</#if>

</#list>

Hi Micha,


am besten du speicherst dir die Bestellkopf und Positionsdaten in einer Freemarker Variable ab und gibst sie dann sie dann gemeinsam aus wenn sich die OrderID ändert oder die letzte Zeile erreicht ist.


Als Beispiel eine TextHtmlWriterMultiOutput template dass ich mit dem PlentySearchOrders Output getestet habe. Ich hoffe das hilft dir weiter.


<#list spreadsheet@SpreadsheetMapper_17.getRows() as row>
  <#if row.get("OrderHeadOrderTypeID")! == '1'>
      <#assign order = row.get('OrderHeadOrderID')>
     <#if orderalt! != "" && order! != "" && orderalt! != order!>
        ${output(("<"+orderalt!?string+">"+bestellkopf+positionen+"</"+orderalt!?string+">"), orderalt+".txt", "UTF-8")}
    </#if>
      <#assign zeile = 0 />
      <#assign bestellkopf = "" />
      <#assign positionen = "" />
<#assign bestellkopf>

BES;${row.get('OrderCreatedAt')};${row.get('Uhrzeit')};2350001110832;111083;${row.get('AnzahlPositionen')};Selent 94315;04000;
K;111083;;${row.get('OrderCreatedAt')};${row.get('OrderHeadOrderID')};;;;;;;;${row.get('AnzahlPositionen')};;${row.get('OrderDeliveryAddressFirstName')} ${row.get('OrderDeliveryAddressSurname')};;${row.get('OrderDeliveryAddressStreet')} ${row.get('OrderDeliveryAddressHouseNumber')};${row.get('OrderDeliveryAddressZIP')} ${row.get('OrderDeliveryAddressCity')};${row.get('OrderDeliveryAddressCountryID')};${row.get('OrderHeadOrderID')};;
</#assign>
  <#else>
    <#if row.get('OrderHeadOrderID') == order>
      <#assign zeile = zeile + 1>
<#assign position>
P;${zeile!};${row.get("OrderItemsVariantNumber")!};${row.get("OrderItemsQuantity")!};;;;
</#assign>
      <#assign positionen += position />
      <#assign orderalt = order>
    </#if>
  </#if>
  <#if row?is_last>
    ${output(("<"+orderalt!?string+">"+bestellkopf+positionen+"</"+orderalt!?string+">"), orderalt+".txt", "UTF-8")}
  </#if>
</#list>


VG Torsten

Das ist allererste Sahne, vielen Dank! Klappt hervorragend.


Gruß Micha