0

TABELLENNAME per Feldinhalt definieren

Hallo zusammen,

ich stehe aktuell vor einem Problem für welches ich keine Lösung finde.

Ich möchte gerne mit SELECT eine Tabelle ABC123 auswählen, welche dem Feldinhalt der HAUPTTABELLE entspricht.

 

Hintergrund ist, dass ich über den Datenimport bis zu 80 csv Dateien in jeweils eigene Tabellen importieren möchte und innerhalb dieser CSVs nach bestimmten Werten suchen lassen möchte.

 

Geht das?

Vielen Dank vorab

27 Antworten

null
    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Direkt wird das nicht funktionieren.
    Ein Cheat wäre es vielleicht mit der Funktion eval() einen variablen select-String zu bauen.

    let vTable := TABELLE;
    let vFeld := FELD;
    'Ergebnis select' := eval("(select " + vTable + ")." + vFeld, this)

    ACHTUNG: eval() ist keine von Ninox offiziell unterstützte Funktion.
    !!! eval() funktioniert nicht mit der NinoxApp, wenn sich die Datenbank nicht in einem Team befindet. (setzt Ninox-Abo voraus) !!!

      • AndreasHoldt
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG 

      Vielen Dank für deine Idee, die ich gleich umsetzen wollte.

      Jedoch funktioniert es so noch nicht bzw. habe ich einen Denkfehler.

      Hier der Code

      let vTable := "Kapazitaeten";
      let vFeld := "Bezeichnung";
      'Ergebnis select' := eval("(select " + vTable + ")." + vFeld, this);
      cnt(select 'Ergebnis select' where text(Spalte9) = "Live")

      Wobei "Kapazitäten" meine Haupttabelle ist und der entsprechende Wert liegt in der Spalte "Bezeichnung". Jetzt soll in der Tabelle, wie in "Bezeichnung" angegeben der Wert "Live" gesucht und gezählt werden.

      Wenn ich das so eingebe, wie oben angegeben, bekomme ich einen Fehler, dass die Spalte "Ergebnis select" nicht gefunden wurde.

      Vielen Dank schonmal für deine Hilfe.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      AndreasHoldt 

      let vTable := "Kapazitaeten";
      let vFeld := "Bezeichnung";
      let Ergebnis := cnt(eval("(select '" + vTable + "' [" + vFeld + " = ""Live""])", this));
      Ergebnis

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

       Oder
      Ich habe es mal so geschrieben, dass man ein Berechnungsfeld nutzt und das Erbenins darin angezeigt wird.
      Wobei ich nicht weiss, was mit text(Spalte9) gemeint ist, wenn der vergleich mit dem Feld 'Bezeichnung' stattfinden soll.


      let vTable := "Kapazitaeten";
      let vFeld := "Bezeichnung";
      let vSuchwort := "Live";
      let Ergebnis := cnt(eval("(select '" + vTable + "' [" + vFeld + " = " + """" + vSuchwort + """" + "])", this));
      Ergebnis

      • AndreasHoldt
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG 

      Ok, die "Spalte9" ist die Spalte in der zu suchende Tabelle(Name im Feld "Bezeichnung") in welchem der Wert "Live" gezählt werden soll.

      Verstehst was ich meine?

      • mirko3
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Da danke ich Dir aber herzlich. Das war das letzte Steinchen was ich noch gesucht habe für die - für mich - einfachere Schreibweise von eval(). Bisher konnte ich den Wert einer Bedingung nicht einsetzen, weil ich diese doppelten Anführungszeichen nicht kannte. Jetzt habe ich es so probiert und voila, das wars. Super👍

      In der Form sieht dein Code von oben so aus und meine Augen haben endlich ihre Ruhe vor dieser Herde Anführungszeichen:

      let vTable := "Kapazitaeten";
      let vFeld := "Bezeichnung";
      let vSuchwort := "Live";
      cnt(eval(---
       select { vTable }[ { vFeld } = "{ vSuchwort }" ]
      ---, this))
      


       

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko Wieder etwas dazu gelernt.
      Werde ich mit in die Ninox-Reference als Bsp. zur Funktionsbeschreibung von eval() aufnehmen.

      • Ninox-Professional
      • planoxpro
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko Das funktioniert? Echt? Mein letzter Stand war, dass sich beim select der Tabellenname nicht als Variable in den eval()-String einfügen ließ, nur der where-Teil. Wäre ja cool, wenn das jetzt funktionieren würde.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      AndreasHoldt Leider nein.
      Irgendwie kann ich mir gerade nicht vorstellen, was du genau machen möchtest.
      Mir fehlt einfach die Vorstellung
      Ich habe mir jetzt den ersten Post mehrmals durchgelesen.
      So wie ich es verstehe vielleicht so:

      let vTable :=  first(select Kapazitäten). Bezeichnung;
      let vFeld := "Spalte9";
      let vSuchwort := "Live";
      let Ergebnis := cnt(eval("(select '" + vTable + "' [" + vFeld + " = " + """" + vSuchwort + """" + "])", this));
      Ergebnis

      So funktioniert es nur wenn nur ein Record in der Tabelle Kapazitaeten vorhanden ist.
      Wenn die Tabelle mehrere Records enthält, muss man mit einer Schleife durchiterieren.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      planox. pro Hallo Axel
      Wie ich die Schreibweise von Mirko verstehe, setzt man durch die 3 Bindestriche am Anfang und Ende das Script als String.

      • Ninox-Professional
      • planoxpro
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG Hi Uwe, ja, das ist mir klar, aber in meiner Erinnerung hat es auch in dieser Schreibweise nicht funktioniert, den Tabellennamen dynamisch einzufügen. Beziehungsweise: Einfügen in den String ging natürlich, aber Ninox hat den select-Befehl dann nicht ausgeführt. Es gab hier mal einen Thread dazu - bin aber gerade zu faul zum Suchen. ;)

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      planox. pro Eigentlich schon immer, wenn der select sich innerhalb eval() befindet.
      s funktioniert nicht wenn der select außerhalb eval() steht und nur der Tabellenname als Variable mit eval() übergeben werden soll.
      Man müsste es mal bei Ansichten testen


      eval("(select '" + vTable + "' [" + vFeld + " = " + """" + vSuchwort + """" + "])", this)
      funktioniert ja seit aufspüren der Funktion.


      So habe ich es bisher festgestellt.

      Bei Ansichten wird es nicht funktionieren, da select Tabellenname erwartet wird und nicht als Variable ersetzt werden kann.

      • AndreasHoldt
      • vor 2 Jahren
      • Gemeldet - anzeigen

      UweG 

      Hallo Uwe, zum besseren Verständnis.

      Meine Haupttabelle "Kapazitäten" beinhaltet alle verbauten Kabel mit Bezeichnungen(Spalte Kapazitäten.Bezeichnung) nun soll in jedem Datensatz in dieser Tabelle die Belegung der einzelnen Kabel ermittelt werden.

      Die importierten CSV Dateien,  haben den selben Namen wie in "Bezeichnung" angegeben und somit wird die Tabelle auch gleich lautend sein. In dieser Tabelle liegt dann die Belegung des Kabels in "Spalte9" mit dem Inhalt "LIVE" oder ist eben Leer.

      Nun soll mittels Formel die Tabelle, wie in der Tabelle KAPAZITÄTEN und der Spalte BEZEICHNUNG angeben, ausgewählt und in dieser dann in der Spalte SPALTE9 der Wert LIVE gesucht und gezählt werden.

      Kannst du das nach vollziehen, was ich meine oder machen möchte?

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich habe schon einige Zeit eine eval() Testtabelle. Im oberen Teil sind Textfelder zu sehen, darunter das Ergebnis und darunter das gleiche Ergebnis mit Variablen. Also bei mir klappt es, bis auf das schräge Array als Ergebnis. Für mich war es nur eine "Machbarkeitsstudie".

    Das Script für das untere Funktionsfeld ist:

    let Tab := "EINKAUF";
    let col := "PRODUKT";
    let field := "PRODUKT";
    let name := "R2D2";
    eval(---
     select { Tab }[ { col } = "{ name }"  ].{ field }
    ---, this)
    
    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ach ja, eine Ansicht bekomme ich mit eval() bezüglich des Tabellennamens auch nicht zum Laufen. Mir gefällt nur die für mich intuitivere Schreibweise, wie oben erwähnt.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko Das ist Klasse Mirko. Ist schon in der Reference bei eval(9 und dem Praxisbeispiel eingetragen.
      Ja, schade, dass es nicht bei Ansichten funktioniert.
      Was leidlich klappt ist nach where, eval zu nutzen.
      Bsp.
      select Tabellenname where eval("Feldname=Vergleichswert",this)


      Man hat nur Probleme, wenn man den in der Ansicht angezeigten Record anwählt, Änderungen vornimmt und wieder zur Ansicht zurück wechselt.

      • Ninox-Professional
      • planoxpro
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Mirko UweG

      In einer Ansicht lassen sich generell keine verschiedenen Tabellen anzeigen. Unabhängig von eval(). Es bleiben immer die Spalten der ersten eingeblendet. Sowas würde bspw. auch nicht funktionieren:

      if Auswahl = 1 then
         select TabelleA
      else
         select TabelleB
      end

      Wahrscheinlich habe ich daraus in meiner Erinnerung fälschlicherweise abgeleitet, dass sich eval() prinzipiell nicht bei "select TABELLE" nutzen lässt. Ich weiß zwar jetzt gerade nicht, wofür man es sonst mal brauchen könnte, aber es ist ja gut zu wissen, dass es doch geht. 👍

       

      PS: In Produktiv-DBn habe ich eval() bisher noch nie genutzt. War mir irgendwie zu heikel.

    • AndreasHoldt
    • vor 2 Jahren
    • Gemeldet - anzeigen

    UweG

    Falls meine Antwort untergegangen sein sollte. 

    Hallo Uwe, zum besseren Verständnis.

    Meine Haupttabelle "Kapazitäten" beinhaltet alle verbauten Kabel mit Bezeichnungen(Spalte Kapazitäten.Bezeichnung) nun soll in jedem Datensatz in dieser Tabelle die Belegung der einzelnen Kabel ermittelt werden.

    Die importierten CSV Dateien,  haben den selben Namen wie in "Bezeichnung" angegeben und somit wird die Tabelle auch gleich lautend sein. In dieser Tabelle liegt dann die Belegung des Kabels in "Spalte9" mit dem Inhalt "LIVE" oder ist eben Leer.

    Nun soll mittels Formel die Tabelle, wie in der Tabelle KAPAZITÄTEN und der Spalte BEZEICHNUNG angeben, ausgewählt und in dieser dann in der Spalte SPALTE9 der Wert LIVE gesucht und gezählt werden.

    Kannst du das nach vollziehen, was ich meine oder machen möchte?

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      AndreasHoldt 
      Leider fehlt mir die Vorstellungskraft deine Anforderung nachzuvollziehen.

      Besteht die Möglichkeit die DB in ein neues Team zu laden und mich in das Team einzuladen.
      Dann kann ich nachvollziehen was das Script bewirken soll und vielleicht zu einer Lösung beitragen.

      foren.uwe@gmx.de

    • AndreasHoldt
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe,

    ich habe dich entsprechend eingeladen.

    Bitte beachten, dass diese Datenbank nur der Spielplatz für diese Funktion ist.

     

    Danke vorab vielmals für deine Hilfe

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      AndreasHoldt Ich spiele gerne.

      Ich schaue es mir am Wochenende mal an und komme auf dich bei Fragen zurück.

      • UweG
      • vor 2 Jahren
      • Gemeldet - anzeigen

      AndreasHoldt 
      Schau mal in die Datenbank, ob es so für dich passt.
      Ich habe dein Script geändert von


      let vTable := first(select Kapazitäten).Bezeichnung;
      let vFeld := "Spalte9";
      let vSuchwort := "Live";
      let Ergebnis := cnt(eval("(select '" + vTable + "' [" + vFeld + " = " + """" + vSuchwort + """" + "])", this));
      Ergebnis := 'Ergebnis LIVE'

      nach (von Mirko geklaut weil es eleganter ist ;-)):

      let vTable := Bezeichnung;
      let vFeld := "Spalte9";
      let vSuchwort := "Live";
      'Ergebnis LIVE' := number(cnt(eval(---
       select { vTable }[ { vFeld } = "{ vSuchwort }" ]
      ---, this)))

      Für mich ist es meist leichter, wenn ich darauf schauen kann. Bin mehr der haptische Typ.
      Wenn es passt, kannst du mich wieder aus dem Team löschen.

      • AndreasHoldt
      • vor 1 Jahr
      • Gemeldet - anzeigen

      UweG 

      Hallo Uwe,

      Vielen Dank für deine Mühe, es scheint so zu funktionieren. 

      Jetzt ist es ja so, dass ich den Abgleich immer über den Button starten muss, gibt es da eventuell noch eine Funktion die das Automatisch anschubst sobald die Quelldatei verändert wird?

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      AndreasHoldt Im Feld 'Bezeichnung' -> 'Trigger nach Änderung':

      if Bezeichnung then
          let vTable := Bezeichnung;
          let vFeld := "Spalte9";
          let vSuchwort := "Live";
          'Ergebnis LIVE' := number(cnt(eval(---
       select { vTable }[ { vFeld } = "{ vSuchwort }" ]
      ---, this)))
      end

      Damit wird das Zählfeld gefüllt, wenn man etwas im Feld 'Bezeichnung' neu einträgt oder ändert.

    • AndreasHoldt
    • vor 1 Jahr
    • Gemeldet - anzeigen

    UweG

     

    Vielen Dank für deinen Support.

    Jetzt habe ich noch eine Frage, mir ist aufgefallen, dass die Tabellen, wenn diese MINUS-zeichen enthalten(z.B. "ABC-123"-> funktioniert nicht / "ABC123"-> funktioniert ) nicht gefunden werden. Hast du da eventuell eine Idee, was hier die Lösung sein kann?

Content aside

  • vor 1 JahrZuletzt aktiv
  • 27Antworten
  • 228Ansichten
  • 3 Folge bereits