0

Wie vergleicht man einen Wert einer anderen Tabelle?

Ich komm einfach nicht weiter.

Ich habe eine Tabelle mit dem Wert "Name"
Diesen Wert möchte ich mit einer anderen Tabelle vergleichen
Tabelle2 Feldname: "Wert"

Ich habe an so etwas gedacht:

if Name = Tabelle2.Wert then true

 

ich weiß nicht wie man quasi die gesamte Tabelle "Tabelle" absucht um das Feld "Wert" abzugreifen.
Ziel ist es ob der Wert des Feldnamen "Name" irgendwo in "Tabelle2" im Feld "Wert" auftaucht oder nicht
Hat da jemand eine Idee?

16 Antworten

null
    • Michi.1
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Was willst du danach anstellen wenn das ergebnis wahr ist? Sind die Tabellen verknüpft? So wird es schwierig was zu sagen.

    Ganz grob.

    Variable in der Tabelle erstellen von der aus du suchen möchtest mit dem wert für den Vergleich 

    let wert:= Name

    Andere Tabelle durchlaufen lassen mit dem Vergleich

    select Tabelle wehre vergleichsfeld = wert

    Ergebniss = true oder false

    Ergebniss ausgeben lassen

    select Tabelle wehre vergleichsfeld = wert. Datensatz Nr 

    Schau mal nach select im Forum oder der Doku 

      • Max_Thom
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Nichts weiter? Genau das soll damit angestellt werden, ich möchte einen true oder false Wert nicht mehr oder weniger, es soll anschließend nichts anderes damit gemacht werden.

      Leider komme ich mit deiner Anleitung nicht wieder, nach deiner Erklärung/ Suche habe ich es so zusammengebaut: 

      let suchWert1 := Name;
      select Tabelle2 where Wert = suchWert1

      Aber ich komme damit nicht weiter :( 
      Ziel ist es einfach nur zu prüfen ob dieser Wert in der anderen Tabelle vorhanden ist oder nicht.

      Und es soll ja nicht irgendwie irgend ein Datensatz Nr. abgesucht werden.
      Es gibt einen Wert im Feld "Name" und ich möchte einfach nur wissen ob dieser String sich irgendwo in der anderen Tabelle ebenfalls befindet. 
       

      • Michi.1
      • vor 9 Monaten
      • Gemeldet - anzeigen

       es ist fast nicht möglich dir zu helfen, wenn du nicht genau sagst was du möchtest. Soll ein alert ausgegeben werden, ein Feld befüllt.... Ninox kann auch nur das machen was du vorher festlegt. Die Abfrage läuft so zwar, aber ein ergebnis bekommst du so nicht.

      • truthein
      • vor 9 Monaten
      • Gemeldet - anzeigen
       said:
      Aber ich komme damit nicht weiter :( 

      nur wissen ob dieser String sich irgendwo in der anderen Tabelle ebenfalls befindet. 

        probier mal das:

      let suchWert1 := Name;
      if cnt(select Tabelle2 where Wert = suchWert1) > 0 then true else false end
      
      • Max_Thom
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Hey DANKE!
      aber irgendwie scheint es die ganze Datenbank zerschoßen zu haben 😅😂🤣 
      Das sind 775.508 Datensätze, aber Ninox scheint damit einfach nicht klar zu kommen,
      das ganze System reagiert nicht, ich vermute das ist für jeden Datensatz jeweils mehrere Tausende Wertes prüfen einfach zu viel.
      Dann muss ich leider doch auf eine konventionelle Lösung wie MySQL zurückgreifen. 

      • truthein
      • vor 9 Monaten
      • Gemeldet - anzeigen

       echt? ich hab da jetzt keine Erfahrungen mit server client Performance, aber vielleicht nutzt ein "do as server" was ... 
      (Bei SQL hat man halt den Aufwand, sich eine GUI selber bauen zu müssen, das hält mich bislang davon zurück.)

    • Ninox-Professional
    • planoxpro
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Man sollte sowas auf keinen Fall mit einem Formelfeld machen. Und dieses erst recht nicht in einer Tabellenansicht darstellen wollen. Dabei geht jede Datenbank in die Knie.

    Das genaue Ziel der Aktion liegt ja im Dunklen, aber was auch immer der Zweck sein mag: man sollte es mit einem Button machen. Und die Ausführung mit einem "do as server ... end" beschleunigen.

      • Max_Thom
      • vor 9 Monaten
      • Gemeldet - anzeigen

      planox. pro 

      Ich behellige euch gerne, wenn es hilft? 😅 

      • Ich habe eine Tabelle mit ca. 750k Einträgen.
      • Daneben eine weitere Tabelle, die allerdings nicht ganz so umfangreich ist, ca. 20k Einträge.

      Da das quasi zwei komplett unterschiedliche Datensätze sind, werden die autark voneinander verwaltet / haben keinen Zusammenhang und keine Verknüpfung, weil das überhaupt keinen Sinn macht.

      Wenn ein Wert aus der "kleinen" Liste bereits in der "großen Liste" vorhanden ist, könnte das Auswirkungen für die Arbeit haben, deshalb soll ein Hinweis erscheinen (true/ false) erscheinen. Und dabei bleibt es, lediglich ein Hinweis erscheint das dieser Wert bereits vorhanden ist, es hat keine weitere Auswirkungen/ Aktionen für die Datenbank und/ oder keinen Einfluss haben.
      Ich bin mir nicht sicher, ob diese Information weiterführend ist?

      Was genau meinst du mit dem Button? Das ist mir nicht ganz klar.

      trut hein Danke für die Anregung 😉

      • Michi.1
      • vor 9 Monaten
      • Gemeldet - anzeigen

      probiere mal das:

      let suche := Name;
      let tabelle := (select Tabelle2);
      let id := first(tabelle[Name = suche]);
      if id != null then
          alert("Eintrag schon vorhanden. Bitte bestätigen Sie mit 'OK'.")
      end
      

      Ist für einen Button, da die meldungen sonst nicht klappen, bzw Ninox verlangsammen. Wenn es nur ein Hinweis sein soll. Muss nach der befüllung von dem Textfeld ausgelöst werden

      • Michi.1
      • vor 9 Monaten
      • Gemeldet - anzeigen

      geht auch ungenauer für unterschiedliche schreibweisen

      if Name then
          let suche := lower(Name);
          let tabelle := (select Tabelle2);
          let id := first(tabelle[contains(lower(Name), suche)]);
          if id != null then
              alert("Eintrag schon vorhanden. Bitte bestätigen Sie mit 'OK'.")
          end
      end
      
      • Horst_Fertig
      • vor 9 Monaten
      • Gemeldet - anzeigen

       

      Servus ! 

      Ja so wollte ich's im Prinzip auch gerade mit einer kleinen Bildergeschichte zeigen, war aber offensichtlich zu langsam. Aber wurscht, vielleicht isses ja doch noch für was gut...

      Tabelle Postleitzahlen ist in diesem Fall die "grosse" Tabelle.

      Im Formular von Tabelle 2 ("kleine" Tabelle)  gibt es ein Suchfeld und einen Button zum Ausführen der Suche...

      Das Resultat nach Klick auf Suche starten kann dann sein...

      ...oder:

      Wobei das Script des Buttons dabei wie folgt ausschaut...

      let xSuche := 'Suche nach (Vergleiche mit)';
      let myCount := cnt(select Postleitzahlen where PLZ = xSuche);
      if myCount = 0 then
          let myAlert := dialog("Nicht gefunden...", "Die PLZ " + xSuche + " wurde in der Tabelle nicht gefunden!", ["OK"]);
          void
      else
          let myAlert := dialog("Bereits vorhanden...", "Die PLZ " + xSuche + " ist in der Tabelle bereits " + myCount + " mal vorhanden!", ["OK"]);
          void
      end

       

      Sinngemäß natürlich auch mit jedem anderen Feld in Tabelle 1 zu machen. Wie lange sowas dann aber bei ca. 750 T Datensätzen dauert (dauern kann), kann ich beim besten Willen nicht abschätzen. Im Falls meiner Tabelle mit knapp 2000 PLZ-Datensätzen dauert es vielleicht 1 s.

      Hoffe, es hilft vielleicht auch noch ein wenig weiter, das für die eigenen Bedürfnisse anzupassen.

      Grüße

      HF

      • Max_Thom
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Michi

      Horst Fertig

      Ohjeee... das geht gerade in eine ganz, ganz, ganz falsche Richtung, die mit meiner ursprünglichen Frage überhaupt nichts mehr zu tun hat 😅

      Erst mal vielen Dank für die Ideen.
      Aber einen Button integrieren um einen Alert manuell auszulösen ist GARANTIERT NICHT DIE LÖSUNG! 

      Wie lange sitzt man da bitte rum um alle 750k Datensätze manuell durchzutesten? Wochen! 😅😂🤣 

      • Horst_Fertig
      • vor 9 Monaten
      • Gemeldet - anzeigen

       

      Öha, nee dazu dient die Idee mit dem Button ganz sicher nicht, aber soo hatte ich die Frage (bzw. den Zweck der Sache) auch überhaupt nicht verstanden. Da muss man dann sicher ganz anders ran gehen...

      Grüße

      HF

    • mirko3
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Hallo Horst. Wenn Du in der großen Tabelle ein Ja/Nein Feld anlegst , kannst Du es mit dem Script für einen Button versuchen. Wenn Du nur eine Übersicht brauchst, welches Dir die Wörter auflistet, dann das Script für ein Funktionsfeld in einem Dashboard. Gruß Mirko

    Button

    let greatTable := (select Tabelle1);
    let smallTable := (select Tabelle2).Feld2;
    do as server
        for i in greatTable do
            if contains(smallTable, i.Feld1) then
                i.('Ja / Nein' := true)
            end
        end
    end
    

    Dash

    let greatTable := (select Tabelle1).Feld1;
    let smallTable := (select Tabelle2).Feld2;
    let result := unique(do as server
                for i in greatTable do
                    if contains(smallTable, i) then
                        i
                    end
                end
            end);
    if cnt(result) > 0 then concat(result) else "kein Treffer" end
    
    • Ninox-Professional
    • planoxpro
    • vor 9 Monaten
    • Gemeldet - anzeigen
     said:
    Was genau meinst du mit dem Button? Das ist mir nicht ganz klar.

    Es gibt verschiedene Möglichkeiten, Scripte auszuführen: Formelfelder, Trigger und Buttons. Formelfelder werden bei jedem Öffnen des Datensatzes ausgeführt, Trigger automatisch bei einem bestimmten Ereignis (z. B. Erstellen eines neuen Datensatzes) und Buttons manuell durch Anklicken.

    Die Entscheidung für eine der Möglichkeiten hängt davon ab, WANN die betreffende Aktion, in diesem Fall die Überprüfung, durchgeführt werden soll. Einmalig für alle vorhandenen Datensätze (Button)? Und/oder jedes Mal beim Erfassen eines neuen Datensatzes mit Eingabe in das Feld 'Name' in der "kleinen" TabelleB (Trigger)? Und wo soll das Ergebnis - vorhanden Ja/Nein - erkennbar sein, in TabelleA, in TabelleB oder in beiden?

    Angenommen, es soll anhand des Textfeldes 'Name' einmalig für jeden Datensatz in TabelleB ermittelt werden, ob es einen entsprechenden Datensatz in TabelleA gibt. Dann würde ich in TabelleB ein Ja/Nein-Feld namens '"Vorhanden" oder so erstellen und irgendwo(!) in der Datenbank einen Button erstellen:

    do as server
       for i in select TabelleB do
          i.Vorhanden := if cnt(select TabelleA where Name = i.Name) > 0 then true else false end
       end
    end
    

    Damit hätte man für jedem Datensatz der TabelleB ermittelt, ob der Name in TabelleA vorhanden ist mit dem Ja/Nein-Feld dauerhaft sichtbar gemacht. Das Script wird sicher einige Zeit laufen, aber es müsste eben nur ein einziges Mal ausgeführt werden.

    Wenn in TabelleB außerdem auch neue Datensätze angelegt werden und dabei jedes mal überprüft werden soll, ob der angegebene Name in TabelleA bereits vorhanden ist, dann bietet sich dafür ein "Trigger nach Änderung" im Feld 'Name' an (zu finden in den erweiterten Feldoptionen) mit folgendem Code:

    let myN := Name;
    Vorhanden := if cnt(select TabelleA where Name = myN) > 0 then true else false end
    

    Falls das Problem damit nicht gelöst sein sollte, wäre etwas mehr Kontext hilfreich (siehe oben).

      • Max_Thom
      • vor 8 Monaten
      • Gemeldet - anzeigen

      planox. pro wie man eine Interaktion auslöst ist absolut klar 🤦‍♂️

      Das mit dem "do as server" funktioniert nicht weil ich Ninox offline nutze, da ich häufig keine Internet habe und unbedingt auf die Daten ohne Internet zugreifen muss.
       

      Das würde auch nicht funktionieren mit dem trigger beim erstellen neuer Datensätze, weil ich gleich mehrere hunderte Datensätze aus einer CSV Datei importiere, da werden keine einzelne Datensätze angelegt.

      Ich glaube das beste was ich machen kann ist eine Massendaten- Anpassung.
      Ich habe hierzu eine neue Frage hier im Forum angelegt, mit Projekt Beispiel, ich denke das wird dadurch deutlich klarer.

Content aside

  • vor 9 MonatenZuletzt aktiv
  • 16Antworten
  • 134Ansichten
  • 6 Folge bereits