0

Array Position abfragen

Ich habe ein Array, welches aus Spalten und Zeilen besteht. Um die Daten in einer temporären Tabelle zu verarbeiten, müsste ich aus dem ersten Datensatz in der der ersten Spalte einen Wert auslesen. Die einzelnen Spalten sind durch ";" getrennt. Mit dem Befehl item kann ich ja gezielt auf einzelne Datensätze im Array zugreifen. Mir ist nur nicht klar, wie ich lediglich den ersten Datensatz mit der ersten Spalte ansprechen kann. Frank

13 Antworten

null
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Kannst du ein Beispiel von dem 'Array' posten?

    Ich kann es mir anhand deiner Beschreibung nicht vorstellen.
    Wenn ich rate, dann so:

    formatJSON(Array.item('erste Spalte', 0))

    • Pro BoutiquenFonds GmbH
    • Eichelfr
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe,

    in der ersten Zeile des Arrays (welches sich in einem mehrzeiligen Textfeld befindet) möchte ich die erste Spalte "30.06.2006" als Datum in ein Feld in der Tabelle Zahlen extrahieren. Das Array würde ich dann die Spalte "30.06."06" Zeile für Zeile durchlaufen und alle Werte in die Tabelle Zahlen übernehmen und jeweils zugehörig den Wert 30.06.06 im Feld Datum. 

    Frank

    Hier das Array:

     

    30.06.2006;30.06.2007;30.06.2008;30.06.2009;30.06.2010;30.06.2011;30.06.2012;30.06.2013;30.06.2014;30.06.2015;30.06.2016;30.06.2017;30.06.2018;30.06.2019;30.06.2020
    1. Sonstige betriebliche Ertr‰ge;77.570,93;56.320,31;34.569,01;143.299,84;90.704,61;57.282,74;142.815,51;81.643,54;95.955,64;106.020,89;100.884,19;98.428,23;75.184,41;70.198,62;53.607,09
    2. Personalaufwand;-184.123,81;-257.976,05;-350.709,52;-411.747,57;-380.168,24;-418.429,69;-510.223,81;-531.383,12;-489.838,50;-544.669,95;-520.043,18;-503.209,94;-526.886,73;-502.981,04;-472.699,99

     

    do as server
    let myArray := split('Text 2', "
    ");
    for i in myArray do
    let mySpalte := split(i, ";");
    let myNew := (create Zahlen);
    myNew.(
    Bilanzposition := item(mySpalte, 0);
    myNew.('Company' := 244);
    myNew.(Betrag := item(mySpalte, number(1)))
    )
    end;

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Frank
    1. Verstehst du, was das Script von Leo macht?

    2. Der Inhalt des Textfeldes ist nicht korrekt.
    Wenn der 30.06.2006 deine erste Spalte ist, dann ist hat die nächste Zeile dieser Spalte den Wert '1.Sonstige betriebliche Erträge' und nicht 77.570,93
    Die zweite Zeile dann den Wert '2. Persomalaufwand''
    Es fehlt die Bezeichnung der ersten Zeile inkl. ';'

    3. Im mehrzeiligen Textfeld werden Textwerte angezeigt. 30.06.2006 ist ein Text kein Datum.
    Wenn das in ein Datumsfeld gespeichert werden soll, dann muss man es vorab in ein Datum umwandeln.
    Das Gleiche mit Zahlen, wenn sie in ein Zahlenfeld gespeichert werden sollen.

    4. Mir ist immer noch nicht klar, was in die Importtabelle reingeschrieben werden soll und wie es dann aussehen soll.
    Füll mal die Importtabelle manuell mit Werten, wie sie dann aussehen soll und poste bitte den Screenshot, damit man sieht was du eigentlich als Ergebnis haben möchtest.

    • Pro BoutiquenFonds GmbH
    • Eichelfr
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe,

    vielen Dank für deine Geduld mit mir.

    Vielleicht gehe ich noch einmal einen Schritt zurück, um die Ausgangssituation und die Zielsetzung zu beschreiben:

    1. Ich verfüge über eine csv-Datei mit Daten, die ich gerne über einen Button in eine Ninox-Tabelle importieren möchte

    2. Da die Datenstruktur in der csv-Datei nicht so formatiert ist, wie ich mir das wünsche und für die spätere Weiterverarbeitung benötige, müssen die Daten verändert werden

    3. Das Zielbild für die bearbeitete Datenstruktur sieht wie folgt aus:

     

    Zielstruktur

    In der ersten Spalte der Zieltabelle findet sich die Kundennummer (aus einem anderen Datenbankfeld). In der zweiten Spalte befindet sich das Datum in der Dritten Spalte (Art) ein Eintrag aus einer anderen Tabelle, in der 4 Spalte (Position) die Bezeichnung und in der 5 Spalte ein Betrag.

    4. Als Vorbereitung für den Import habe ich die Angaben aus der csv-Datei (Muster vorstehend) in ein mehrzeiliges Textfeld kopiert, aus dem dann die Tabelle in der vorgegebenen Struktur erzeugt werden soll. 

    Die Verarbeitung habe ich mir dann so vorgestellt, dass das o.g. Script mehrfach die einzelnen Spalten durchläuft. Mir ist klar, dass in o.g. Script dass lediglich für die erste Spalte funktioniert und ich dies dann in der finalen Version mehrfach kopieren müsste, um alle Spalten abzuarbeiten.

    Schön wäre natürlich, wenn es eine andere Möglichkeit gäbe, den Import direkt über den csv-File zu gestalten (ohne einen händischen Import via Importfunktion). Da auch das kopieren in das Mehrzeilige Textfeld ein manueller Prozess ist. Ich habe da aber noch keine Ansätze im Forum entdecken können, die mir weiterhelfen.

    Vielleicht ist das nun etwas klarer geworden.

     

    Frank

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Frank

    Eine andere, als die 1:1 gespiegelte Darstellung der csv in Ninox wird im ersten Schritt nicht funktioniern.
    Du kannst es auch beim manuellen Import nicht anders darstellen.

    Hast du dier mal die im Scripot erzeugten Arrays angeschaut? Textfeld := formatJSON(myArray) und Textfeld2:=formatJSON(mySpalte)

    Dann siehst du, das es in der von dir gewünschten Form mit dem Script von Leo nicht funktionieren wird. 
    Jedes erstellte Array in der Schleife ist ein Record und der Inhalt des Arrays sind die einzelnen Felder des Records.

    Entweder du änderst den Aufbau der Tabelle aus der die csv erstellt wird oder du nutzt die Import-Tabelle um daraus per Script eine neue Tabelle in der von dir gewünschten Darstellung zu erstellen. Einen anderen Weg sehe ich nicht.

    • Pro BoutiquenFonds GmbH
    • Eichelfr
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe, vielen Dank für deine Bemühungen. Auf die Formatierung der Ursprungstabelle habe ich leider keinen Einfluss, da die aus einem Drittsystem kommen. Ich mache mir nochmal ein paar Gedanken, ob ich eventuell über Integromat die csv-Datei so umwandeln kann, damit ich zu meinem gewünschten Ergebnis komme. Da gibt es zumindest ein kostenpflichtiges Tool EasyCsv, mit dem ich evtl. weiterkomme. Trotzdem vielen Dank! Das Forum ist eine echte Hilfe und ein wesentlicher Erfolgsfaktor von ninox...

    Frank

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Frank

    Denkmodell:
    Man importiert die csv in der vorgegebenen Form in eine Zwischentabelle.
    Anschließend baut man sich per Script über eine Schleife aus jeder Spalte  ein Array, welches man dann in die endgültige Tabelle schreibt.

    Den select für die Spalte könnte man über eval() dynamisch bauen.

    Damit sollte man eine Tabelle in der von dir gewünschten Form erhalten.

    Müsste man mal testen.

    • Pro BoutiquenFonds GmbH
    • Eichelfr
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Das schaue ich mir mal an. Ansatzweise hat das ja bereits funktioniert. Ich melde mich nochmal. Frank

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hatte noch etwas nachträglich die Tabellennamen geändert.
    Du must im Button Script noch folgendes ersetzen:
    let vTable := eval("(select 'Test.csv').Spalte" + text(i), this); mit let vTable := eval("(select 'Import.csv').Spalte" + text(i), this);

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Das Script habe ich nochmal etwas verschlangt:
    Body := null;
    let vArray := [];
    let vArray1 := [];
    for i in range(0, 'Anzahl Spalten') do
    let vTable := eval("(select 'Import.csv').Spalte" + text(i + 1), this);
    vArray1 := vTable;
    vArray := array(vArray, vArray1)
    end;
    Body := formatJSON(vArray);
    for vItem in range(0, 'Anzahl Spalten' * 'Anzahl Spalten', 'Anzahl Spalten') do
    let vNew := (create 'Tabelle Umgeordnet');
    vNew.(Spalte1 := item(vArray, vItem));
    vNew.(Spalte2 := item(vArray, vItem + 1));
    vNew.(Spalte3 := item(vArray, vItem + 2))
    end

    • Pro BoutiquenFonds GmbH
    • Eichelfr
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Das ist ja ein Service. Du machst mit deiner Hilfe dem Forum alle Ehre! Danke für den Support. Ich schau mir das an und werde das anpassen. Könnte vielleicht auch eine gute Datenbankvorlage für andere Nutzer sein, die sich mit dem Thema csv/JSON Import beschäftigen.

    Frank