0

Ganze Tabelle filtern mit DAF oder DMAF

Hallo Community;

anstelle des Suchfeldes in der Tabellenansicht, möchte ich mit den Suchkriterien aus der

Tabelle-F.Filtertext alles in der Tabelle1 anzeigen lassen.

Die Aufgabe ist also: Standardfilter mit einem Klick.

Im ersten Schritt soll gefiltert werden mit Dynamischen Auswahlfeld. Evtl. wenns läuft im zweiten Schritt mit Dynamischen Mehrfachauswahlfeld:

  1. DAF ist in der Tabelle1 zeigt die Tabelle-F.Filtertext
  2. DMFA wie 1

Bekomme alle Texte beider Tabellen angezeigt, aber nicht gefiltert:

Aktuell Suche in einigen Spalten, es soll aber Alles durchsucht und angezeigt werden.

Code filtert nicht. Suche und teste mir einen Wolf. Jetzt komme ich nicht weiter. Wie sieht Eurer Tip aus?

 

Spalten der Tabelle-F: Nr;Filtertext

Tabelle1: Nr;Datum;Projekt;Start;Ende;Beschreibung;Einheit;Zuordnung;DAF

 

let xSuche := (select Tabelle1).lower(text(DAF));

select Tabelle1 where lower(text(Beschreibung)) or lower(text(Projekt)) or lower(text(Zuordnung)) like xSuche

7 Antworten

