0

Funktions- und Sprachreferenz

Hallo, ich habe zwei Frage:

1) Ich würde gerne zu einer bestehenden Uhrzeit eine gewisse Anzahl Stunden und Minuten addieren. Leider schaffe ich das nur indem ich zwei Datenfelder von Typ Uhrzeit addiere, aber ich hätte erwartet, dass man auch z.B. Begin := Begin + "07:00" oder wie auch immer angeben kann. Ich habe schon alle möglichen Varianten probiert, komme aber nicht auf eine Lösung. Ist es überhaupt möglich Zeiten auf diese Weise zu addieren?

2) es gibt bei Rechnen die Funktion Prozent %, allerdings finde ich dazu keine Beschreibung und bekomme auch keine sinnvollen Werte raus. Wo finde ich dazu eine Erklärung/Beispiel?

Noch zwei Anregungen:
- generell fände ich es gut, wenn einzelnen Funktionen durchgehend mit ein oder zwei aussagekräftigen Beispielen beschrieben wären, das würde viel Zeit ersparen.

- will man eine Funktion als Text eingeben, werden im Editor zwar Zeilennummern angezeigt, aber leider keine Spaltennummern. Die Fehlerhinweise erscheinen aber mit Spaltennummer! Dann beginnt das fleissige Zählen....

Besten Dank Klaus

493 Antworten

