8

Konvertieren von Page <-> Tabelle

  hat wieder einmal ein kleines Script-Meisterwerk abgeliefert, welches eine Page in eine Tabelle oder eine Tabelle in eine Page konvertieren kann.
Einfach in der entsprechenden Tabelle einen Button erstellen und den nachfolgenden Code dort rein kopieren.
Zusätzlich müsst ihr noch euren Ninox-API-Key anstelle von "YOUR-API-KEY-FOR-THIS-ACCOUNT" einfügen.

Und die Transformation sollte damit gelingen.

Beachtet bitte, dass bei einer Tabellenumwandlung zu einer Page die überschüssigen Records gelöscht werden, so dass nur ein Record in der Page enthalten ist.

"
//* This script is added to a butoon.
When clicked, the type of the table or page is checked and a dialog suggests to change the type
";
let me := this;
let apiKey := "YOUR-API-KEY-FOR-THIS-ACCOUNT";
"
    //* Determine if the database is located in a public cloud or in a private cloud
";
let host := first(split(urlOf(this), "#"));
let api := if host = "https://app.ninox.com/" then
        "https://api.ninox.com/v1"
    else
        host + "v1"
    end;
"
    //*Set base api url
";
api := ---
{ api }/teams/{ teamId() }/databases/{ databaseId() }
    ---;
"
//*Set headers for all API calls
";
let headers := {
        Authorization: "Bearer " + apiKey,
        'Content-type': "application/json"
    };
"
//*Check the database schema
";
let kindResponse := do as server
        http("GET", api + "/schema", headers, {})
    end;
"
//* Check if the query returns a database schema
";
if not kindResponse.result.version then
    alert(kindResponse)
else
    let myKind := item(kindResponse.result.types, tableId(this)).kind;
    let tId := tableId(me);
    "
//* Set dialog in case the properties cannot be determined
    ";
    let dialogHeader := "Table Properties";
    let dialogBody := "This cloud version does not support pages.
Please update your Cloud to the latest version.";
    let dialogButtons := ["Cancel"];
    "
//* Check the Type (page or table)
    ";
    switch myKind do
    case "page":
        (
            dialogBody := "This is a page";
            dialogButtons := ["Convert to a table", "Cancel"];
            let d := dialog(dialogHeader, dialogBody, dialogButtons);
            if d = first(dialogButtons) then
                "
    //* Prepare the body for the PATH conversion
";
                let body := {
                        types: {}
                    };
                setItem(body.types, tableId(this), {
                    kind: "table"
                });
                let patchResponse := do as server
                        http("PATCH", api + "/schema", headers, body)
                    end;
                if formatJSON(patchResponse.result) = "{}" then
                    alert("The conversion to the table was successfully performed!")
                else
                    alert(patchResponse)
                end
            end
        )
    case "table":
        (
            dialogBody := "This is a Table.
A page contains only one record.
If the table has multiple records, they will be deleted.";
            dialogButtons := ["Convert to a page", "Cancel"];
            let d := dialog(dialogHeader, dialogBody, dialogButtons);
            if d = first(dialogButtons) then
                "
            //*    Check number of Records
                ";
                let myPerPage := 1000;
                let myPage := 0;
                let myNumberOfRecords := myPerPage;
                let myRecordsArray := [0];
                myRecordsArray := null;
                while myNumberOfRecords = myPerPage do
                    let response := do as server
                            http("GET", url(api + "/tables/" + tableId(this) + "/records", {
                                perPage: myPerPage,
                                page: myPage
                            }), headers, {})
                        end;
                    myNumberOfRecords := cnt(response.result);
                    if myNumberOfRecords = myPerPage then
                        myPage := myPage + 1
                    end;
                    for i in response.result do
                        myRecordsArray := array(myRecordsArray, [number(i.id)])
                    end
                end
;
                "
//* Check if there is a record with id = 1 (is mandatory for Page)
                ";
                if not contains(myRecordsArray, 1) then
                    "
//* create a record with id=1
                    ";
                    let upsertResponse := do as server
                            http("POST", api + "/tables/" + tableId(this) + "/records", headers, {
                                _upsert: true,
                                _id: 1
                            })
                        end;
                    if upsertResponse.result.number(_id) != 1 then
                        alert(upsertResponse)
                    end
                end;
"
//* create an  with id=1
                    ";
                let delArray := for i in myRecordsArray do
                        if i != 1 then i end
                    end;
                let deleteResponse := do as server
                        http("DELETE", api + "/tables/" + tableId(this) + "/records", headers, delArray)
                    end;
                let body := {
                        types: {}
                    };
                setItem(body.types, tableId(this), {
                    kind: "page"
                });
                let patchResponse := do as server
                        http("PATCH", api + "/schema", headers, body)
                    end;
                void
            end
        )
    default:
        dialog(dialogHeader, dialogBody, dialogButtons)
    end
