1

Suchfunktion

Moin in die Runde :)

Ich habe mal ein kleines Anliegen. Ich habe ein Suchfeld, dass eine Tabelle nach Begriffen durchsucht und diese entsprechend anzeigt. S. Bild.

In der Ansicht ist entsprechend der Code hinterlegt

let SuchString := lower(Suchen);
if Suchen = null then
select Locations
else
select Locations where contains(lower(Location), SuchString)end

Das klappt auch alles Einwandfrei. Ich fände es aber toll wenn sich die Ansicht automatisch aktualisiert während ich den Suchbegriff eingebe. Also quasi nach jedem eingetippten Buchstaben eine aktualisierung. Aktuell muss ich immer erst Enter drücken oder auf Suchen klicken.

Habt ihr eine Idee wie man das realisieren könnte?.

 

Lg

Christoph

11 Antworten

null
    • mirko3
    • vor 10 Monaten
    • Gemeldet - anzeigen

    Hallo Christoph. Das ist eine schöne Idee von Dir. Ich sehe da keine Möglichkeit in Ninox mit Bordmitteln. Das Speichern des Inhaltes, oder besser die Sichtbarkeit des Inhalts eines Felds ist erst nach Verlassen des Textfelds gegeben. Aber - mit ein wenig Javascript ist es realisierbar. Du brauchst ein Funktionsfeld für den Code, der auf Dein Suchfeld verweist. Du benötigst die FeldID, welche durch Versuch und Irrtum herausfindbar (meist aufsteigend von A...Z, nach der Erstellungszeit des Felds geordnet) ist oder über eine API-Abfrage (es gibt einen Beitrag von UweG im Forum). Diese FeldID wird im Script statt "B" eingetragen (database.update(idNX, 'B' , result). Zur Veranschaulichung lege ich Dir mal zum testen eine DB bei. Gruß Mirko

      • kirchenmusik
      • vor 10 Monaten
      • Gemeldet - anzeigen

      VIelen Dank für deine Antwort und sorry für die späte Rückmeldung. Ich war bis heute in Urlaub.
      Ok ich habe mir alles mal angeschaut. An sich alles einleuchtend nur die Sache mit dem "B" habe ich noch nicht verstanden. Kannst du mir den Beitrag mal verlinken? Habe ihn nicht gefunden.

      Ich hatte deine Tabelle mal mit meiner Nachgebaut. Prinzipiell überträgt das Feld Input grade keine Daten in das Feld Text. Wenn ich im Text feld was eingebe filtert die Ansicht aber entsprechend.

      Lg
      Christoph

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

      hier der link: https://forum.ninox.de/t/g9hdxh1/ninox-feld-ids-fur-http-anfragen-auerhalb-ninox-ermitteln

      am Ende steht hier zu jedem Feld die ID.

      • mirko3
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Hi Christoph. Michi schrieb schon den Link. Hier mal eine Funktion, die ich dafür mal geschrieben habe. Beim Aufruf der Funktion muß als Argument die Tabelle als String, also mit Anführungszeichen eingetragen werden, was bei Dir findFieldId("Locations Übersicht") sein müsste. Denk an den Bearer, statt der vielen x muß dann dein API-Key eingetragen werden. Dann kennst Du die FeldID und trägst sie statt "B" ein. Mirko

      function findFieldId(nameOfTable : text) do
          "//Danke an UweG";
          let vUrl := "https://api.ninox.com/v1/teams/" + teamId() + "/databases/" + databaseId() +
              "/tables/";
          let vHeader := {
                  Authorization: "Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                  'Content-Type': "application/json"
              };
          let resultJSON := do as server
                  formatJSON(http("GET", vUrl, vHeader, ""))
              end;
          "//Ende Danke an UweG";
          let resultObjekt := parseJSON(resultJSON);
          let howMany := cnt(resultObjekt.result);
          let result := for i in range(0, howMany) do
                  if item(resultObjekt.result, i).name = nameOfTable then
                      item(resultObjekt.result, i)
                  end
              end;
          let aryFields := item(result, 0).fields;
          join(for i in range(0, cnt(aryFields)) do
              "ID: " + item(aryFields, i).id + " - Feldname: " + item(aryFields, i).name
          end, "
      ")
      end;
      
      • kirchenmusik
      • vor 10 Monaten
      • Gemeldet - anzeigen

        Danke euch! Das war sehr hilfreich. Auf den Umweg wäre ich nciht im Traum gekommen. Also noch mal vielen Dank.

      Es ergab sich nun noch eine zweite Frage. Da gibts sicher auch wieder einen Trick den ich nicht kenne 😄

      Die Ansicht wird entsprechend in der Spalte Location durchsucht. Es gibt allerdings noch eine zweite Spalte mit dem Namen "Adresse". Ich wollte, dass das Suchfeld in beiden spalten sucht und entsprechend anzeigt. Ich dachte ja ich knalle da ein simples "or" zwischen aber das hat nicht so hingehauen. Vielleicht weiß jemand von euch Rat.

      Lg und noch einmal ein großes Danke!

      Christoph

      let input := Suchen;
      if input = null then
          select Locations
      else
          (select Locations)[contains(lower(Location), lower(input))]
      end
      
      • mirko3
      • vor 10 Monaten
      • Gemeldet - anzeigen

       Das sollte auch mit "or" gehen. In einer solchen Suchtabelle habe ich den Suchstring aber einfach erweitert mit Stringverkettung. Mirko

      let input := Suchen;
      if input = null then
            select Locations
        else
            (select Locations)[contains(lower(Location)+"#"+lower(Adresse), lower(input))]
        end
      
      ODER
      
      let input := Suchen;
        if input = null then
            select Locations
        else
            (select Locations)[contains(lower(Location),lower(input)) or contains(lower(Adresse),lower(input))]
        end
      • Michi.1
      • vor 10 Monaten
      • Gemeldet - anzeigen

       blöde frage, wenn man es so schreibt : let vUrl := "https://api.ninoxdb.de/v1/teams/" + teamId() + "/databases/" + databaseId();

      bekommt man ja die skripte von allen objekten der DB. Könnte man nicht irgendwie das für eine einfache Doku Missbrauchen, welche dann jederzeit aktuell ist????

      so nach dem Motto:

      Wobei man da ja die Feldid (A in dem fall zu Abrechnung Umwandel könnte)

      ID: A - Feldname: Abrechnung - Feldart: file
       *afterUpdate:- (if ((((contains(text(A),\".PDF\") or contains(text(A),\".pdf\")) ......

      Das wäre mal ein Traum

      • kirchenmusik
      • vor 10 Monaten
      • Gemeldet - anzeigen

      DANKE dir!

      So eine Idee hatte ich auch (wobei bei mir ein Programierfehler drinn war). Jedoch scheint das ganze nicht zu funktionieren, denn das Feld Adresse ist ein Adressfeld aus Ninox (kein Textfeld) und Ninox meckert die ganze Zeit darüber..

      • mirko3
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Du meinst sicher ein Standort-Feld. Dann würde ich es so schreiben:

      ...
      (select Locations)[contains(lower(Location)+"#"+lower(raw(Adresse)), lower(input))]
      ...
      

      Es geht auch mit text() aber bei Benutzung von raw() kannst du auch nach den Koordinaten suchen, falls so etwas gewünscht ist. Mirko

      • kirchenmusik
      • vor 10 Monaten
      • Gemeldet - anzeigen

      Super es geht! VIelen vielen Dank!!!

    • mirko3
    • vor 8 Monaten
    • Gemeldet - anzeigen

    You'll need the field ID of the text field. You can only get them via an API function in this thread or a thread of UweG. Than change this "B" in

    database.update(idNX, 'B' , result);
    

Content aside

  • 1 „Gefällt mir“ Klicks
  • vor 8 MonatenZuletzt aktiv
  • 11Antworten
  • 253Ansichten
  • 4 Folge bereits