0

Erstellung einer Rangliste - Brauche Hilfe

Hallo, ich bin hier ziemlich neu und nicht besonders bewandert mit den "speziellen" Möglichkeiten von Ninox. Vielleicht kann mir jemand helfen.

Ich habe ein Tabelle mit Umsätzen einzelner Vermittler. In meinem Dashboard möchte ich eine Rangliste erstellen. Diese soll nicht Umsatz sortiert sein, sondern nach der Anzahl der Verträge. Ich denke, dass der ein oder andere von euch eine weitaus elegantere Lösung hat, als die unten stehende. Das einzige, was bei mir bisher funktioniert ist folgendes, wobei die Umwandlung in ein Array von JSON-Objekten nur dazu dient, das Array zu sortieren:

    let ArrResult := [""];
    let Selection := (select XY order by Agent);
    let Agent := first(Selection).Agent;
    let Counter := 0;
    for Record in Selection do
        if Record.Agent = Agent then
            Counter := Counter + 1;
        else
            let Arr := ["{ ""agent"":""" + Agent + """, ""counter"":" + Counter + """}"];
            ArrResult := array(ArrResult, Arr);
            Agent := Record.Agent;
            Counter := 1
        end
    end;
    let ArrJSON := for i from 0 to cnt(ArrResult) do
            parseJSON(item(ArrResult, i))
        end;
    let List := for Item in ArrJSON order by number(counter) * -1 do
            [Item.agent + " | " + Item.company + " | (" + Item.counter + ")"]
        end;
    join(List, "
")
 

9 Antworten

null
    • mirko3
    • vor 9 Tagen
    • Gemeldet - anzeigen

    Hallo Thorsten. Die Idee über ein JSON object zu gehen ist clever. Falls du die Anzahl der Verträge über die Häufigkeit der Agents in der Tabelle bestimmst, sollte es auch so gehen. 1. das nicht ausgerichtete join() 2. ausgerichtete, simple html-Tabelle. Mirko

    let uniqueName := unique((select xy).Agent);
    let result := (for i in uniqueName do
            {
                name: i,
                count: cnt(select xy where Agent = i)
            }
        end order by -number(count));
    join(for j in result do
        j.name + " " + j.count
    end, "
    ");
    
    let uniqueName := unique((select xy).Agent);
    let result := (for i in uniqueName do
            {
                name: i,
                count: cnt(select xy where Agent = i)
            }
        end order by -number(count));
    html(---
    <table>{ for j in result do }
    <tr><td>{ j.name }</td><tdt>{ j.count }</td></tr>{ end }
    </table>
    ---)
    
      • Thorsten_S
      • vor 8 Tagen
      • Gemeldet - anzeigen

        Vielen Dank, Mirko, dass du dich mit meinem Problem beschäftigst. Genau deinem Ansatz bin ich zuerst auch gefolgt und war sehr zufrieden mit der Lösung...bis ich mir die Performance im Web angesehen habe. Die select-Anweisung ist in Wirklichkeit etwas komplexer und die Performance in einer Schleife eher nicht zu empfehlen.... Das man an die Schleife gleich eine "order"-Anweisung setzen kann, war mir neu, Danke für den Tipp!

      Einen kleinen Wermutstropfen hat das Ganze. ich habe noch einen Schalter eingebaut, der ungefähr folgendes bewirkt:

      if Schalter = 1 then  let List ..... order by Agen else  let List....order by Counter end

      join(List...)

      Das funktioniert leider nicht wirklich. Das berechnete Feld weist falsche Einträge auf, die sich erst mit Klicken auf jeden einzelnen Eintrag im berechneten!!! Feld zum richtigen Wert ändern lassen. Ist ein bisschen spooky ;-) Die einzige Lösung, die ich gefunden habe, ist mit zwei Feldern zu arbeiten, die ich nach Bedarf ein- oder ausblende...

      Nochmals vielen Dank, für deinen Einsatz. Bin eigentlich Gesellschafter einer kleinen Firma, die nichts mit EDV am Hut hat, das versuche ich in meiner Freizeit zu ändern, ist ein bisschen wie puzzlen :-) 

      • mirko3
      • vor 8 Tagen
      • Gemeldet - anzeigen

      Wenn du möchtest, dann lade hier eine DB mit den nötigsten Tabellen und ein paar Dummyeinträgen und Bemerkungen, welche Felder einbezogen werden hoch und ich schaue mir das an. Mir ist es sonst zu abstrakt für eine effektive Hilfe. Mirko

      • Thorsten_S
      • vor 8 Tagen
      • Gemeldet - anzeigen

       deine Idee mit dem HTML hat mich angefixt, aber ich bekomme es nicht hin

          'Rich-Text' := html(---
      <table>{ for j in ArrJSON do }
      <tr><td>{ j.Agent }</td><tdt>{ j.Counter }</td></tr>{ end }
      </table>
              ---)

      was mache ich falsch?

      • mirko3
      • vor 8 Tagen
      • Gemeldet - anzeigen

      Für mich nicht erklärbar ohne weitere Informationen zu DB, Feldern, restlichem Script. Nachgestellte DB, Anzeige im Funktionsfeld und Eintrag über Button in Richt-Text Feld bei mir so:

    • Thorsten_S
    • vor 8 Tagen
    • Gemeldet - anzeigen

    irgendetwas mache ich falsch :-( (Danke für deine Geduld)

    let ArrJSON := [{
                name: "Tom",
                umsatz: 3
            }, {
                name: "Bill",
                umsatz: 2
            }, {
                name: "Thea",
                umsatz: 1
            }];
    rt := html(---
    <table>{ for j in ArrJSON do }
    <tr><td>{ j.name }</td><tdt>{ j.umsatz }</td></tr>{ end }
    </table>
        ---)

    • Thorsten_S
    • vor 8 Tagen
    • Gemeldet - anzeigen

    Aua! ein tag ist falsch! Da steht <tdt> statt <td>!

    • Thorsten_S
    • vor 8 Tagen
    • Gemeldet - anzeigen

    nochmals vielen Dank! Jetzt habe ich dies schönste Liste ever und viel gelernt. die "---" in html habe ich bisher noch in keiner Dokumentation gefunden, aber ich verstehe jetzt den Aufbau...

      • mirko3
      • vor 8 Tagen
      • Gemeldet - anzeigen

      cool. 👍