0

Datensätze in verknüpfter Tabelle mit einem "Zählerfeld" hochzählen

Vermutlich wieder mal eine (für mich) peinliche Frage:
Tabelle "Dashboard" mit den Feldern "Auswahl" (dynamisches Auswahlfeld) und "Ausgewählt".
Verknüpft mit der Tabelle "Städte" mit den Feldern "Stadt" und "Zaehler".

Der Sinn: Ich wähle mit "Auswahl" eine Stadt aus und diese wird mit "Ausgewählt" angezeigt.
Dann soll per script in der Tabelle "Staedte" der "Zaehler" der ausgewählten Stadt um 1 erhöht werden.
Das script bekomme ich einfach nicht hin.

Ich würde mich über eine Hilfe sehr freuen.

22 Antworten

null
    • T_Bartzsch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    In das Feld "Nach Änderungen .... usw" des dynamischen Auswahlfeldes:

     

    let myStadtID := 'Auswahl';
    first(select 'Städte' where number(Nr) = myStadtID).(Zaehler := Zaehler + 1)

    • T_Bartzsch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    let myStadtID := 'Auswahl';
    first(select 'Städte' where number(Nr) = myStadtID).(Zaehler := Zaehler + 1);
    'Ausgewählt' := first(select 'Städte' where number(Nr) = myStadtID).Stadt

    ... da fehlte doch noch was

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Tobias,

    Danke für die schnelle Antwort.
    Funktioniert grundsätzlich, aber der Zähler wird nur bei der ersten Auswahl einer Stadt auf "1" gesetzt.
    Wenn die gleiche Stadt erneut ausgewählt wird, erfolgt keine Erhöhung.

    Hast Du da noch eine Idee?

    • T_Bartzsch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Was hast Du denn vor? Was heißt bei der "ersten Auswahl"?

    Nach jeder Änderung des Auswahlfeldes wird der Zähler erhöht... bei mir klappt das

    Wann, bzw. warum wird denn die gleiche Stadt nochmal gewählt?

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich wollte die Beschreibung einfach gestalten, darum Dashboard und Städte.
    Ich möchte eine Auftagsbearbeitung etwas vereinfachen. Ausgewählt werden dort über ein Auswahlfeld Artikel und dann in den Auftrag geschrieben. Mit dem bisherigen Auswahlfeld waren die Artikel bunt durcheinander gewürfelt. Ich möchte mit dem dynamischen Auswahlfeld jetzt erreichen, dass die aufgerufenen Artikel bei jedem Aufruf hochgezählt (Zaehler) werden. Mit "sort by Zaehler" sollen beim nächsten Aufruf der Auswahlliste die am häufigsten gewählten Artikel ganz oben stehen, also eine Art Hitliste. Das wäre übrigens für viele andere Anwendungen sehr praktisch.

    Zurück zum Beispiel Dashboard / Staedte: Wenn die Zaehlerspalte leer ist und ich das erste mal z.B. Hamburg auswähle, wird der Zähler Hamburg um 1 erhöht. Wenn ich jetzt eine andere Stadt wähle klappt das auch. Wenn ich jetzt wieder Hamburg wähle wird der Zähler um 1 erhöht. Soweit alles gut.

    Wenn ich Hamburg auswähle bleibt Hamburg im Auswahlfeld ausgewählt. Wenn ich jetzt wieder auf Hamburg klicke (für eine "neue" Auswahl) wird der Zähler nicht hochgezählt.
    Vielleicht müßte das Auswahlfeld den Standardwert "leer" haben, dass ist aber anders als beim bisherigen Auswahlfeld nicht mehr vorgesehen.

    Ich hoffe Dich jetzt nicht verwirrt zu haben.
    Auf jeden Fall schon mal vielen Dank.

    • T_Bartzsch
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ja verstehe... gute Idee das mit der internen "Hitliste" .... aber klar, das script läuft ja auch bei "Nach ÄNDERUNG ..." wenn sich nix ändert, ändert sich nix :)

    Du musst halt an irgendeinem Punkt dafür sorgen, dass dein Auswahlfeld null ist. Also entweder bei Anlage eines neuen Datensatzes, oder beim schreiben des Auftrags, den Du ja sicher über einen Button ablegst 

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Wenn ich "Auswahl := null" mit einem Button ausläse, funktioniert das "Rücksetzen" des Auswahlfeldes.

    Wenn ich "Auswahl := null" an das Ende Deines scripts setze habe ich den gleichen Efekt (ich kann eine Stadt mehrfach hintereinander aufrufen) und es wird gezählt.
    ABER, jetzt wird der Zähler jeweils um 2 erhöht.

    Hast Du dafür eine Erklärung?

    let myStadtID := Auswahl;
    first(select 'Städte' where number(Nr) = myStadtID).(Zaehler := Zaehler + 1);
    'Ausgewählt' := first(select 'Städte' where number(Nr) = myStadtID).Stadt;
    Auswahl := null

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    if Auswahl != null then
    let myStadtID := Auswahl;
    first(select 'Städte' where number(Nr) = myStadtID).(Zaehler := Zaehler - 1);
    'Ausgewählt' := first(select 'Städte' where number(Nr) = myStadtID).Stadt;
    Auswahl := null
    end

    Warum -1 statt +1.
    Wenn du eine Hitliste bauen möchtest, so dass der meistgewählte Ausdruck im dynamischen Auswahlfeld immer oben stehen soll musst du mit negativen Zahlen arbeiten, da order by nur aufsteigend sortiert. Das wird im dynamischen Auswahlfeld erst dann richtig angezeigt, wenn alle Werte mindestens einmal ausgewählt wurden, da ein leerer Zähler 'null' immer an erster Stelle angezeigt wird oder du setzt alle Zähler beim Anlegen auf 0.

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Wenn du bei 'Name des dynamischen Wertes' noch folgendes Script einfügst: 'Zahhler' * -1 + " " + Stadt , hast du in der Anzeige beim aufklappen der Combobox Anzahl und Stadt. (Vielleicht bei gleicher Zaehler Zahl hilfreich)

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Noch eine Anmerkung.
    Du kannst auch mit +1 arbeiten. Dann muss der select der Tabelle im dynamischen Auswahlfeld wie folgt aussehen: select 'Städte' order by 'Zaehler'*-1 um eine absteigende Anzeige zu erhalten.
    Manchmal denke ich zu kompliziert.

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Guten Morgen,

    das klappt alles prima, auch Deine Erweiterungen.

    ABER, wie ich schon mal geschrieben habe: Mein Zähler feld wird nicht 1,2,3 usw. hochgezählt sondern 2,4,6 usw.

    Ich habe dafür keine Erklärung. Ich stelle die kleine "Übungsdatenbank" mal in Dropbox. Vielleicht mag ja noch mal jemand reinschauen.

    https://www.dropbox.com/s/wyowrczpro83jgd/%23%20AA%20Mehrfachauswahl%20St%C3%A4dte.ninox?dl=0

    Vielen Dank.

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

    Im Web funktioniert es einwandfrei. Aber in der Mac-App wird der Zähler tatsächlich um 2 hochgezählt. Auch bei etwas verändertem Skript:

     

    'Ausgewählt' := null;
    if Auswahl != null then
       let myStadtID := Auswahl;
       let myRec := first(select 'Städte' where number(Nr) = myStadtID);
       myRec.(Zaehler := myRec.Zaehler + 1);
       'Ausgewählt' := myRec.Stadt;
       Auswahl := null
    end

     

    Es liegt also an der App. Aber wo da genau ... Keine Ahnung.

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    ...und noch etwas schräger ist, dass es nur bei der Anzeige des dynamischen Auswahlfelds als Comobox auftritt, nicht bei Radio Buttons und Switch ;-)

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo @MZ.

    Weshalb es in der App nicht wie in der Cloud funktioniert kann ich auch nicht sagen. Vielleicht sollte man den Support zu der Diskrepanz App/Cloud informieren.
    Um in der App k0rrekte Werte beim Zaehler zu haben einfach die 1 mit 0.5 ersetzen, dann sollte es wie in der Cloudversion aussehen. Du könntest den Code ja entsprechend anpassen mit der Funktion ninoxApp()
    Beispiel:
    let vZaehler := 0.5;
    if ninoxApp()="web" {or ninoxApp() = "ipad" etc.} then
    vZaehler := 1
    end;
    'Ausgewählt' := null;
    if Auswahl != null then
    let myStadtID := Auswahl;
    first(select 'Städte' where number(Nr) = myStadtID).(Zaehler := Zaehler + vZaehler);
    'Ausgewählt' := first(select 'Städte' where number(Nr) = myStadtID).Stadt;
    Auswahl := null
    end

    Hier solltest du wenn möglich prüfen, ob es in allen App-Versionen (Mac,Iphone, iPad, Android) diesen fehler gibt. Ansonsten musst du dann die erste If-Abfrage mit or einschränken.
    Bei 'Name des dynamischen Wertes' reicht Zaehler + " " + Stadt. Das *-1 ist hier nicht notwendig, da der Zähler ja positive Zahlen enthält.

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Danke an alle. Jetzt weiß ich wenigstens, das ich nicht spinne. Es scheint tatsächlich ein Fehler "im System" zu sein.

    Warum auch immer +0.5 funktioniert, wenn auch völlig unlogisch.

    Danke an alle Beteiligten.

    • CRo
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo,

    die Idee mit der Hitliste finde ich auch nicht schlecht! Man muss aber bedenken, dass Menschen gewohnheitstiere sind und eine Sortierung nach Hitlist dann die Liste immer unterschiedlich sortieren wird. Am Laptop nicht so schlimm, da man das Ergebnis mit den ersten Buchstaben eingrenzen kann. bei Nutzung von Smartphone schon nicht mehr so praktisch, da man die Tastatur benötigt.

    Ich würde zwei dynamische Felder einfügen.

    Eines mit der gesamten Liste (fullList), sortiert nach Alphabet und eines, welches 5 Ergebnisse mit dem höchsten bzw. niedrigsten Zähler ausgibt (topList).

    Die Auswahl des fullList wird gefüllt von dem Wert aus der Top-List Auswahl....

    Hab da mal ein Beispiel erstellt: https://www.dropbox.com/s/28c8qlooya72ila/Staedte_Test.ninox?dl=0

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen
    • CRo
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Bitte mal mit Chrome versuchen. Safari öffnet die Seite bei mir auch nicht, Chrome und Firefox aber schon.

    • Peter_Gaede.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Bei mir funktioniert der Link in Safari.

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ja, der download funktioniert. Die Datei wird aber in NINOX nicht geöffnet und findet sich auch nicht in der Datenbankauflistung. Das hatte ich noch nie.

    • CRo
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich habe die Datenbank als Archiv gesichert. Gibt es hier noch eine andere Möglichkeit?

    Hier mal mein Weg schriftlich...

    Ich habe eine Tabelle Städte, mit den Spallten: Name, Zähler

    und eine Tabelle Besuche, mit den Spalten: Top5Stadt , Stadt

    - Top5Stadt (Dynamisches Auswahlfeld einzeln):

    ### Dynamic Values -> Hier werden die 5 meist verwendeten selekiert

    let counter := 5;
    let topCities := ((select 'Städte' where Stadt != null) order by 'Zähler');
    let myTopCities := slice(topCities, 0, counter);
    myTopCities

    ###

    - Stadt (Dynamisches Auswahlfeld einzeln) -> Alle Städte sortiert nach Stadtname

    ###

    (select 'Städte' where Stadt != null) order by Stadt

    ###

     

    In der Tabelle Besuche auf Tabellen-Ebene nach Änderung schreibe ich die Auswahl von Top5Stadt in Stadt um Stadt als mein reguläres Feld zu nutzen.

    ###

    let myVisit := this.Stadt;
    let counter := cnt(select Besuche where Stadt = number(myVisit));
    let myCity := first(select 'Städte' where Nr = number(myVisit));
    let ascCounter := 0 - number(counter);
    myCity.('Zähler' := ascCounter)

    ###

    Die Scripte natürlich ohne die ###!

    • Holzi
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo CRo,

    das ist ja superfreundlich. Vielen Dank.

    Archiv ist richtig, woran es liegt, keine Ahnung.

    Noch eine schönes Wochenende.