Funzioni non documentate di Ninox
Alcune funzioni non compaiono nella documentazione ufficiale di Ninox. Le abbiamo scoperte esaminando il codice e comprendendone il comportamento.
TypeOf
La funzione typeof restituisce il tipo di un campo indicato.
Esempio:
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:
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.
Esempio:
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:
(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).
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:
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:
{"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:
{"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:
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:
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.