null
    • Ninox Widgets & User Interfaces
    • Jakob_Jordan
    • vor 2 Wochen
    • Gemeldet - anzeigen

    Wir nutzen immer die Funktion testx() für die Suchfunktion von Listen. Das hat bislang immer sehr gut geklappt. Ggf. kann das noch optimiert werden. testx() ist schon fast eine Wissenschaft für sich. 
    Hier ein Beispiel einer gefilterten Liste von uns: 

    let current := this;
    let search := Suche;
    let person := Person;
    (select Auftrag
        where currentStatus.Sortierung >= 2 and currentStatus.Sortierung <= 4 and
                helper_logistikFinished != true and
            if search != null then
                    testx(text(currentStatus.Status) + "," + 'Auftragsnr.' + "," + Objektnummer  +
                    "," +
                    "keepThisTextAtTheEnd ,", "(?:" + search + ")\.*[^]", "gi")
                else
                    true
                end and
        if person != null then
                Monteur = person
            else
                true
            end) order by -'Erstellt am'

      • Maurice
      • vor 2 Wochen
      • Gemeldet - anzeigen

       Wir haben noch weiter gebaut:

      In jeder Tabelle, in der gesucht werden soll und durch eine Ansicht/arcrider Table die gefunden Daten angezeigt werden sollen, gibt es ein Funktionsfeld "SuchTags", in das die Felder kommagetrennt eingetragen werden, also z.B so etwas:

      Vorname + "," + Name + "," + join(Kurse.Kursname,",") + "," + Wohnort

      Wir haben ein Textfeld (Globalsuche), in das man dann wie folgt suchen kann:

      Suchstrings mit Leertaste getrennt eingeben, diese werden mit UND verknüpft
      Klammert man einen Suchstring mit not() ein, wird dieser ausgeschlossen
      Mit einem Auswahlfeld (KonjungtionSuche) kann man zwischen "UND" und "ODER" wählen. Bei "ODER" werden die Suchstrings mit ODER verknüpft, außer mit not() geklammerte Strings, die mit UND verknüpft werden. Der Code dazu:

      let sArr := split(current.Globalsuche, " ");
      let regEx := "";
      if KonjungtionSuche = 1 or KonjungtionSuche = null then
          regEx := "^" +
              for i from 0 to cnt(sArr) do
                  let suchwort := item(sArr, i);
                  if substr(suchwort, 0, 4) = "not(" and substr(suchwort, length(suchwort) - 1, 1) = ")" then
                      "(?!.*" + substr(suchwort, 4, length(suchwort) - 5) + ")"
                  else
                      "(?=.*" + item(sArr, i) + ")"
                  end
              end +
              ".*"
      else
          regEx := "^";
          for i from 0 to cnt(sArr) do
              let wort := item(sArr, i);
              if substr(wort, 0, 4) = "not(" and substr(wort, length(wort) - 1, 1) = ")" then
                  let negWort := substr(wort, 4, length(wort) - 5);
                  regEx := regEx + "(?!.*" + negWort + ")"
              end;
              "// Positive Bedingungen (alle anderen Wörter)";
              let positive := "";
              for i from 0 to cnt(sArr) do
                  let wort := item(sArr, i);
                  if not (substr(wort, 0, 4) = "not(" and substr(wort, length(wort) - 1, 1) = ")") then
                      positive := positive + wort + "|"
                  end
              end;
              "// Entferne letztes | falls vorhanden";
              if length(positive) > 0 then
                  positive := substr(positive, 0, length(positive) - 1);
                  regEx := regEx + "(?=.*(" + positive + "))"
              end;
              regEx := regEx + ".*"
          end
      end;
      

      Und dann weiter  wie bei Jakob:

      filteredList := (list01[if current.Globalsuche != null then
                          testx(SuchTags + "," + "keepThisTextAtTheEnd ,", regEx, "gi")
                      else
                          true
                      end and
      

      wobei list01 mit select Tabelle definiert ist.

      Jetzt wollen wir ein instant-search umsetzen (irgendwo gab es ein Video dazu), also dass schon bei der Testeingabe in das Suchfeld gesucht wird und nicht erst nach Enter-Taste.

      • mirko3
      • vor 2 Wochen
      • Gemeldet - anzeigen

       Hallo Maurice. Du kannst eine solche Funktionalität, welche Du instant-search nennst, mit folgendem Code als globale Funktion erreichen:

      function Update(fieldID : text,ID : text) do
          html("
      <style>
      p{border:thin solid DimGray;}
      input{text-align:center;background-color:rgb(250, 240, 210);}
      </style>
      <p><input id='search' type='text' onclick='ClearInput(this)' onkeyup='UpdateField()' placeholder='keyword'></p>
      <script>
      function UpdateField() {
      let result = document.querySelector('#search').value;
      let idx = '" +
          ID +
          "';
      database.update(idx, '" +
          fieldID +
          "' , result);
      };
      function ClearInput(target) {
      target.value= '';
      let idx = '" +
          ID +
          "';
      database.update(idx, '" +
          fieldID +
          "' , '');
          }
      </script>
      ")
      end
      

      In der Tabelle mit dem SUCHFELD legst Du dann einfach ein Funktionsfeld an und aktivierst die Funktion unter Benutzung der Funktionen fieldId() und raw().

      Update(fieldId(SUCHFELD),raw(this))

      Jetzt kannst Du das SUCHFELD verbergen und voila. Ein Skript löscht auch das Suchfeld beim hineinklicken. Da ich 10-Finger schnell schreibe, ist mir aufgefallen, dass auf dem Mac die update() Funktion nicht immer hinterherkommt. Also etwas langsamer tippen, sonst fehlt der letzte Buchstabe. Als Anlage lege ich Dir eine alte Datei von mir bei, in der ich das mal umgesetzt habe. Mirko

      • Maurice
      • vor 2 Wochen
      • Gemeldet - anzeigen

       Danke. Inzwischen hatte ich im Forum gefunden https://forum.ninox.de/t/g9yxy50#g9yx3j6. Maurice

      • Ninox Widgets & User Interfaces
      • Jakob_Jordan
      • vor 2 Wochen
      • Gemeldet - anzeigen

       wow das ist durchaus eine coole Erweiterung. Werden wir testen. 
      instant-search ist eine spannende Anforderung und etwas was wir Custom Input in Betracht ziehen könnten - wir nutzen dazu ja auch die database.update API von Ninox.

      Nur onkeyup wie von  beschrieben könnte tatsächlich etwas tricky sein, auch abhängig von der Größe der Query. Aber vllt. mit einem kurzen Delay? Wir forschen da auch noch mal etwas :)

      Aber cool, dass es schon so viel Lösungen in die Richtung gibt. Noch cooler wäre es mehr zugriff auf queries außerhalb von Ninox script zu erhalten. Dann könnten wir den Sucharray direkt über JS erhalten und diese Lösung viel besser umsetzen...

      • Maurice
      • vor 2 Wochen
      • Gemeldet - anzeigen

       Das "wow" geht an chatgpt: ich kenne mich so gut wie nicht mit regular-expressions aus; ca. 20 Minuten quatschen mit chatgpt und etwas ausprobieren. 

      Noch nicht umgesetzt: aber als nächstes spielen wir noch mit folgendem Gedanken:

      Es gibt eine Spalte des Widgets, in dem Kurse dargestellt werden, von der Art: K25-M1, K25-DM11, K25-SR1; K25-Ph1 ca. 5-8 Stück pro Person/Zeile.
      Diese Kurse gehören bestimmten Oberbegriffen an: Naturwissenschaft, Fachdidaktik, Zusatzkurs  etc. Das ist über ein DMAF festgelegt.
      In dem SuchTags-Formelfeld  stehen auch diese Oberbegriffe.

      Um jetzt schnell angeben zu können, welche Kurse in der Spalte Kurse gelistet werden sollen, soll der Anwender in den Suchstring dies direkt miteingeben können, z.B. derart: kurs(zusatz) für alle Zusatzkurse oder kurs(fachd) für alle Fachdidaktiken.

      Das sollte gut machbar sein, indem aus dem Suchstring der Teilstring mit kurs(xxx) extrahiert wird, dieser Teil dient als Bedingung bei value im Widget, der Rest bleibt als Suchstring.
      Das wäre dann eine Kombi aus Suchstring für die Zeilen und Festlegung der Anzeige einer Spalte.

      Maurice

    • Wodi
    • vor 9 Tagen
    • Gemeldet - anzeigen

    Danke für die interessanten Kommentare. Habe eine Lösung gefunden die alle Datensätze genau wie die Standardsuche in der Tabellenansicht anzeigt.

    Mit DAF - Einzelsuche in den 4 Feldern:

    let xSuche := (select Tabelle1).lower(text(DAF));

    select Tabelle1

    where lower(text(Projekt)) like "" + xSuche + "" or

    lower(text(Beschreibung)) like "" + xSuche + "" or

    lower(text(Zuordnung)) like "" + xSuche + "" or

    lower(text(Datum)) like "" + xSuche + ""

    Und nur mit DMAF Mehrfachsuche im Feld Beschreibung:

    let xSuche := lower(text(DMAF));

    select Tabelle1 where not first(xSuche) or contains(xSuche, lower(text(Beschreibung)))

Content aside

  • vor 9 TagenZuletzt aktiv
  • 7Antworten
  • 103Ansichten
  • 6 Folge bereits