Zusammengehörende Daten kennzeichnen

Hallo zusammen,


ich habe einen Datensatz bei dem in der ersten Zeile immer INV und die darunterliegenden HAC zusammengehören. diese würde ich gerne separieren so dass jeder Blockbestehend aus INV und HAC einen eigenen Identifier im datastore bekommt.


Wie kann ich im Mapper bestimmen, dass immer INV und HAC bis zum nächsten Start von INV zusammengehören.


ich dachte da an einen Counter, aber wie orde ich nun die HAC´s dem Counter zu.


image



Danke für eure Tips.

Viele Grüße

Enrico



Hallo Enrico,


Ich persönlich würde in diesem Falle 2 Counter verwenden.

Einen um INV-Zeilen und einen um HAC-Zeilen zu zählen.

Die Logik für den INV-Counter sollte so aussehen:

Falls erste Zeile
   dann: setze den INV-Counter auf 0
   sonst: Falls Zeile gleich INV 
      dann: INV-Counter +1

Die Logik für den HAC-Counter sollte so aussehen:

Falls erste Zeile oder INV-Zeile
    Dann: HAC-Counter auf 0
    Sonst: HAC-Counter um 1 hoch

Du kannst beim counter.inc() auch negative Werte eintragen z.B.: counter.inc(0-counter.get()) um den Counter auf 0 zu setzen.


ABER: Mir persönlich gefällt diese Lösung überhaupt nicht. Counter sind in meinen Augen relativ Fehler anfällig. Man muss sich also was anderes überlegen.

Wieso ist es wichtig dass die Daten in einem Datastore landen? Willst du darüber nur die Relation erstellen um Informationen aus Kopfzeilen in Positionszeilen zu schreiben? Wenn du dein Problem ein wenig näher beschreibst, könnte man auch eine bessere Lösung finden als über Counter frickelei.


Viele Grüße

Stefan

Hi Stefan,


Danke erstmal für die Antwort.

Generell geht es um folgendes:


Ich bekomme eine CSV die recht doof zusammengestellt ist. Diese unterteile ich in die verschiedenen Abschnitte und muss später alles in einem Excel in eine Zeile schreiben (Pro Rechnung, also INV und dazugehörigen HAC in je eine Zeile). dafür wollte ich mir die daten in verschiedene Ordner im datastore schreiben, damit ich diese entsprechend hinein mappen kann.


Eine Beispieldatei ist anbei wie sie kommt (csv.) und wie sie aussehen soll (excel).


Viele Grüße

Enrico

Hallo Enrico,


ich hatte mal einen ähnlichen Fall, aber mit IH und ID statt mit HAC und INV.

Ich habe deswegen einen HTMLMultiOutput verwendet um das gewünschte Ergebnis zu erzielen:

<#list 0..24 as i>col${i}<#sep>;</#list>
<#list spreadsheet@SpreadsheetCSVReader_1.getRows() as row>
<#if row.get("col0")?trim =="IH">
<#assign IH = row>
<#assign count = 0>
${IH.getCols().join(";")}
<#else>
<#assign count += 1>
${IH.getCols().join(";")};${count};${row.getCols().join(";")}
</#if>
</#list>

Du müsstest das ganze natürlich an deine Bedürfnisse anpassen. (IH mit INV ersetzen, usw.)

Bei Fragen melde dich einfach bei mir.

Input:

image

Output:

image

Grüße

Stefan


PS: An Synesty, ich bekomme bei jedem Forum-Post einen Fehler dass der Post fehlgeschlagen ist. Wenn ich aber die Seite Refreshe ist der Post da.

Hi Stefan,


leider komme ich nicht ganz dahinter.


Könntest du die Zeilen einmal kurz beschreiben, damit ich weiß was da wo passiert?

Hast du in Zeile 9 eine Variable benutzt, denn er bringt mir hier immer einen Fehler, dass die Variable nicht existiert.


VG

Enrico


Der Ansatz mit Counter von Stefan ist nicht verkehrt. Es reicht ein Counter.



Müsstest dir sicher noch alles vorher rausfiltern, was du nicht brauchst.


Wenn du das jetzt in einen Datastore gibts dann kannst du es einen Datastore mit Parent-Variant-Relation importieren.


Bei der Weiterverarbeitung aus dem Datastore kannst du dann auf diese Relationen zugreifen. D.h. du könntest dir aus dem Datastore z.B. nur die Variant-Zeile holen und greifst im Mapper über ${parent['Spaltenname']} darauf zu.

@Stefan: Da wir das Forum nicht hosten, können wir nichts weiter zum Fehler sagen. Probier mal Cookies löschen. Das gabs wohl schonmal und da hat das geholfen.

Hallo Enrico,


hier einmal Zeile für Zeile was passiert:

1: Ich schreibe mir nur erstmal eine HeaderZeile, ich weiß dass das Ergebnis Spreadsheet 24 Spalten haben wird also lasse ich die Liste bis 24 laufen

2: Ich hole mir den Input Spreadsheet und definiere mir daraus eine Liste aus Zeilen (row), in den Folge Zeilen iteriere ich über die Liste

3: Ich frage ab ob es sich um eine IH (Auftragskopf) Zeile handelt,

4: Wenn ja dann speicher mir die Zeile in der Variable IH ab

5: Und speicher eine weitere Variable zum hochzählen

6: Und gib mir die Kopfzeile (IH.cols.join(";")) aus. Das Join fügt alle Werte getrennt durch ein ; zusammen

7: Sonst: Wir verarbeiten jetzt Positionszeilen, in deinem Falle "HAC"

8: Rechne +1 auf den Count,

9: Gebe mir IH;PositionsCounter;PositionsZeile aus

10: If-Abfrage zuende

11: Liste zuende


Wenn das immer noch nicht hilft, poste mal was du in den HTMLWriter reinschreibst :)

Viele Grüße

Stefan

Hi Stefan,


danke, hat funktioniert.

Ich hatte den falschen Input gewählt :)


Danke auch an Synesty, ich denke jetzt komme ich weiter.


VG