Bedingter Import bzw. bedingtes Kopieren von Datensätzen
Moin liebes Schwarmwissen :-)
Ich habe eine Tabelle aus einem csv-Ipmport und möchte nun alle Datensätze in eine vorhandene Tabelle übernehmen, die nicht schon in der Zieltabelle sind, als UID taugt 'Laufende Nummer' und dann den Ursprungs-Datensatz löschen.
Der Kopiervorgang an sich klappt, über die Prüfbedingung bin ich mir noch nicht ganz im klaren, da ich noch ganz neu in den Ninox-Scripten bin. -> If es gibt schon einen Datensatz, dann lösche den Ursprung sonst füge ein und lösche dann den Ursprung. Ich habe den verdacht, dass das erheblich eleganter geht.
Gleichzeitig ist mir aufgefallen, dass schon das reine rüberkopieren aus dem csv-Iport in die Zieltabelle ewig dauert - mehrere Minuten bei 'nur' 1000 Einträgen, da offensichtlich jede Aanfrage über Internet separat ausgeführt wird... Wo liegt mein Denkfehler?
Mein Ansatz:
let SMimport := (select Ninox_StarMoney13);
for SMZeile in SMimport do
/* if es gibt schon SMZeile.'Laufenede Nummer' in Buchung */
/* delete Quelldatensatz */
/* else */
let Buchung := (create Kontobewegung);
Buchung.('Laufende Nummer' := SMZeile.'Laufende Nummer');
Buchung.(eigeneIBAN := SMZeile.IBAN);
Buchung.('Währung' := SMZeile.'Originalbetrag - Währung');
/* ... undsoweiter */
/* delete Quelldatensatz */
/* end if '/
end;
7 Antworten
-
Moin, mal weiteres zu meinen Überlegungen:
- Ich möchte aus einer Tabelle (der csv-Import), wo sich nicht ausschließen lässt, dass doppelt importiert wurde Datensätze in eine andere Tabelle kopieren.
- In der Zieltabelle darf kein Eintrag doppelt angelegt werden, die 'Laufende Nummer' ist als UUID brauchbar.
- Im Test-Script wird jedes Tabellenfeld einzeln kopiert, was Laufzeittechnisch einem GAU gleichkommt. (war mir vorher schon klar)
Meine Probleme:
- beim Import lässt sich nicht ausschließen, dass Werte doppelt importiert werden, sicher kann ich das über die 'Laufende Nummer' regeln, das ist aber untergeordnet, da es so sein wird, dass die 'Laufende Nummer' nicht eineindeutig bleibt (Quellbedingt), dann muss die Prüfung sowieso überarbeitet werden.
- So wie ich es angehe funktioniert es, aber langsam.
Meine Frage(n):
- Kann ich mit dem create-Befehl (oder einem anderen) einen ganzen Datensatz neu einfügen z.b. mit einem Array als Übergabewert?
- Kann ich ggf ein so ein ganzes 2-D-Array übergeben, was dann einfach an die Tabelle angehängt wird? (der csv-Import war ja rattenschnell ;-) )
- Wie prüfe ich performant das Vorhandensein eines Wertes in der Tabelle in einer Spalte? Also quasi: Sage mir, ob in der Tabelle1.Spalte3 der Wert "12345" vorkommt.
- select Tabelle 1 where Spalte3="12345" und dann gucken, ob das leer ist oder nciht, fällt mir natürlich ein.
Gerne möchte ich da was erfahren oder einen Hinweis bekommen, wie ich der Funktionsreferenz beikomme, da meine bisherige Suche leider erfolglos war. Danke schonmal!
-
Hallo Stefan, ich würde es mal so versuchen:
for smi in select Ninox_Starmoney13 do let myLfdNr := smi.'Laufende Nummer'; if cnt(select Kontobewegung where 'Laufende Nr' = myLfdNr) < 1 then let Buchung := (create Kontobewegung); Buchung.( 'Laufende Nummer' := smi.'Laufende Nummer'; eigeneIBAN := smi.IBAN; 'Währung' := smi.'Originalbetrag - Währung'; ... usw. ); delete smi; end end
Wenn du in der Cloud arbeitest, kannst du das Ganze noch in ein "do as server ... end" packen. Dann läuft es deutlich schneller.
Grundsätzlich stellt sich die Frage, ob wirklich immer wieder alle Datensätze abgeglichen werden müssen oder ob es nicht ein Kriterium gibt (z. B. Buchungsdatum), nach dem sich der Datenbestand von vornherein filtern ließe. Oder gleich nur neue importieren.
PS: Deine "weiteren Überlegungen" hatte ich beim Verfassen dieses Posts noch nicht gesehen.
-
Danke
Das probiere ich so aus (do as a server), das sollte genau das sein, was ich gesucht hatte.
Schade, dass es keine Array-Lösung zum Übergeben ganzer Datensätze an eine Tabelle gibt. Das wäre doch eine sinnvolle Erweiterung des create-Befehls
Natürlich werde ich versuchen, die Importe Überschneidungsfrei zu gestalten und wenn man dass täglich macht oder wöchentlich, oder später automatisiert, ist das kein Problem für mich.
Noch bin ich recht eingerostet, da ich laaaange nicht mehr gecodet habe und Ninox neu für mich ist, aber ich möchte bei 'meinem' Projekt gleich daran denken, dass es auch User gibt, bei denen man sich auf nix verlassen kann, das muss die Applikation vertragen oder abfangen
-
said:
Schade, dass es keine Array-Lösung zum Übergeben ganzer Datensätze an eine Tabelle gibt. Das wäre doch eine sinnvolle Erweiterung des create-BefehlsEinerseits: Ja, wenn viele Felder zu übertragen sind, könnte das viel Tipparbeit beim Erstellen des Scriptes sparen. Andererseits: Ich verstehe, dass Ninox sowas nicht ermöglicht. Denn es müssten in beiden Tabellen alle zu übertragenden Felder exakt(!) übereinstimmen. Das müsste im Script-Editor oder bei der Ausführung aufwändig geprüft werden und würde in der Praxis zu unzähligen Fehlern sowie entsprechenden Support-Anfragen führen.
Zum regelmäßigen, komfortablen CSV-Import empfehle ich den Weg über ein Bildfeld. Eine Datei in ein Bildfeld ziehen kann jeder, und im Code hat man die volle Kontrolle über die Daten. UweG hat mal was dazu geschrieben:
https://forum.ninox.de/t/m1hn9qb/import-der-daten-einer-csv-datei-die-in-einem-bildfeld-abgelegt-ist
Davon abgesehen wird es mit https://bankflux.io in Kürze auch eine Möglichkeit geben, Bankkonten direkt mit Ninox zu verbinden, Kontoauszüge abzurufen und auch Transaktionen vorzunehmen.
Content aside
- Status Answered
- vor 1 JahrZuletzt aktiv
- 7Antworten
- 71Ansichten
-
2
Folge bereits