0

Maßendaten Anpassung true/fals

Ich komme mit einem Projekt einfach nicht weiter und brauche eure Hilfe.

Wir haben eine Tabelle mit dem Namen "Table1"

mit einen String Feld (Text) und einen Check- Feld bzw. true/ false Feld welcher "Match" heißt.

 Und wir haben eine zweite Tabelle mit dem Namen "Table2" mit dem Textfeld "Text")

 

Nun ist die Idee für das Feld "Match" einen berechneten Wert zuzuweisen und zwar

Wenn Text mit einen Textfeld aus Table2 einen Match hat (genau gleich ist) dann soll Match true werden ansonsten false.

 

 Ich dachte an so etwas:

if Table1.Text == (IRGENDWO IM INDEX) Table2.Text2 then true else false

Ich brauche quasi eine Funktion welche Text (ich weiß Table1. ist nicht erforderlich) überall durchsucht in der Tabelle2 und falls es im Feld "Text2" auftaucht dann wird Rückgabewert true ansosnten false 

13 Antworten

null
    • Max_Thom
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Anbei das Projekt

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

       In Table2 einen Button mit folgendem Code erstellen:

      for i in select Table2 do
          first(select Table1 where Text = i.Text2).(Match := true)
      end
      

      Wenn der CSV-Import mehrfach durchgeführt wird, würde ich überlegen, den Vorgang zu automatisieren und obigen Code in das Import-Script zu integrieren. Zum Thema CSV-Import hat Uwe mal was geschrieben:

      https://forum.ninox.de/t/m1hn9qb/import-der-daten-einer-csv-datei-die-in-einem-bildfeld-abgelegt-ist

      Ich mache es genauso.

      • Max_Thom
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Ich kann nicht begreifen wieso du immer auf den Button zurück kommst 😅 
      Nein. Es soll nur einmalig über die Massendaten- Änderung einmal durchlaufen.
      Keine Schleife
      Kein Button

      Ein ganz einfacher Vorgang

    • Frank_Schafer
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Moin,

    folgendes sollte eigentlich für die Massenbearbeitung in der Tabelle1 als berechneter Wert für das Feld Match funktionieren:

    let my := this;
    count(select Table2 where Text = my.Text) > 0
    

    VG Frank

      • truthein
      • vor 1 Jahr
      • Gemeldet - anzeigen

       so ist es.

      Allerdings scheint es mir so, dass Max Thom dies bereits in einem anderen Thread gepostet hat (?) (Dort habe ich ihm das gleiche wie du auch schon vorgeschlagen).

      Falls es wirklich das gleiche Problem aus dem anderen Thread ist, dann ist auf die nicht unwesentliche Tatsache hinzuweisen(!), daß es sich bei der einen Tabelle um ca. 0.75 Millionen Datensätze handelt und die andere ähnlich umfangreich ist. Deswegen konnten doppelschleifen-artige Formeln weil zu ressourcenhungrig nicht durchgeführt werden. (siehe dort)

      • Max_Thom
      • vor 1 Jahr
      • Gemeldet - anzeigen

      PERFEKT! DANKE

      • Max_Thom
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Gleiches Problem nur anderer Vorgang.
      Richtig, statt das ich einen berechneten Wert darstelle, was offensichtlich zu viel ist, habe ich mir gedacht das ich es über die Massendatenänderung einmalig durchlaufen lasse. Das könnte es eventuell deutlich schlanker machen. Der Vorgang wird nicht mehrmals vorgenommen, daher ist das denke ich der eleganteste und schnellste Weg.
      Aber ich komme mit den angegebenen Code nicht weiter..

      let my := this;
      count(select Table2 where Text = my.Text) > 0

       ist die Funktion "count" hier überhaupt das richtige? ich möchte doch überhaupt nicht wissen OB es "duplicate" gibt, ich möchte nur wissen welcher Wert ein Duplikat ist. Daher ist das denke ich eher nicht das richtige. 

      • truthein
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Es sind zwei «schleifenartige» Vorgänge, 1. select, 2. count. 

       said:
      t die Funktion "count" hier überhaupt das richtige?

       Genau dann wenn count > 0 ist die selektierte Menge nicht leer.

      • Frank_Schafer
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Wenn es mindestens einmal ein Match gibt, dann liefert count einen Wert > 0 zurück - so kannst du prüfen, ob es diesen Datensatz in Table2 gibt.

      Was ich jetzt noch in deinen Screenshots gesehen habe ist, dass dein Feld in Table2 gar nicht Text sondern Text2 heißt - also müsste der Code wie folgt sein:
       

      let my := this;
      count(select Table2 where Text2 = my.Text) > 0
      

      Ich hoffe, Du hast das gemerkt.

      VG Frank

    • truthein
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ich werfe mal was Neues in die Diskussion: die Unmenge an Datensätzen werden doch vermutlich importiert sein, ich stelle mir mal zwei .csv Textdateien vor. In dem Fall kann man doch vielleicht direkt auf den Dateien arbeiten mit Tools, die diese zeilenweise abarbeiten und das «prozessornah» erledigen (ich weiss nicht auf welchen System du arbeitest, auf Mac und Unixoiden gibts da einige extrem effiziente, mir käme awk in den Sinn, bin da aber beileibe kein Experte)

    Idee also: direkt mit den csv arbeiten, irgendwie ein drittes csv basteln, dass die Daten [String],[Boolean] enthält (String,1 falls in Tabelle enthalten) und das dann importieren.
     

    Also nur so eine Idee.

      • Max_Thom
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Nein - das kann/ wird nicht funktionierne.
      Hätte ich einfach nur zwei Lose CSV Dateien dürfte es für mich ein Kinderspiel sein 😀 da gibt es hunderte Möglichkeiten.

      Jedoch sind die Datensätze in teilen modifiziert. Es ist schwierig diese als CSV wieder zu exportieren um dann eine abfrage durchlaufen zu lassen um diese wieder zu importieren.
       

      Mal ganz davon abgesehen das es für genau diesen Zweck eine super elegante Massendaten- Änderung gibt verstehe ich nicht wieso ich den Aufwand betreiben müsste. Genau für solche Fällte ist es denke ich perfekt. 

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
     said:
    Ich kann nicht begreifen wieso du immer auf den Button zurück kommst

    Weil ich sowas auch immer mit einem Button mache. Weil es mit einem Button schneller und flexibler geht als über die Massendatenänderung. Weil er in deiner Demo-Datenbank das gewünschte Ergebnis gebracht hätte. Weil ich ein geduldiger Mensch bin und deshalb immer wieder versuche, zu helfen. Mein Fehler. Ich gelobe Besserung.