0

Verschiedene Tabellen per .csv importiert und wie jetzt verknüpfen?

Hallo wer kann mir bitte helfen. Ich möchte mir eine Lego Datenbank erstellen. Der Import der .csv Daten hat problemlos geklappt, jetzt möchte ich sie verknüpfen. Ich habe sie importiert aus https://rebrickable.com/downloads/ dazu wurde auch eine Grafik mit beigelegt. Mein Problem wie verknüpfe ich die ganzen Tabellen miteinander. Ich bin ein Anfänger.

7 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Angela, da hast du dir ja was vorgenommen ...

     

    Ich war neugierig und habe mir die Sache mal näher angesehen. Das Datenmodell ist ja schon recht komplex, und die Anzahl der Datensätze liegt bei fast allen Tabellen im 5- bis 6-stelligen Bereich, in der Summe wohl etwa 1 Mio. Das ist natürlich kein Pappenstiel und fordert Ninox ganz schön.

     

    Deshalb habe ich mich darauf beschränkt, die Tabellen-Verknüpfungen als solche zu erstellen und beispielhaft bei "inventories" und "sets" auch die Daten zu verknüpfen. Da das Internet gerade etwas zäh war, habe ich das lokal mit der Mac-App gemacht (Dauer: mehrere Minuten). Der Code befindet sich in einem Button in der Tabelle "inventories":

     

    for i in select inventories do
        let myNum := i.set_num;
        let mySet := first(select sets where set_num = myNum);
        i.(sets := mySet)
    end

     

    Nach demselben Schema könntest du nun nacheinander auch die anderen Daten miteinander verknüpfen. Also bei jeder N:1-Verknüpfung einen solchen Button platzieren und den Code auf die jeweiligen Tabellen- und Feldnamen anpassen. Oder über die Konsole. So oder so: Im Web ließe sich die Ausführung wahrscheinlich mit "do as server ... end" beschleunigen.

    Die Datenbank umfasst rund 21 MB und könnte als Startpunkt hier heruntergeladen werden:

    https://www.dropbox.com/s/wzlv24nne7dp200/LEGO_Start.ninox?dl=0

    • Angela
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexer ich danke dir für deine fleißige Arbeit, es hat super geklappt.

    Es gibt da jetzt nur ein Problem mit dem Programm. Ich habe es auf meinen iPad. Jetzt habe ich bei gewissen Verknüpfungen mit so vielen Datensätzen das Problem, dass es nicht alle verknüpft. Meine Frage, kann man es auf bestimmte Datensätze begrenzen so 500  bis 1000 Stück und das Ganze schrittweise abwickeln?

    Angela

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Angela, zur Begrenzung der in einem Rutsch zu verarbeitenden Datensätze könnte man die ID heranziehen. Jeder Datensatz bekommt in Ninox ja automatisch eine fortlaufende, nicht änderbare Nummer zugewiesen, welche Teil der ID ist und mit number(Nr) als numerischer Wert abgefragt werden kann. In einfacher Form sähe das dann so aus (auf das oben stehende Beispiel bezogen):

     

    for i in select inventories where number(Nr) > 0 and number(Nr) <= 1000 do
        let myNum := i.set_num;
        let mySet := first(select sets where set_num = myNum);
        i.(sets := mySet)
    end

     

    So würden jeweils nur 1000 Datensätze verarbeitet. Man müsste halt nach jedem Durchlauf die Von-/Bis-Zahlen ändern. Also statt 0 und 1000 beim nächsten Mal halt 1000 und 2000. Wobei auch diese Zahlen nur Beispiele sind. Da müsstest du halt herumprobieren, wie's am besten funktioniert.

     

    Am effektivsten wäre es vermutlich, das mit der Konsole zu machen (Administrator-Modus -> "Home" -> "Console"). Wenn man im Formular mit einem Button arbeitet, könnte man auch zwei Zahlenfelder "von" und "bis" erstellen und diese im Code adressieren.

     

    Aber egal wie - es wird auf jeden Fall ein Geduldsspiel. ;)

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Angela, hallo Copytexter,

     

    ich stand auch mal vor einem ähnlichen Problem und habe das analog so gelöst:

     

    let myArray := (select inventories [sets]);
    for i in slice(myArray, 0, 1000) do
        let myNum := i.set_num;
        let mySet := first(select sets where set_num = myNum);
        i.(sets := mySet)
    end

     

    lg, Torsten

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    ... eigentlich wollte ich ja noch was erläutern, da waren aber die dicken Finger dagegen ;-)

     

    als erstes bilde ich ein Array aus allen Datensätzen in 'inventories', die noch keine Verknüpfung unter 'sets' eingetragen haben. In der for-Schleife laufe ich dann quasi von item(0) bis item(999) durch's Array und führe aus, was ihr bisher in der Schleife hattet, unter anderem die Belegung von 'sets', so dass diese Datensätze beim nächsten Skript-Start nicht mehr im Array landen sollten...

     

    lg, Torsten

    • Ninox-Professional
    • planoxpro
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo "Wurstfinger" (Rache ist süß), ja, das erscheint mir deutlich eleganter als meine Lösung. Ich frage mich nur, ob ein iPad das vom Speicher her packt. Aber das kann man ja ausprobieren.

    Nebenbei - wo ich gerade so draufschaue: Müsste es beim select nicht "[not sets]" heißen?

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo,

     

    Du hast natürlich vollkommen Recht, also richtig:

     

    let myArray := (select inventories [not sets]);
    for i in slice(myArray, 0, 1000) do
        let myNum := i.set_num;
        let mySet := first(select sets where set_num = myNum);
        i.(sets := mySet)
    end

     

    lg, Torsten