end

23 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Klasse! Das erleichtert die Umwandung bestehender Dashboards in Pages ungemein.

    • UweG
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Ich habe jetzt das Script von Leo in eine Ninox-DB verpackt, mit der man extern Tabellen/Pages umwandeln kann.
    Man gibt den Cloudnamen (api.ninox.com oder seine private Cloud) und den Ninox-API Key ein und kann sich entweder über die jeweiligen ID's oder die Klarnamen von Team/Datenbank/Tabelle die Transformation vorbereiten.
    In diesem Zuge wird einem dann angezeigt, ob die betreffende Tabelle eine Page oder Tabelle ist.
    Mit dem Convert-Button wird dann die jeweilige Transformation gestartet.
    Man kann so für jede zu konverierende Tabelle einen eigenen Record anlegen und jederzeit darauf zurück greifen.

    Ich habe versucht die DB so einfach wie möglich zu gestalten.
    Natürlich ist der oben beschriebene Weg (copy/paste) weiterhin eine Möglichkeit die Transformation durchzuführen.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Jetzt fehlt nur noch ein Script, das automatisch sämtliche Datenbanken durchforstet und selbständig alle tabellenbasierten Dashboards in Pages umwandelt.😉

      Im Ernst: Großer Dank an Leo für das Script und an dich für die schöne Aufbereitung!

    • Ryszard_Paluch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo Uwe

    Beim öffnen der DB bekomme ich folgernde Meldung:

      • Customer Support Ninox
      • uwe_groegor
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Hallo Ryszard.
      Danke für die Info.
      Ich habe die dB nur auf der private Cloud getestet.
      Ich habe es jetzt so angepasst, dass die DB auf beiden Systemen funktioniert.
      Sie ist im Ursprungskommentar durch die Version1-2 ersetzt worden.
      Wenn du sie nochmal herunter lädst, sollte es eigentlich funktionieren.

    • Torsten_Stang.1
    • vor 1 Jahr
    • Gemeldet - anzeigen

    ich hab mich mit den Pages ob des langsamen Update-Rollouts für die App noch nicht beschäftigt.

    In meinen Dashboards habe ich jedem User einen Record zugedacht, weil dort jeweils z.B. auf Suchfelder basierende Ansichten enthalten sind. So hat keine Eingabe von User A keinen Impact auf das Dashboard von User B - wie verhalten sich Pages dahingehend?

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Torsten Stang 
      Pages sind nur Tabellen mit einem einzelnen Record.
      Wenn man die Transformation auf eine Tabelle mit mehreren Records anwendet, werden alle enthaltenen Records gelöscht, bis auf den mit der ID 1.
      Wenn auch kein Record mit der ID 1 vorhanden ist, wird ein neuer Record mit der ID 1 erstellt.
      Wenn man, wie du ein Dashboard mit mehreren Records erstellt hat, ist von einer Transformation abzuraten.

      Wobei man solch ein Scenario wohl auch über die Zuweisungs-Einstellung der Felder hinbekommen kann.

      • Torsten_Stang.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Danke für die Rückmeldung - damit hat man für mich (und ich bin mir sicher, nicht nur für mich) mit Pages als Ersatz für Dashboards das Thema mehr als verfehlt.

      Das einzige für PublicCloud-Nutzer, die für Enterprise zu klein sind, nutzbare Feature ist damit auch hinfällig. 🤯

      • Icarus_Ralf_Becker
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Ich möchte mich natürlich bei Leo und Uwe bedanken, die durch das Skript und die DB Pages für Bestandstabellen nutzbar machen. Gleichwohl bin ich vollends bei Torsten. Ninox hat hier beim Feature-Design völlig daneben gelegen. Das Ziel, ein User-Interface bei Bedarf zu cleanen, wurde zwar erreicht, aber gefühlt auf dem denkbar kompliziertesten Weg und mit einigen Einschränkungen. Ein simpler, zusätzlicher Checkhook in den Tabellenoptionen, der dann plattformseitig einfach Navigationselemente und sonstiges ausblendet, wäre die beste Lösung gewesen. Keine Ahnung, warum es so nicht gemacht wurde. Aber so hätte man jede beliebige Tabelle mit einem Klick in eine Page umwandeln können und maximale Flexibilität gewährleistet. Mein Vorschlag wurde im Übrigen als Feature Request seitens Ninox bewertet. 😉

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       , 

      Nur der Ausgewogenheit halber ... ;)

      Die Pages sind sicher nicht der große Wurf und kein Ersatz für eine generelle Möglichkeit zum Ausblenden der Standard-Schaltflächen in Daten-Formularen. Dieser Wunsch besteht natürlich auch bei mir nach wie vor.

      Aber für sich(!) genommen empfinde ich die Pages schon als nützliches Feature. Man kann mit ihnen auf einfache Weise das machen, was bisher nur mit CSS-Hacks und einer neuen Ansicht vom Typ "Formular" möglich war: Einfache Dashboards ohne Navigation, in denen keine weiteren Datensätze erstellt werden können, nicht mal versehentlich. Denn genau das war nach meiner Erfahrung bisher das Problem.

      Ich werde die Pages zukünftig aber nicht nur für klassische Dashboards als Startseite der Datenbank nutzen, sondern auch für Sammelseiten, denen ich andere, sachlich zusammengehörige Tabellen unterordne (Einstellungen, Betriebsdaten u. ä., siehe https://forum.ninox.de/t/35yqgx0).

      Und dank Leos Script und Uwes Datenbank werde ich versuchen, das eine oder andere vorhandene Dashboard umzubauen (sobald man wieder manuelle Backups machen kann ...).

    • Torsten_Stang.1
    • vor 1 Jahr
    • Gemeldet - anzeigen
     said:
    Aber für sich(!) genommen empfinde ich die Pages schon als nützliches Feature. Man kann mit ihnen auf einfache Weise das machen, was bisher nur mit CSS-Hacks und einer neuen Ansicht vom Typ "Formular" möglich war: Einfache Dashboards ohne Navigation, in denen keine weiteren Datensätze erstellt werden können, nicht mal versehentlich. Denn genau das war nach meiner Erfahrung bisher das Problem.

     Gerade das, was Du hier beschreibst, ist IMHO mit Ninox-Bordmitteln recht einfach umzusetzen.

    Aber Dashboards enthalten meiner Meinung nach insbesondere individuelle Elemente (z.B. Tabellenansichten mit Filteroptionen & Co.) - die Pages wurden als vollwertiger Ersatz annonciert, sind dies aber de facto nicht, da hilft kein Schönreden und keine Ausgewogenheit was....

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
     said:
    Gerade das, was Du hier beschreibst, ist IMHO mit Ninox-Bordmitteln recht einfach umzusetzen.

    Wie denn? Ich habe schon viele Dashboards gebaut. Und für nahezu alle hätte ich sehr gerne Pages genutzt, wenn es die schon gegeben hätte.

    Für MICH haben Pages also durchaus einen Nutzen. Der Wunsch nach individuellen Einstellmöglichkeiten für Tabellen steht auf einem ganz anderen Blatt und bleibt davon unberührt.

    Klar, wenn ich mir ein Auto wünsche und nur ein Fahrrad bekomme, dann ist das erst mal enttäuschend. Es ändert aber nichts am praktischen Nutzen des Fahrrads, der manchen Bedarf zumindest teilweise deckt. Jedenfalls besser als zu Fuß. Auto kann ich mir ja weiter wünschen - und später beides nutzen.

      • Torsten_Stang.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Das Erstellen von Datensätzen kann ich in den Tabelleneigenschaften unterbinden, jedem User einen eigenen Datensatz spendieren kann ich über ein simples Startskript.

       

      Wenn ich bei Deiner Analogie bleibe: Ich hatte bereits ein (selbst zusammengeschweißtes) Fahrrad, mir wurde ein Auto vor die Tür gestellt. Bei dem Auto ist aber leider das Lenkrad eingeschlagen fixiert, so dass ich damit nur im Kreis fahren kann. Da bleib ich lieber beim Fahrrad... 

      • Michi.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       bei mir ist es genau so wie bei dir beschrieben, da man ja im Dashboard auch was machen möchte. Daher bekommt jeder Mitarbeiter bei mir 2 records (Dashboard für 2 Mac's) von denen alles gesteuert wird. Neue records erstellen ist unterbunden. So gibt es keine sichtbaren Tabellen welche nur verwirrend sind.

      Die Seiten wären für Teamfähigkeit super, geht aber eben nicht bei der Voraussetzung. Also bleibt es bei den CSS Hacks wenn man alles clean haben will.

      Den richtigen Mehrwert von dem mittlerweile 4 nachgeschoben Update kann ich nicht erkennen. Ich kann nur sagen das seit dem die Performance gefühlt leidet. Bzw. Die suche nach dem gerade funktionierenden Browser nervt. 

      Was wurde den in welchem Update gefixt? Es gibt einfach keine Infos. Das ist traurig.

       

      Nichts desto trotz danke für deine mühen und immer tollen Lösungen Leo

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Okay, ich fasse abschließend mal zusammen ...

      Arbeitsschritte Dashboard bis Version 3.9:

      • Rechtekonzept überlegen.
      • Nutzern entsprechende Rollen vergeben.
      • Berechtigungen für "Neu" und "Löschen" in der Tabelle setzen.
      • Neue Ansicht von Typ "Formular" erstellen.
      • Standardansicht entfernen.
      • CSS-Formel zum Ausblenden aller Schaltflächen einfügen.
      • Ggf. Startskript erstellen.

      Arbeitsschritte Dashboard ab Version 3.10:

      • Page erstellen

      Das Gute: Man kann jetzt wählen, welchen Weg man nimmt. Aber der Vorteil des zweiten erscheint mir offensichtlich. Auch wenn er nicht für jede spezielle Bedarfssituation ans Ziel führt.

      Dem dringenden Wunsch nach individuellen Tabellen-Einstellungen schließe ich mich ungeachtet dessen an (weil es die Benutzerführung an vielen Stellen erleichtern würde, nicht nur bei komplexeren Dashboards).

      • Torsten_Stang.1
      • vor 1 Jahr
      • Gemeldet - anzeigen

       ich zitiere mal die Release-Ankündigung:

      👉 Seiten

      Mit Seiten können vollwertige Applikationsoberflächen und Dashboards erstellt werden. Da sie frei von Standard-Navigationselementen sind, haben Ninox-Entwickler mehr Kontrolle über die Benutzerführung.

      Ich denke wir sind uns einig, dass mit Pages eine Applikationsoberfläche nicht realisierbar ist, denn die beinhaltet definitiv User-individuelle Elemente (zumindest Eingabemöglichkeiten). Ich kann ja einem User (mittels Schaltern) noch nicht mal überlassen welche Elemente er zu sehen bekommt - da seine Auswahl automatisch für jeden anderen gilt...

      Bei aller Liebe, ich verstehe nach wie vor nicht, warum die Pages hier so als den großen Wurf gefeiert und verteidigt werden...

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
     said:
    Ich denke wir sind uns einig, dass mit Pages eine Applikationsoberfläche nicht realisierbar ist,

     Absolut. Das ist ein bisschen dick aufgetragen.

     said:
    Bei aller Liebe, ich verstehe nach wie vor nicht, warum die Pages hier so als den großen Wurf gefeiert und verteidigt werden...

    Ich habe oben ausdrücklich gesagt, dass die Pages m. E. eben NICHT der große Wurf sind - man ihnen deshalb aber auch nicht generell jeglichen Nutzen absprechen sollte (siehe Analogie Auto vs. Fahrrad). Sie sind de facto eine komfortable Möglichkeit, schnell und einfach Dashboards zu erstellen. Nicht mehr, aber auch nicht weniger.

    Ich denke, das Problem ist der Vergleich. Gemessen an dem großen Wunsch nach individuellen Einstellmöglichkeiten erscheinen die Pages relativ nutzlos. Für sich bewertet sind sie für viele User aber ein nützliches, neues Feature. Das wollte ich bei all der Kritik nur herausstellen.

    Lass uns die Pages als nettes, eigenständiges No-Code-Feature abhaken und gemeinsam weiter nach der "großen" Lösung bohren.😉

    • Torsten_Stang.1
    • vor 1 Jahr
    • Gemeldet - anzeigen
     said:
    Lass uns die Pages als nettes, eigenständiges No-Code-Feature abhaken

     ... das einzige Feature, was einem Mini-User, der "nur" 1,2k€ per anno bei Ninox lässt, bei den

    "[...] spannenden Möglichkeiten, die Ninox 3.10 mit sich bringt. [...]"

    übrigbleibt ...

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

       Da bin ich bei dir. Um die Aufwertung der Public-Accounts scheint man sich nicht sehr zu bemühen. Funktional hat sich da wenig getan in letzter Zeit. Vielleicht kann ich mich auch deshalb schon über Kleinigkeiten freuen. 😉

    • Customer Support Ninox
    • uwe_groegor
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Datenbank wurde aktualisiert.

    • Icarus_Ralf_Becker
    • vor 1 Jahr
    • Gemeldet - anzeigen

     ich habe gerade in der Datenbank festgestellt, dass die Suchfunktion nach Teams und Tabellen nur etwa die Hälfte aller Treffer auch anzeigt. Von 15 Teams werden mir 8 angezeigt. Von etwas über 100 Tabellen werden mir nur 56 aufgelistet. Kannst du das bitte mal prüfen? Vielen Dank vorab.

      • UweG
      • vor 1 Jahr
      • Gemeldet - anzeigen

       

      Hallo Ralf
      Wenn man über die ID's sucht,Manchmal findet er beim ersten Klick manchmal nicht alle Teams/Tabellen.
      Da hilft es ein weiteres mal den Button zu betätigen.

      Wenn man aber die Namen von Team/Databse und Table kennt, kann man über die Eingabe per Namen direkt auf die entsprechende Tabelle zugreifen.

      • Icarus_Ralf_Becker
      • vor 1 Jahr
      • Gemeldet - anzeigen

       wiederholtes Button-Klicken bringt leider gar nix. Ein Großteil meiner Teams und Tabellen werden in der Suche nicht angezeigt. Aber wie du schon sagst, es ist kein ShowStopper. Über die IDs geht es reibungslos. Der Hinweis ist nur "Schmuck am Nachthemd" für die ID-Suche ;-)