Funciones no documentadas de Ninox
Algunas funciones no figuran en la documentación oficial de Ninox. Las hemos descubierto examinando el código y observando su comportamiento.
TypeOf
La función typeof devuelve el tipo de un campo determinado.
Ejemplo:
typeof(first(select Customer).'First Name');
Eval
La función eval ejecuta el script que se le pasa como parámetro en el contexto de un registro determinado. Devuelve el valor, o bien un texto que indica un error en el script.
Ejemplo:
eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer));
Resultado:
Sofia Young
DebugValueInfo
La función debugValueInfo devuelve un texto con el tipo y el valor del parámetro recibido.
Resulta especialmente útil para probar fragmentos de código en la consola de Ninox.
Ejemplo:
debugValueInfo(eval("---{this.'First Name'} {this.'Last Name'}---", first(select Customer)));
Resultado:
any("Sofia Young")
Debug
La función debug equivale a console.log en JavaScript.
Envía el valor recibido como parámetro a la consola de desarrollo del navegador. Resulta práctica para depurar el código de las fórmulas.
Ejemplo:
(select Customer where 'First Name' like "a").(
var 'firstName' := this.'First Name';
var lastName := this.'Last Name';
debug("Debug info: " + 'firstName' + " " + lastName);
)
El resultado aparece en la consola de desarrollo del navegador (accesible desde las herramientas para desarrolladores).
Records
La función records devuelve registros a partir de un array de números determinado.
Nota: el array debe estar escrito literalmente; no puede ser una variable, lo que resta flexibilidad a esta función. Es útil sobre todo cuando hay que recuperar siempre los mismos registros.
Ejemplo:
records(Customer, [1, 3, 6]).'First Name';
Así se recuperan los nombres de los registros con los identificadores 1, 3 y 6.
nx-file
La función http() de Ninox permite recuperar datos de un servidor remoto. Devuelve un objeto JSON compuesto por dos claves: error y/o result. La clave result contiene el contenido devuelto por el servidor.
Si ese contenido está en formato de texto (HTML, JavaScript, JSON u otros archivos de texto), todo funciona bien. En cambio, si es un archivo binario (una imagen, un PDF, un documento de Word, etc.) o parcialmente binario, Ninox intenta guardar ese contenido en una variable de tipo text. Eso provoca un problema, porque algunos valores binarios se escapan (por ejemplo, el valor 92, o 0x5C en hexadecimal, que corresponde al carácter de escape «\»).
Se debe a que Ninox no sabe tratar directamente los arrays de bytes. Para sortear ese problema podemos usar Base64, que convierte los datos binarios en texto. Encontrará más información sobre Base64 aquí:
https://www.freecodecamp.org/news/what-is-base64-encoding/?utm_source=chatgpt.com
Ninox ofrece algunas funciones para manipular datos codificados en Base64, como loadFileAsBase64() o loadFileAsBase64URL(). Permiten recuperar en formato Base64 un archivo guardado en un registro.
Volvamos a nuestro caso: hay que leer un archivo binario remoto y guardarlo en un registro de Ninox. En la función http() se pueden definir opciones de cabecera. Normalmente basta con indicar el formato que se quiere leer mediante la clave content-type. Sin embargo, para tratar datos binarios hay que añadir otra clave, no documentada, llamada nx-file, con el valor "base64url".
Al añadir la clave nx-file, Ninox cambia la forma de tratar el contenido devuelto por el servidor. Normalmente, Ninox devuelve el contenido «tal cual». Con nx-file, Ninox convierte la respuesta a Base64URL. Así, en lugar de recibir algo como:
{"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..."}
… obtiene:
{"result":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqoAAAIfCAYAAAC4gv6sAAABRGlDQ1BpY2MAABiVY2BgPJGTnFvMJMDAkJtXUhTk7qQQERmlwP6IgZlBhIGTgY9BNjG5uM..."}
Este formato nuevo (Base64URL) es directamente compatible con la función importFile() de Ninox, que lo interpreta como una URL Base64 local y lo guarda en el registro indicado.
Tenga en cuenta que la mayoría de los servidores remotos solo aceptan peticiones procedentes de otros servidores (no de un cliente). Por eso es importante ejecutar la función http() en un contexto do as server.
Abajo tiene un ejemplo de función global de Ninox que permite leer datos binarios (imágenes, PDF, documentos de Word, archivos de Excel, etc.) en 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;
Y aquí tiene un ejemplo de uso de esta función:
var base64UrlFile := loadFileOnBase64FromUrl(url);
importFile(this, text(base64UrlFile.content), text(base64UrlFile.fileName));
Así puede recuperar un archivo binario remoto, convertirlo a Base64URL e importarlo directamente en un registro de Ninox.
