0

Sequentiell Datensätze mit Informationen aus vorausgehenden Datensätzen füllen

Hallo zusammen,

noch eine Frage: 

Ich habe eine Textdatei in der Bonköpfe und Bonpositionen sequentiell enthalten sind.

K;POS1-1004474418;10;05;102;17.05.2020;1;Bar, Bar;
P;01-01-1001;01-01-1001;01-01-1001;1;2,00;9,80;0,00;9,80;9,16;19,60;2;17.05.2020 09:00:54;18,32;S30;
K;255;69803;POS1-1004474419;10;05;102;17.05.2020;1;Bar, Bar;
P;01-01-1001;01-01-1001;01-01-1001;1;1,00;9,80;0,00;9,80;9,16;9,80;2;17.05.2020 10:08:06;9,16;S30;
P;01-01-1001;01-01-1001;01-01-1001;2;1,00;9,80;0,00;9,80;9,16;9,80;2;17.05.2020 10:08:07;9,16;S30;

Beginnt die Zeile mit K handelt es sich um einen Bonkopf, die nachfolgenden Zeilen, die mit P beginnen gehören als Positionen zu dem vorherigen Kopf K. Es sind unterschiedlich viele Positionen jeweils vorhanden. Leider fehlt die Referenz auf den Kopf in den Positionen. Diese möchte ich nun nachtragen.

In der Tabellenzeile K habe ich die Bonnummer 'POS...' bereits separiert in einem Feld.

Wie bekomme ich aber in die nachfolgenden P Datensätze die Bonnummer aus dem vorherigen K Datensatz? Bisherige Versuche mit for next Schleifen sind an der begrenzten Gültigkeit der Variablen gescheitert.

Kann mir jemand helfen? 

Liebe Grüße

Thomas

5 Antworten

null
    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Thomas,

    angenommen die Datensätze sind schon automatisch angelegt und die IDs der Datensätze laufen der reihe nach. Ich nehme auch an, dass in jedem Datensatz ein Feld "KODE" vorhanden ist, wo ein Teil des Kodes steht (z.B. "P;01-01-1001;01-01-1001;01-01-1001;1;2,00;9,80;0,00;9,80;9,16;19,60;2;17.05.2020 09:00:54;18,32;S30;"). Und ein Funktopnsfeld "Bonnummer" mit der vorherigen Formel. Für diesen Funktionsfeld würde ich dann folgende Formel vorschlagen:

    ---

    let me := this;
    let myTab := (select DEINETABELLE);
    switch first(split(KODE, ";")) do
    case "K":
    (
    let myStart := index(KODE, "POS");
    let myEnd := index(substr(KODE, myStart), ";");
    substr(KODE, myStart, myEnd)
    )
    case "P":
    last(myTab[number(Nr) < me.number(Nr) and first(split(KODE, ";")) = "K"]).(
    let myStart := index(KODE, "POS");
    let myEnd := index(substr(KODE, myStart), ";");
    substr(KODE, myStart, myEnd)
    )
    end

    ---

    Leo

    • TB_CoCoCon
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    erstmal nochmals herzlichen Dank für die schnelle Hilfe! Ich habe deinen Code in ein Funktionsfeld eingetragen und es hat größtenteils korrekt funktioniert. Es sind jedoch einzelne Zeilen / Positionen, bei denen die Bonnummern falsch zugeordnet werden.

    Image [4]

    Die Daten sind lt. Nr. in der richtigen Reihenfolge eingelesen worden und werden auch in der richtigen Reihenfolge angezeigt.

    Darf ich dir vielleicht die Datenbank vielleicht zukommen lassen, ist vielleicht einfacher, als aus der Ferne das zu betrachten?

    Gruß

    Thomas

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Thomas,

    probier mal damit:

    ---

    let me := this;
    let myTab := for i in (select DEINETABELLE) order by number(Nr) do
    i
    end;
    switch first(split(KODE, ";")) do
    case "K":
    (
    let myStart := index(KODE, "POS");
    let myEnd := index(substr(KODE, myStart), ";");
    substr(KODE, myStart, myEnd)
    )
    case "P":
    last(myTab[number(Nr) < me.number(Nr) and first(split(KODE, ";")) = "K"]).(
    let myStart := index(KODE, "POS");
    let myEnd := index(substr(KODE, myStart), ";");
    substr(KODE, myStart, myEnd)
    )
    end

    ---

    Leo

    • TB_CoCoCon
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Leo,

    das sieht genial aus, ich prüfe das mit mehr Datensätzen. Bis dahin vielen Dank, jetzt mnuss ich noch verstehen, wo der Unterschied zwischen den beiden Lösungen genau ist.

    Grüße

    Thomas

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Der Unterschied liegt in der zweiten Zeile. Früher habe ich mit let myTab := (select DEINETABELLE) einfach die Tabelle genommen. Normalerweise wird diese nach internen IDs sortiert. Diese werden aber intern als Texte behandelt deswegen kommt es bei verwendung von last zur falschen Sortierung (10>2 aber "10"<"2").

    Jetzt habe ich mit der Schleife die Tabelle zwangsläufig nach nummern sortiert: 

    ---

    let myTab := for i in (select DEINETABELLE) order by number(Nr) do
    i
    end;

    ---

    Leo

Content aside

  • vor 3 JahrenZuletzt aktiv
  • 5Antworten
  • 773Ansichten