Fonctions non documentées de Ninox

Certaines fonctions ne figurent pas dans la documentation officielle de Ninox. Nous les avons découvertes en examinant le code et en comprenant leur comportement.

TypeOf

La fonction typeof renvoie le type d'un champ donné.

Exemple :

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

Eval

La fonction eval exécute le script passé en paramètre dans le contexte d'un enregistrement donné. Elle renvoie soit la valeur, soit un texte signalant une erreur dans le script.

Exemple :

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

Résultat :

Sofia Young

DebugValueInfo

La fonction debugValueInfo renvoie un texte indiquant le type et la valeur du paramètre transmis.
C'est particulièrement utile pour éprouver des bouts de code dans la console Ninox.

Exemple :

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

Résultat :
any("Sofia Young")

Debug

La fonction debug est l'équivalent de console.log en JavaScript.
Elle envoie la valeur passée en paramètre à la console de développement du navigateur. C'est pratique pour déboguer du code dans les formules.

Exemple :

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

Le résultat apparaît dans la console de développement du navigateur (accessible par les outils de développement).

Records

La fonction records renvoie des enregistrements à partir d'un tableau de nombres donné.

Remarque : le tableau doit être écrit en dur ; ce ne peut pas être une variable, ce qui rend cette fonction peu souple. Elle sert surtout lorsque vous devez récupérer systématiquement les mêmes enregistrements.

Exemple :

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

Ceci récupère les prénoms des enregistrements dont les identifiants sont 1, 3 et 6.

nx-file

La fonction http() de Ninox permet de récupérer des données depuis un serveur distant. Elle renvoie un objet JSON composé de deux clés : error et/ou result. La clé result contient le contenu renvoyé par le serveur.

Si ce contenu est dans un format texte (HTML, JavaScript, JSON ou autres fichiers texte), tout se passe bien. En revanche, s'il s'agit d'un fichier binaire (image, PDF, document Word, etc.) ou partiellement binaire, Ninox tente de stocker ce contenu dans une variable de type texte. Cela pose problème, car certaines valeurs binaires sont échappées (par exemple la valeur 92, soit 0x5C en hexadécimal, qui correspond au caractère d'échappement « \ »).

Cela tient au fait que Ninox ne sait pas manipuler directement des tableaux d'octets. Pour contourner la difficulté, on peut recourir au Base64, qui convertit des données binaires en texte. Vous trouverez plus d'informations sur le Base64 ici :
https://www.freecodecamp.org/news/what-is-base64-encoding/?utm_source=chatgpt.com

Ninox fournit quelques fonctions pour manipuler des données encodées en Base64, comme loadFileAsBase64() ou loadFileAsBase64URL(). Elles permettent de récupérer un fichier (stocké dans un enregistrement) au format Base64.

Revenons à notre cas : il s'agit de lire un fichier binaire distant et de le stocker dans un enregistrement Ninox. Dans la fonction http(), vous pouvez définir des options d'en-tête. En général, il suffit d'indiquer le format à lire avec la clé content-type. Mais pour traiter des données binaires, il faut ajouter une autre clé, non documentée, nommée nx-file, à laquelle on donne la valeur "base64url".

En ajoutant la clé nx-file, Ninox change sa façon de traiter le contenu renvoyé par le serveur. Normalement, Ninox renvoie le contenu « tel quel ». Avec nx-file, Ninox convertit la réponse en Base64URL. Ainsi, au lieu de recevoir quelque chose comme :

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

… vous obtenez :

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

Ce nouveau format (Base64URL) est directement compatible avec la fonction importFile() de Ninox, qui l'interprète comme une URL Base64 locale et l'enregistre dans l'enregistrement indiqué.

Gardez à l'esprit que la plupart des serveurs distants n'acceptent que les requêtes venant d'autres serveurs (et non d'un client). C'est pourquoi il est important d'exécuter la fonction http() dans un contexte do as server.

Voici un exemple de fonction globale Ninox qui permet de lire des données binaires (images, PDF, documents Word, fichiers 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;

Et voici un exemple d'utilisation de cette fonction :

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

Vous pouvez ainsi récupérer un fichier binaire distant, le convertir en Base64URL et l'importer directement dans un enregistrement Ninox.