Undokumentierte Funktionen in Ninox

Einige Funktionen fehlen in der offiziellen Ninox-Dokumentation. Wir haben sie entdeckt, indem wir den Code untersucht und ihr Verhalten nachvollzogen haben.

TypeOf

Die Funktion typeof gibt den Typ eines angegebenen Feldes zurück.

Beispiel:

typeof(first(select Customer).'First Name');

Eval

Die Funktion eval führt das als Parameter übergebene Skript im Kontext eines angegebenen Datensatzes aus. Sie liefert entweder den Wert oder einen Text, der auf einen Fehler im Skript hinweist.

Beispiel:

eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer));

Ergebnis:

Sofia Young

DebugValueInfo

Die Funktion debugValueInfo gibt einen Text zurück, der Typ und Wert des übergebenen Parameters nennt.
Das ist besonders praktisch, um Codeschnipsel in der Ninox-Konsole zu erproben.

Beispiel:

debugValueInfo(eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer)));

Ergebnis:
any("Sofia Young")

Debug

Die Funktion debug entspricht console.log in JavaScript.
Sie schickt den als Parameter übergebenen Wert an die Entwicklerkonsole des Browsers. Das hilft beim Debuggen von Code in Formeln.

Beispiel:

(select Customer where 'First Name' like "a").(
  var 'firstName' := this.'First Name';
  var lastName := this.'Last Name';
  debug("Debug info: " + 'firstName' + " " + lastName);
)

Das Ergebnis erscheint in der Entwicklerkonsole des Browsers (erreichbar über die Entwicklerwerkzeuge).

Records

Die Funktion records gibt Datensätze anhand eines angegebenen Zahlen-Arrays zurück.

Hinweis: Das Array muss fest im Code stehen; eine Variable ist nicht möglich, was diese Funktion weniger beweglich macht. Sie ist vor allem dann nützlich, wenn Sie immer wieder dieselben Datensätze holen müssen.

Beispiel:

records(Customer, [1, 3, 6]).'First Name';

Damit erhalten Sie die Vornamen der Datensätze mit den IDs 1, 3 und 6.

nx-file

Mit der Funktion http() lassen sich in Ninox Daten von einem entfernten Server abrufen. Sie gibt ein JSON-Objekt aus zwei Schlüsseln zurück: error und/oder result. Der Schlüssel result enthält den vom Server gelieferten Inhalt.

Liegt dieser Inhalt in einem Textformat vor (HTML, JavaScript, JSON oder andere Textdateien), so geht alles gut. Handelt es sich jedoch um eine Binärdatei (etwa ein Bild, ein PDF, ein Word-Dokument usw.) oder um teilweise binären Inhalt, so versucht Ninox, diesen Inhalt in einer Textvariablen abzulegen. Das führt zu einem Problem, weil bestimmte Binärwerte maskiert werden (zum Beispiel der Wert 92, hexadezimal 0x5C, der dem Escape-Zeichen „\“ entspricht).

Der Grund ist, dass Ninox nicht unmittelbar mit Byte-Arrays umgehen kann. Um das zu umgehen, verwenden wir Base64, das Binärdaten in Textform überführt. Näheres zu Base64 finden Sie hier:
https://www.freecodecamp.org/news/what-is-base64-encoding/?utm_source=chatgpt.com

Ninox stellt einige Funktionen für Base64-Daten bereit, etwa loadFileAsBase64() oder loadFileAsBase64URL(). Damit holen Sie eine (in einem Datensatz gespeicherte) Datei im Base64-Format.

Zurück zu unserem Fall: Wir müssen eine entfernte Binärdatei lesen und in einem Ninox-Datensatz ablegen. In der Funktion http() lassen sich Kopfzeilen-Optionen angeben. Normalerweise genügt es, mit dem Schlüssel content-type das gewünschte Format anzugeben. Für Binärdaten brauchen wir jedoch einen weiteren, undokumentierten Schlüssel namens nx-file mit dem Wert "base64url".

Mit dem Schlüssel nx-file ändert Ninox die Art, wie es den vom Server gelieferten Inhalt verarbeitet. Normalerweise gibt Ninox den Inhalt „wie er ist“ zurück. Mit nx-file wandelt Ninox die Antwort in Base64URL um. Statt etwas wie:

{"result":"�PNG\r\n\u001a\n\u0000\rIHDR\u0000\u0002�\u0000\u0002\u001f\b\u0006\u0000����\u0000\u0001DiCCPicc\u0000\u0018�c``<���[�$����WR\u0014��\u0010\u0011..."}

… erhalten Sie also:

{"result":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqoAAAIfCAYAAAC4gv6sAAABRGlDQ1BpY2MAABiVY2BgPJGTnFvMJMDAkJtXUhTk7qQQERmlwP6IgZlBhIGTgY9BNjG5uM..."}

Dieses neue Format (Base64URL) ist unmittelbar mit der Ninox-Funktion importFile() verträglich, die es als lokale Base64-URL deutet und im angegebenen Datensatz speichert.

Denken Sie daran, dass die meisten entfernten Server nur Anfragen von anderen Servern annehmen, nicht von einem Client. Deshalb sollte die Funktion http() in einem do as server-Kontext ausgeführt werden.

Hier eine globale Ninox-Beispielfunktion, mit der Sie Binärdaten (Bilder, PDFs, Word-Dokumente, Excel-Dateien usw.) als Base64URL lesen:

function loadFileOnBase64FromUrl(URL : text) do
 var fileName := extractx(URL, "\/([^\/?#]+)[^\/]*$", "$1");
 {
  fileName: fileName,
  content: do as server
    http("get", URL, {
      'content-type': "application/octet-stream",
      'nx-file': "base64url"
    }, null).result
  end
 }
end;

Und so verwenden Sie diese Funktion:

var base64UrlFile := loadFileOnBase64FromUrl(url);
importFile(this, text(base64UrlFile.content), text(base64UrlFile.fileName));

Auf diese Weise holen Sie eine entfernte Binärdatei, wandeln sie in Base64URL um und importieren sie unmittelbar in einen Ninox-Datensatz.