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
    • Leonid_Semik
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Oh Got, wie kurz und elegant. Bin neidisch. Habe in diese Richtung gar nicht gedacht. Vielen Dank

    Leo
    • atelier44
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Gibt es für die Funktion "Verknüpfung aufheben" einen Befehl, den man sich in einen if- then Trigger hineinbasteln kann?
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Mit der kommenden Version wird das möglich sein. Der Befehl wäre dann:
    'Verknüpungsfeld' := null
    Viele Grüße, Frank
    • schocki
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Besteht schon eine Möglichkeit bei concat(string) das Trennzeichen selber zu bestimmen? MfG schocki
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo, wir nehmen den Punkt mit auf die Anforderungsliste. Können aber noch nicht sagen wann das Feature implementiert wird.
    VG, Alex
    • Lupo
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo zusammen,

    im Zusammenhang mit einer Datenbank für Modellbahnen knoble ich gerade an einer Automatisierung.

    Es gibt Anzahl N Lokmotiven, in denen je ein Decoder eingebaut ist (Tabelle 1).
    Es gibt verschiedene Decoder (Tabelle 2) zur Auswahl, die über "CV-Parameter" programmiert werden. Jeder Decoder hat einen spezifischen Satz mit Anzahl M "CV-Parameter" (Tabelle 3), die in jeder der N Lokomotiven unterschiedliche Werte annehmen (Tabelle 4).

    Tabelle 4 enthält also eine N:M Vereinbarung und erscheint als Untertabelle bei der Eingabe der Lokomotive in Tabelle 1. Das funktioniert auch prima, aber es muss jeder Datensatz in Tabelle 4 händisch durch Auswählen der entsprechenden M CV-Parameter in Tabelle 3 erzeugt werden. Dies ist recht aufwändig und fehlerträchtig.

    Eigentlich sind in Tabelle 1 ja alle Daten vorhanden, so dass ein Makro die für den gewählten Decoder gültigen CV Parameter aus Tabelle 3 herauslesen und die Verknüpfungen in Tabelle 4 erstellen könnte. In der Untertabelle würden dann schon die M Datenzeilen erscheinen, und es müssten nur noch die bei der Lokomotive eingestellten Werte eingegeben werden.

    Mit dem Makro bin ich schon so weit gekommen, dass die Zahl M der für den jeweiligen Decoder in Tabelle 4 zu erstellenden Datensätze ermittelt wird. Aber gescheitert bin ich beim Erstellen der M Zeilen in Tabelle 4 und dem Eintragen der jeweiligen Verknüpfung zu Tabelle 3.

    Gibt NX so etwas her?

    Ich hoffe, das ist so halbwegs nachvollziehbar - und würde mich freuen, wenn es auch lösbar wäre.

    Besten Dank vorweg,
    Wolfgang
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Wolfgang,

    ich glaube, das sollte gehen - auch wenn ich das Datenmodell jetzt nicht ganz vor Augen habe. Vielleicht helfen folgende Ideen:

    Mit select kann man Datensätze aus einer anderen Tabelle auflisten. ZB so:
    select CVParameter where Decoder.Nr = 5
    Jetzt könnte man zB alle CVParameter abfragen, die zum Decoder der aktuellen Lokomotive gehören:

    let d := Decoder.Nr;
    select CVParameter where Decoder.Nr = d

    Über diese Abfrage kann man mit for iterieren und dann mit create jeweils eine neue Zeile in der N:M-Tabelle erzeugen:

    let l := Nr;
    let d := Decoder.Nr;
    for p in (select CVParameter where Decoder.Nr = d) (
    let lp := create Lokomotive_CVParameter;
    lp.CVParameter := p;
    lp.Lokomotive := l
    )


    Viele Grüße, Frank
    • Lupo
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Frank,

    Vielen herzlichen Dank! Wir sind zwar jetzt über Ostern unterwegs, aber ich werd's dann so schnell wie möglich ausprobieren und berichten. Bis dahin wünsch ich auch frohe Ostern.

    LG,
    Wolfgang
    • Lupo
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Frank,

    wow - suuuper! Funktioniert! ;o) Nochmal ganz vielen Dank für Deine Hilfe!

    Allerdings hat die Abfrage "... where Decoder.Nr = d" nicht funktioniert. Erst, als ich's in "... where Decoder.Nr like d" umgeschrieben hatte, lief's.

    Im Moment trigger ich dieses Makro mit einem ja/nein Feld - hier würde ich dann eine Schaltfläche vorsehen, sobald diese auf dem iPad funktioniert. Und, wenn NX mal einen Befehl zum Löschen von Datensätzen kann (das kommt doch bestimmt noch, oder?), auch das Löschen dieses Datensegens automatisieren.

    Viele Grüße,
    Wolfgang
    • schocki
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo liebes Ninox Team. Gibt es eine Möglichkeit die Reihenfolge bzw. Sortierung bei concat(string) selbst zu bestimmen? Wenn nicht, ist es mit einem workaround möglich? MfG schocki
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Schocki,
    Es gibt sort() also concat(sort(Tabelle.Feld)).
    Damit kann der Array alphabetisch sortiert werden. Andere Möglichkeiten gibt es leider noch nicht.
    VG, Alex
    • schocki
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo. Gibt es bei replace(string, search, replace) eigentlich eine Wildcard Möglichkeit? z.B. ">>*<>" und "<<".
    Vielen Dank im Voraus. MfG schocki
    • schocki
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Alex. Vielen dank für die schnelle Antwort. Das hilft mir sehr. Ich sehe an dieser Stelle auch nur eine weitere Möglichkeit wenn ich nicht falsch liege. sort() sortiert alphabetisch aufsteigend, die einzige Ergänzung die mir dazu einfällt wäre so etwas wie sortztoa() also alphabetisch absteigend.
    Solche "Kleinigkeiten" erhöhen die Flexibilität enorm wobei ich gestehen muss, dass ich nicht um den Programmieraufwand einer solchen Möglichkeit weiß.
    MfG schocki
    • schocki
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Kleiner workaround um das Trennzeichen selber zu bestimmen:
    replace(concat(string),", ","neuesTrennzeichen")
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo, gibt es noch nicht. Nehmen wir mit auf die Anforderungsliste. Können aber noch nicht genau sagen wann wir es implementieren.
    VG, Alex
    • sitkialtuntop_gmailcom
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo NINOX-Team, gibt es oder hat schonmal jemand einen IBAN-Rechner generiert?
    Und wie kann ich eine BIC ermitteln ?
    • Chris_CH
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Ich habe bei Fragen zur Syntax:

    1. ich prüfe bei Neueingabe ob der Datensatz schon existiert:
    let n := Name;
    let a := Anrede;
    let n := cnt(select Beteiligte where Name = n and Anrede = a);
    if n > 1 then
    ('Doublette?' := "Der Beteiligte scheint schon angelegt zu sein?")
    else
    ('Doublette?' := void)

    Wenn ich es recht verstehe reagiert diese Syntax wenn bei einem Eintag in "Beteiligte" zwei (>1) der gelisteten Bedingungen vorliegen. Ich zähle also die positiven Bedingungen?
    Sicherer wäre es die Zahl der Beteiligten zu zählen bei denen beide Bedingungen vorliegen (Auschluß dann bei >0) Wie muss ich das formulieren?

    2.fast ein Doppelpost von hier: http://manual.ninoxdb.de/de/datenfeldtypen/comment-page-4/#comment-1231
    Wenn eine Doublette vorliegt, habe ich die Möglichkeit, dann mittels Funktion den Datensatz, den ich gerade eingebe (und stoppe) in der Beteiligten Tabelle zu löschen und auch den zuletzt angelegten Teilnehmer aus dem ich dahin komme?

    (Tabelle Projekt. Tabelle Teilnehmer. Tabelle Beteiligte. Teilnehmer ist Komposition von Projekt und auch mit Beteiligte (dem Gesamtregster der Personen) verknüpft.
    Ich starte über meine Tabelle “Projekt” und füge einen “Teilnehmer” hinzu. Ich kann in Beteiligte suchen oder einen neuen anlegen. )

    Ich hoffe meine Probleme sind verständlich dargelegt.

    Christoph
    • Frank_Bohmer
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Christoph,
    1.

    let n:= cnt(select Beteiligte where Name = n and Anrede = a)

    Ist die Anzahl der Datensätze, bei denen sowohl Name als auch Anrede übereinstimmen, sprich die Bedingung müsste dann heißen:

    if n > 0 then
    ('Doublette?' := "Der Beteiligte scheint schon angelegt zu sein?")
    else
    ('Doublette?' := "")

    2. Löschen per Skript geht leider noch nicht, das kommt aber bald.
    Viele Grüße, Frank
    • Chris_CH
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Frank,

    ersteinmal herzlichen Dank für die Perspektive :-)

    Zu meinem code, ich glaube, dass das nicht so ist.

    ich habe hier mal eine kleine Beispieldatenbank verlinkt.
    https://www.dropbox.com/s/8nd91d9g4lscfha/Test.ninox?dl=0

    wenn ich >0 eingebe (im script bei Änderung der Register Datenbank) schlägt die Warnung an, sobald nur eine Bedingung vorliegt.
    Wenn ich > 1 eingebe nur wenn beide vorliegen.

    Woran liegt das?

    Christoph
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Chris,

    stimmt, > 1 ist richtig. Es müssen zwei gezählt werden, damit es ein Duplikat ist.

    VG, Alex
    • Chris_CH
    • vor 8 Jahren
    • Gemeldet - anzeigen
    nun verstehe ich es.
    Ich danke Euch Beiden!

    herzliche Grüße
    Christoph
    • markoschindler
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo,

    vielleicht stelle ich mich kompliziert an, aber wie erreiche ich folgendes?

    * Tabelle 1 enthält Felder ID, Name, Vorname
    * Tabelle 2 enthält Felder ID_B, Summe, Datum

    Tabelle 2 ist mit Tabelle 1 N:1 verknüpft, d.h., ein Name, Vorname aus Tabelle 1 kann n Datensätze mit einer Summe in Tabelle 2 haben.

    Ich möchte nun, dass ein Trigger jedesmal, wenn ein neuer Datensatz in Tabelle 2 geschrieben wird, in das Feld 'Tabelle2.ID_B' der Wert aus 'Tabelle1.ID' desjenigen Datensatzes aus der Tabelle 1 überträgt, mit dem der Datensatz in Tabelle 2 verknüpft ist. Also etwa so:

    Tabelle 1:
    ID Name Vorname
    1 Meier Paul
    2 Müller Max
    3 Schulze Dieter

    Tabelle 2:
    ID_B Summe Datum
    2 100,00 01.01.2016
    2 100,00 01.02.2016
    3 100,00 01.01.2016
    usw.

    Wie ist das zu realisieren?

    Danke schon jetzt für jeden Tip!

    MS
    • Alexander_Koenig
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Marko,
    die ID aus der verknüpften Tabelle kann auch über ein Formel Feld in Tabelle 2 ausgeben werden:
    'Tabelle 1'.Id

    Alternativ kann ein Trigger auf das Verknüpfungsfeld gelegt werden, der dann in das Feld ID_B schreibt:
    ID_B := number('Tabelle 1'.Id)

    Hierbei muss das Feld ID_B ein Nummernfeld sein.

    VG, Alex
    • markoschindler
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Herzlichen Dank,

    schnelle und funktionierende Hilfe, ich bin begeistert!

    Beste Grüße, MS
    • Gregor.2
    • vor 8 Jahren
    • Gemeldet - anzeigen
    Hallo Christoph
    Hallo Frank

    danke, eine nützliche Funktion ist das