Funcions no documentades de Ninox
Algunes funcions no consten a la documentació oficial de Ninox. Les hem descobertes examinant-ne el codi i entenent-ne el comportament.
TypeOf
La funció typeof retorna el tipus d'un camp determinat.
Exemple:
typeof(first(select Customer).'First Name');
Eval
La funció eval executa l'script que se li passa com a paràmetre dins del context d'un registre determinat. Retorna el valor o bé un text que indica que hi ha un error a l'script.
Exemple:
eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer));
Resultat:
Sofia Young
DebugValueInfo
La funció debugValueInfo retorna un text que indica el tipus i el valor del paràmetre que se li passa.
És especialment útil per provar fragments de codi a la consola de Ninox.
Exemple:
debugValueInfo(eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer)));
Resultat:
any("Sofia Young")
Debug
La funció debug equival a console.log en JavaScript.
Envia el valor que se li passa com a paràmetre a la consola de desenvolupament del navegador. És útil per depurar codi dins de les fórmules.
Exemple:
(select Customer where 'First Name' like "a").(
var 'firstName' := this.'First Name';
var lastName := this.'Last Name';
debug("Debug info: " + 'firstName' + " " + lastName);
)
El resultat apareix a la consola de desenvolupament del navegador (accessible des de les eines per a desenvolupadors).
Records
La funció records retorna registres a partir d'una taula de nombres determinada.
Nota: la taula ha d'estar escrita literalment al codi; no pot ser una variable, cosa que fa que aquesta funció sigui menys flexible. És útil sobretot quan heu de recuperar sempre els mateixos registres.
Exemple:
records(Customer, [1, 3, 6]).'First Name';
Això recupera els noms dels registres amb els identificadors 1, 3 i 6.
nx-file
La funció http() de Ninox permet recuperar dades d'un servidor remot. Retorna un objecte JSON compost de dues claus: error i/o result. La clau result conté el contingut retornat pel servidor.
Si aquest contingut és en un format de text (com ara HTML, JavaScript, JSON o altres fitxers de text), tot va bé. Ara bé, si és un fitxer binari (per exemple, una imatge, un PDF, un document de Word, etc.) o parcialment binari, Ninox prova de desar aquest contingut en una variable de text. Això provoca un problema, perquè determinats valors binaris s'escapen (per exemple, el valor 92, o 0x5C en hexadecimal, que correspon al caràcter d'escapada «\»).
Això és perquè Ninox no sap tractar directament les taules d'octets. Per esquivar aquest problema podem fer servir Base64, que converteix les dades binàries en forma de text. Trobareu més informació sobre Base64 aquí:
https://www.freecodecamp.org/news/what-is-base64-encoding/?utm_source=chatgpt.com
Ninox ofereix algunes funcions per manipular dades codificades en Base64, com ara loadFileAsBase64() o loadFileAsBase64URL(). Permeten recuperar un fitxer (desat en un registre) en format Base64.
Tornem al nostre cas: hem de llegir un fitxer binari remot i desar-lo en un registre de Ninox. A la funció http() podeu definir opcions de capçalera. Normalment només cal indicar el format que voleu llegir mitjançant la clau content-type. Ara bé, per tractar dades binàries hi hem d'afegir una altra clau, no documentada, anomenada nx-file, amb el valor "base64url".
En afegir-hi la clau nx-file, Ninox canvia la manera de tractar el contingut retornat pel servidor. Normalment, Ninox retorna el contingut «tal qual». Amb nx-file, Ninox converteix la resposta a Base64URL. Així doncs, en lloc de rebre una cosa com ara:
{"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..."}
… obteniu:
{"result":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqoAAAIfCAYAAAC4gv6sAAABRGlDQ1BpY2MAABiVY2BgPJGTnFvMJMDAkJtXUhTk7qQQERmlwP6IgZlBhIGTgY9BNjG5uM..."}
Aquest format nou (Base64URL) és directament compatible amb la funció importFile() de Ninox, que l'interpreta com un URL Base64 local i el desa al registre indicat.
Tingueu present que la majoria de servidors remots només accepten peticions d'altres servidors (no d'un client). Per això és important executar la funció http() dins d'un context do as server.
Tot seguit teniu un exemple de funció global de Ninox que us permet llegir dades binàries (imatges, PDF, documents de Word, fitxers d'Excel, etc.) com a 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;
I vet aquí un exemple d'ús d'aquesta funció:
var base64UrlFile := loadFileOnBase64FromUrl(url);
importFile(this, text(base64UrlFile.content), text(base64UrlFile.fileName));
Fent això podeu recuperar un fitxer binari remot, convertir-lo a Base64URL i importar-lo directament en un registre de Ninox.
