Funzioni non documentate di Ninox

Alcune funzioni non compaiono nella documentazione ufficiale di Ninox. Le abbiamo scoperte esaminando il codice e comprendendone il comportamento. Le ritroverete anche, con l'intestazione nx-file di http(), nella scheda Aiuto funzioni di Ninext.

TypeOf

La funzione typeof restituisce il tipo di un campo indicato.

Esempio:

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

Eval

La funzione eval esegue lo script passato come parametro nel contesto di un record indicato. Restituisce il valore oppure un testo che segnala un errore nello script.

Esempio:

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

Risultato:

Sofia Young

DebugValueInfo

La funzione debugValueInfo restituisce un testo che indica il tipo e il valore del parametro passato.
È particolarmente utile per provare frammenti di codice nella console di Ninox, o nella Console di Ninext, che indica peraltro il tipo di ogni risultato.

Esempio:

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

Risultato:
any("Sofia Young")

Debug

La funzione debug equivale a console.log in JavaScript.
Invia il valore passato come parametro alla console per sviluppatori del browser. È utile per il debug del codice nelle formule.

Esempio:

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

Il risultato compare nella console per sviluppatori del browser (accessibile dagli strumenti di sviluppo).

Con Ninext, un amministratore trova inoltre ogni chiamata a debug() nella scheda Tracciatore debug, con il valore di tutte le variabili visibili in quel punto — a condizione che il pannello Ninext sia aperto: a pannello chiuso, non vi viene rilevato nulla. L'uscita verso la console del browser avviene in ogni caso.

Records

La funzione records restituisce i record corrispondenti a un array di numeri indicato.

Nota

L'array deve essere scritto direttamente nel codice, non può essere una variabile: ciò rende la funzione meno flessibile. È utile soprattutto quando occorre recuperare sempre gli stessi record.

Esempio:

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

In questo modo si ottengono i nomi dei record con gli ID 1, 3 e 6.

nx-file

La funzione http() di Ninox permette di recuperare dati da un server remoto. Restituisce un oggetto JSON composto da due chiavi: error e/o result. La chiave result contiene il contenuto restituito dal server.

Se quel contenuto è in un formato testuale (HTML, JavaScript, JSON o altri file di testo), tutto funziona bene. Se però si tratta di un file binario (un'immagine, un PDF, un documento Word, ecc.) o parzialmente binario, Ninox tenta di conservare quel contenuto in una variabile di tipo text. Ciò crea un problema, perché alcuni valori binari vengono interpretati come sequenze di escape (per esempio il valore 92, ossia 0x5C in esadecimale, che corrisponde al carattere di escape “\”).

Il motivo è che Ninox non sa gestire direttamente gli array di byte. Per aggirare l'ostacolo si può usare il Base64, che converte i dati binari in forma testuale. Maggiori informazioni sul Base64 qui:
https://www.freecodecamp.org/news/what-is-base64-encoding/?utm_source=chatgpt.com

Ninox mette a disposizione alcune funzioni per manipolare dati codificati in Base64, come loadFileAsBase64() o loadFileAsBase64URL(). Permettono di recuperare in formato Base64 un file conservato in un record.

Torniamo al nostro caso: dobbiamo leggere un file binario remoto e conservarlo in un record Ninox. Nella funzione http() si possono definire le opzioni di intestazione. Di norma basta indicare il formato da leggere con la chiave content-type. Per gestire i dati binari occorre però aggiungere un'altra chiave, non documentata, chiamata nx-file, assegnandole il valore "base64url".

Aggiungendo la chiave nx-file, Ninox cambia il modo di trattare il contenuto restituito dal server. Normalmente Ninox restituisce il contenuto «così com'è». Con nx-file, converte la risposta in Base64URL. Così, invece di ricevere qualcosa come:

JSON
{"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..."}

… si ottiene:

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

Questo nuovo formato (Base64URL) è direttamente compatibile con la funzione importFile() di Ninox, che lo interpreta come un URL Base64 locale e lo salva nel record indicato.

Tenete presente che la maggior parte dei server remoti accetta richieste solo da altri server, non da un client. Per questo è importante eseguire la funzione http() in un contesto do as server.

Ecco un esempio di funzione globale Ninox che permette di leggere dati binari (immagini, PDF, documenti Word, file Excel, ecc.) in Base64URL:

Ninox
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;

Ed ecco un esempio d'uso di questa funzione:

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

In questo modo potete recuperare un file binario remoto, convertirlo in Base64URL e importarlo direttamente in un record Ninox.