0

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

null
    • Stefan_Gahrmann
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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!

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Zu "create": Nein, damit erzeugt man lediglich einen neuen Datensatz, den man danach Feld für Feld befüllen muss. Daran führt kein Weg vorbei.

      Es gibt noch "duplicate", damit lässt sich ein Datensatz komplett mit allen Feldinhalten duplizieren, aber nur innerhalb derselben Tabelle, nicht in eine andere.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Funktionsreferenz: Zum einen hier

      https://docs.ninox.com/de/skripten/funktionen-ueberblick

      Zum anderen als Datenbank namens '0001_Ninox-Reference' im so genannten "Webinar Team". Zugriff darauf bekommt man (Cloud-Account vorausgesetzt), in dem man dem Support eine kurze Mai mit der Bitte um Einladung ins Webinar-Team schreibt. Das geht in der Regel sehr schnell.

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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.

    • Stefan_Gahrmann
    • vor 1 Jahr
    • Gemeldet - anzeigen

    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 😉

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
     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-Befehls 

    Einerseits: 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.

      • Stefan_Gahrmann
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Genau wegen solcher Möglichkeiten und weil Ninox per se von der Konstruktion her so einfach flexibel scheint, bin ich hier gelandet.

      Das mit dem Bildfeld klingt spannend und wird auf jeden Fall so realisiert.

      Das mit dem Bankimport ist ebenso spannend, bedeutet aber (wie bei vielen Schnittstellen) aktuell unübersichtliche Konstrukte, weil alles separat angemeldet und bezahlt werden muss, wenn ich nun an meine Stichworte Datanorm und Datev denke aber auch an Dienste, die Eingangsrechnungen digitalisieren oder weitere Schnittstellen zu Großhändlern/Kunden, Kalenderdiensten... oder gar GAEB ...  Hab schon mit Zapier gespielt ;-)

      Insofern versuche ich gut abzubilden, die Menge Tools übersichtlich zu halten, mal gucken, wie gut das geht. 

      Das hier ist gelöst, inzwischen eingebaut, und nun auch sehr fix. Danke!