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
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
-
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 -
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 -
Hallo Klaus, mod werden wir anpassen.
Es geht wenn du Beginn erst in Zahl umwandelst.
Ende := number(Begin) + 25200000
Viele Grüße,
Alex -
Gibt es schon ein Beispiel mit der Funktion unique() ?
-
Hallo, wir haben das Beispiel hier im Forum:
concat(unique(Tabelle.Feld))
Hiermit wird jeder wert nur einmal aufgelistet.
Viele Grüße,
Alex -
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. -
hab es leider bisher nur ohne Zeilenumbruch hinbekommen.
Also es sollte schon so ausschauen
Max Mustermann
Musterstrasse 10
50467 Musterhausen -
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
-
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! -
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 -
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) -
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 -
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! -
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! -
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 -
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 -
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 -
Ich frage mal unseren WordPress-Experten, ob das geht...
Gruß, Frank -
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...
-
Hey vielen Dank Leo das bringt mich schonmal ein stück weiter.
@ Alex: Allerdings würde ich mich auch über die Mehrzeilige Formelfunktion freuen. -
Guten Morgen,
Gibt es eine Möglichkeit Kommentare in den Programmcode einzufügen?
Gruß Leo -
Kommentare gibt es noch nicht.
Viele Grüße, Frank -
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 -
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 (j7h.......), 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 -
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)
Content aside
- vor 6 JahrenZuletzt aktiv
- 493Antworten
- 134678Ansichten