null
    • Alexander_Koenig
    • vor 9 Jahren
    • Gemeldet - anzeigen
    Hallo Klaus,

    1) Man kann, Uhrzeiten in Millisekunden umrechnen. Addiere Millisekunden zu der Startzeit um die gewünschte Endzeit zu erhalten. Bei 7:00 Std. wäre das: 7*60*60*1000 = 25200000.
    2) Das % Zeichen im Formeleditor steht für Modulo, das bei Division immer den Restwert ausgibt. Kommt aus der Informatik und hat nichts mit Prozent zu tun. Zur Prozentrechnung mit 0.07 für 7% rechnen.

    Die Spaltennummer im Editor anzuzeigen nehmen wir mit auf die Anforderungsliste.

    Viele Grüße, Alex
    • Klaus
    • vor 9 Jahren
    • Gemeldet - anzeigen
    Hallo Alex,

    danke für die Antwort.
    Modulo kenne ich und hätte eher mod erwartet. Leider habe ich keine Beschreibung gefunden und es steht direkt neben den Grundrechenarten, da kommt man eher auf % als auf Modulo.

    Leider funktioniert das addieren der Uhrzeit bei mir nicht, wo ist mein Denkfehler?
    Bspl.:
    Ende := Begin + Soll (funktioniert bei mir, alle Datentypen Uhrzeit)
    allerdings: Ende := Begin + 25200000 oder Ende := Beginn + (7*60*60*1000) funktioniert nicht.

    Hast du vielleicht ein kleines Beispiel....

    Vielen Danke für eure Hilfestellung
    Klaus
    • Alexander_Koenig
    • vor 9 Jahren
    • Gemeldet - anzeigen
    Hallo Klaus, mod werden wir anpassen.

    Es geht wenn du Beginn erst in Zahl umwandelst.
    Ende := number(Begin) + 25200000

    Viele Grüße,

    Alex
    • ThorsProvoni
    • vor 9 Jahren
    • Gemeldet - anzeigen
    Gibt es schon ein Beispiel mit der Funktion unique() ?
    • Alexander_Koenig
    • vor 9 Jahren
    • Gemeldet - anzeigen
    Hallo, wir haben das Beispiel hier im Forum:
    concat(unique(Tabelle.Feld))
    Hiermit wird jeder wert nur einmal aufgelistet.
    Viele Grüße,
    Alex
    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo ich würde gerne in meinem Adressbuch ein Feld generieren in dem die Anschrift angezeigt wird so wie es später in dem Brieffenster ausgegeben wird.

    Würde mich auch über mehr Tutorials freuen insbesondere für Funktion und Sprachreferenzen.
    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 8 Jahren
    • Gemeldet - anzeigen
    hab es leider bisher nur ohne Zeilenumbruch hinbekommen.

    Also es sollte schon so ausschauen

    Max Mustermann
    Musterstrasse 10
    50467 Musterhausen
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo, die Formelfelder sind im Moment noch einzeilig. Wir haben das aber auf der Anforderungsliste und werden auch die Möglichkeit mehrzeiliger Formelfelder einrichten. Wir können aber noch nicht genau sagen wann dies implementiert wird. VG, Alex
    • Hans_Wurst
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo!

    Ich bin neu hier und habe mich bisher nur flüchtig eingelesen. Vor diesem Hintergrund bin ich für alle RTFM Hinweise dankbar ;-)

    Trotz Durchsicht des "Extending Ninox with NX" Tutorials konnte ich bisher keine Antwort zu mein Problem finden...

    In einer Tabelle erfasse ich diverse Ereignisse denen jeweils ein Datum zugeordnet ist. Ich möchte nun die Anzahl der Tage zwischen den Ereignissen des jeweils selben Typs als Formel ermitteln.

    Die Tabelle könnte also wie folgt aussehen:

    1) 01.01.2016 Kino
    2) 02.01.2016 Theater
    3) 05.01.2016 Schwimmen
    4) 06.01.2016 Kino
    5) 06.01.2016 Schwimmen
    6) 08.01.2016 Schwimmen

    1)-3) bleibt leer, das waren ja jeweils die ersten Ereignisse des jeweiligen Types
    4) vom 06.01. sollte dann "5" ergeben weil der letzt Eintrag zu "Kino" vom 01.01. stammt
    5) vom 06.01. ergibt "1" weil das letzte Schwimmen davor am 05.01. war
    8) ist "2"

    usw.

    Das heisst, war mir im Moment noch fehlt ist das Verständnis wie ich per Formel auf Einträge in der selben Tabelle zugreifen kann (mit entsprechenden Filtern). Irgendwie im Sinne von "max(tabelle.datum) WHERE tabelle.datum < datum AND Tabelle.typ = typ". "max()" liefert schon das neuste Datum, bezieht aber den aktuellen Datensatz mit ein und ob/wie ich da nach einem Typ filtern kann konnte ich auch nirgends finden.

    Ich befürchte, dass ich das (noch) nicht kann?

    Vielen Dank im Voraus!
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Hans,

    legen Sie zunächst ein neues Datum-Feld an, für das letzte Datum(Datum2).

    Wir nehmen an, dass das Feld für Kino, Theater usw. ein Auswahlfeld ('Aktivität') ist. Richten Sie einen Trigger auf dem Feld ein. D.h. nach Auswahl wird der Trigger ausgelöst.

    let z := 'Aktivität';
    Datum2 := last((select Arbeitszeit where 'Aktivität' = z).Datum)


    Aus den beiden Daten können nun in einer Formel (Datum - Datum2) die dazwischen liegenden Tage ermittelt werden.

    VG, Alex
    • Hans_Wurst
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Alex!

    Super, vielen Dank für die schnelle Hilfe! Meine Beschreibung war etwas vereinfacht aber mit Hilfe Deiner Anleitung bin ich schon ziemlich nahe an dem gewünschten Verhalten.

    Die 'Aktivität' ist kein Auswahlfeld sondern eine Verknüpfung zu einer eigenen Tabelle in der die unterschiedlichen Arten von Aktivitäten hinterlegt sind. In Abwandlung Deiner Anleitung habe ich also einen Trigger zu der Verknüpfung hinzugefügt. Sobald ich dann einen neuen Eintrag im 'Tagebuch' erstelle, wähle ich als erstes die 'Aktivität' und schon wird das Datum der letzten identischen 'Aktivität' ermittelt und dann entsprechend per "days(zuletzt, aktuell)" die Differenz gebildet.

    Nochmals vielen Dank!

    Ich vermute, dass diese Lösung nur dann wirklich funktioniert, wenn die Aktivitäten chronologisch erfasst werden.

    Beim Testen bin ich in der Mac App daran hängen geblieben, dass eine Verknüpfung anscheinend nachträglich nicht mehr geändert werden kann, ist das richtig?

    Wird ein neuer 'Tagebuch' Datensatz erstellt, ist das entsprechende Feld leer und ein Klick darauf lässt mich aus den 'Aktivität' Datensätzen wählen. Sobald aber die Verknüpfung erstmalig hergestellt wurde, führt ein weiterer Klick auf diese lediglich zur Anzeige der Details des Verknüpften Datensatzes. Ich konnte keine Möglichkeit finden die Verknüpfung zu löschen und eine neue Verknüpfung zu erstellen.

    Matthias (aka Hans)
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Mathias,
    man kann Verknüpfungen aufheben. Klicken SIe hierzu nach Öffnen der Verknüpfung oben rechts auf den Menu Button. Wählen Sie hier "Verknüpfung aufheben". Sie können den Datensatz jetzt neu verknüpfen.
    Schauen Sie sich die Vorlage "Zählerstände" hier im Forum an. Die funktioniert ähnlich Ihrer Beschreibung.
    VG, Alex
    • Hans_Wurst
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Und wieder ein Schritt näher ;-) Jetzt habe ich dem "select ... where ..." noch ein "let a := aktuell;" vorangestellt und die Abfrage per "...and aktuell < a" verfeinert um Einträge aus der Zukunft zu ignorieren. Damit lassen sich dann auch nachträglich Aktivitäten erfassen und die Berechnung stimmt trotzdem.

    Bleibt nur noch das komische Verhalten bzgl. der Verknüpfung,. Ich kann nicht glauben dass diese Auswahl nur einmalig getroffen werden kann.

    Ich bin ja noch ganz frisch hier, das wird schon noch!
    • Hans_Wurst
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Wunderbar, klappt! Vielleicht könnte in einer zukünftigen Version der zusätzliche Schritt durch ein Alt-Klick oder Ctrl-Klick umgangen werden um gleich die Auswahl zu erhalten?

    Ich bin begeistert, vor allem vor der sehr, sehr schnellen Reaktion!

    Vielen Dank!
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo,
    Ich habe for Monaten auch nach "Mehrzeiligkeit" gesucht und rausgefunden, dass "Text (formatiert)" auch HTML Tags versteht. Mein Vorschlag für Dich.
    Textfelder "Name", "Adresse", "Ort" anlegen.
    Jetzt legst du einen Feld "Briefkopf" als Text(formatiert) an und schreibst ein Trigger auf Tabellenebene "Nach Änderungen folgendes Script ausführen":
    Briefkopf := Name+""+Adresse+""+Ort
    "" sorgt für einen Zeilenumbruch.
    Hier die Beispieldatenbank:

    https://www.dropbox.com/s/x5trnlbbpfpdfhd/Briefkopf.ninox?dl=0

    Jetzt eine Bitte an die Entwickler:

    In diesem Blog gibt es keine Benachrichtigungsfunktion für Nutzer. Da der Magicnetworks schon eine Antwort von Alexander bekommen hat, ist die Wahrscheinlichkeit, dass er meine Nachricht auch liest, ziemlich gering.
    Ist es möglich hier ein Forum mit e-mail-Benachrichtigungen einzurichten?

    Leo
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    leider sind in der Nachricht die Tags aus der Formel verschwunden. Wordpress interpretiert diese auch als Tags. Tag heißt "br" und muss mit "Kleiner""Grösser" umklammert werden. Am besten- Beispiel runterladen und dort die Formeln ansehen.
    Leo
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Hans Wurst,
    "Bleibt nur noch das komische Verhalten bzgl. der Verknüpfung,." - wie man Verknüpfungen wieder aufhebt hatte Alex doch beantwortet:
    - Klick auf das Feld öffnet den verknüpften Datensatz
    - Menü-Knopf rechts oben im Formular: Verknüpfung aufheben.
    Viele Grüße, Frank
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Ich frage mal unseren WordPress-Experten, ob das geht...
    Gruß, Frank
    • Hans_Wurst
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Danke Frank, ja, hat er! Da aber leider keine Notifizierung erfolgt wenn jemand eine Antwort postet, haben sich unsere Posts überlappt, ich hatte seine Antwort noch nicht gesehen...
    • Ninox Premiumpartner
    • Bastian_Vorholt
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hey vielen Dank Leo das bringt mich schonmal ein stück weiter.

    @ Alex: Allerdings würde ich mich auch über die Mehrzeilige Formelfunktion freuen.
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Guten Morgen,

    Gibt es eine Möglichkeit Kommentare in den Programmcode einzufügen?

    Gruß Leo
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Kommentare gibt es noch nicht.
    Viele Grüße, Frank
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo, gibt es bei Ninox eine Funktion wie char(Zahl)? Ich möchte mit Random() einen Passwortgenerator basteln. Dafür muss ich die Zahlen in Buchstaben umwandeln können.

    Gruß Leo
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Da auf die Frage ohne Antwort bleibt, gehe ich davon aus, dass die Zeichen über ASCI Tabelle nicht dargestellt werden können. Da die Aufgabe einen Passwortgenerator zu erstellen sich dadurch nicht eliminiert, möchte ich hier meine Lösung präsentieren. Vielleicht hilft es einem oder anderem:
    Die Aufgabe:
    Es sollte eine Benutzerliste erstellt werden und für jeden Benutzer ein Zufalls Passwort generiert werden. Passwort sollte 7 Zeichen erhalten. Erlaubt sind Zahlen, Groß- und Kleinbuchstaben.
    Die Lösung.
    1. Zufallsgenerator für Zahlen 1bis 3 erstellen(1 für Großbuchstaben, 2 für Kleinbuchstaben, 3 für Ziffern)

    let Z1 := floor(random() * 3 + 1)

    2. Zufallsgenerator für HTML Codes für jeden Zeichentype erstellen

    let Z1min := if Z1 = 1 then
    65
    else
    if Z1 = 2 then
    97
    else
    49;
    let Z1max := if Z1 = 1 then
    90
    else
    if Z1 = 2 then
    122
    else
    57;
    let ZZ1 := floor(random() * (Z1max - Z1min + 1)) + Z1min;

    3. Den Vorgang 8 mal wiederholen. Ich habe keine Schleifenfunktion gefunden, deswegen einfach Code mit Copy/Paste eingefügt und die Ziffern geändert.

    4. einen Datenfeld "Passwort" als "Text formatiert" anlegen
    5. eine Variable HT:="&#" anlehen
    6. alle ZZ Variablen zusammen mit HT in die Zeichenkette bei Passwort organisieren.
    7. Skript als Trigger auf Tabellenebene (bei neu) speichern.
    let Z1 := floor(random() * 3 + 1);
    let Z1min := if Z1 = 1 then
    65
    else
    if Z1 = 2 then
    97
    else
    49;
    let Z1max := if Z1 = 1 then
    90
    else
    if Z1 = 2 then
    122
    else
    57;
    let ZZ1 := floor(random() * (Z1max - Z1min + 1)) + Z1min;
    let Z2 := floor(random() * 3 + 1);
    let Z2min := if Z2 = 1 then
    65
    else
    if Z2 = 2 then
    97
    else
    49;
    let Z2max := if Z2 = 1 then
    90
    else
    if Z2 = 2 then
    122
    else
    57;
    let ZZ2 := floor(random() * (Z2max - Z2min + 1)) + Z2min;
    let Z3 := floor(random() * 3 + 1);
    let Z3min := if Z3 = 1 then
    65
    else
    if Z3 = 2 then
    97
    else
    49;
    let Z3max := if Z3 = 1 then
    90
    else
    if Z3 = 2 then
    122
    else
    57;
    let ZZ3 := floor(random() * (Z3max - Z3min + 1)) + Z3min;
    let Z4 := floor(random() * 3 + 1);
    let Z4min := if Z4 = 1 then
    65
    else
    if Z4 = 2 then
    97
    else
    49;
    let Z4max := if Z4 = 1 then
    90
    else
    if Z4 = 2 then
    122
    else
    57;
    let ZZ4 := floor(random() * (Z4max - Z4min + 1)) + Z4min;
    let Z5 := floor(random() * 3 + 1);
    let Z5min := if Z5 = 1 then
    65
    else
    if Z5 = 2 then
    97
    else
    49;
    let Z5max := if Z5 = 1 then
    90
    else
    if Z5 = 2 then
    122
    else
    57;
    let ZZ5 := floor(random() * (Z5max - Z5min + 1)) + Z5min;
    let Z6 := floor(random() * 3 + 1);
    let Z6min := if Z6 = 1 then
    65
    else
    if Z6 = 2 then
    97
    else
    49;
    let Z6max := if Z6 = 1 then
    90
    else
    if Z6 = 2 then
    122
    else
    57;
    let ZZ6 := floor(random() * (Z6max - Z6min + 1)) + Z6min;
    let Z7 := floor(random() * 3 + 1);
    let Z7min := if Z7 = 1 then
    65
    else
    if Z7 = 2 then
    97
    else
    49;
    let Z7max := if Z7 = 1 then
    90
    else
    if Z7 = 2 then
    122
    else
    57;
    let ZZ7 := floor(random() * (Z7max - Z7min + 1)) + Z7min;
    let Z8 := floor(random() * 3 + 1);
    let Z8min := if Z8 = 1 then
    65
    else
    if Z8 = 2 then
    97
    else
    49;
    let Z8max := if Z8 = 1 then
    90
    else
    if Z8 = 2 then
    122
    else
    57;
    let ZZ8 := floor(random() * (Z8max - Z8min + 1)) + Z8min;
    let HT := "&#";
    Passwort := HT + ZZ1 + HT + ZZ2 + HT + ZZ3 + HT + ZZ4 + HT + ZZ5 + HT + ZZ6 + HT + ZZ7 + HT + ZZ8

    Bei jedem neuen Datensatz erscheint in dem Feld "Passwort" die Zufallskombination. Einzige was stört: in der Tabellenansicht wird Passwort ais HTMl Code dargestellt (&#106&#55&#104.......), wenn man im Formular auf Passwort klickt und dann auf ok, wird der Ansicht wider in Ordnung.

    Hier die Datenbank: https://www.dropbox.com/s/vehm3ij75v3dgnu/Passwort.ninox?dl=0

    Gruß Leo
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Eine Möglichkeit wäre, mit random() und substr() zufällige Zeichen aus einem Zeichenvorrat zu wählen, Beispiel (vierstellig, A-Z):

    let chars := "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    let l := 26;
    substr(chars, floor(random() * l), 1)
    + substr(chars, floor(random() * l), 1)
    + substr(chars, floor(random() * l), 1)
    + substr(chars, floor(random() * l), 1)