Native JS

Native JS us permet executar codi JavaScript dins d'un script de Ninox i compartir-hi funcions i variables. D'aquesta manera, Native JS pot accedir a les variables de Ninox i cridar funcions tant locals com globals.

imatge.png

Limitacions

Modificar una variable de Ninox dins de NativeJS no afecta la variable de Ninox.

El JavaScript només s'executa localment. Afegir JavaScript a codi que s'executa al servidor no té cap efecte. Igualment, cridar una funció global que conté JavaScript des de codi executat al servidor no té cap efecte.

Consulteu aquí quins codis s'executen localment i quins al servidor:

imatge.png

Sintaxi

Execució

Per indicar a Ninox que passeu a JavaScript, cal que envolteu el codi amb #{ ... }#:

#{ alert("hello world") }#;

Recordeu que Ninox és un llenguatge precompilat que necessita conèixer per endavant el tipus de cada variable i de cada funció. El mateix passa amb Native JS: heu d'especificar el tipus retornat pel codi JavaScript. Per defecte, Native JS retorna text, però podeu indicar el tipus de variable que voleu retornar especificant-lo al començament mateix del codi amb la notació :[type].:

Valor retornat

#{:text return "hello world"}#;

Els tipus possibles són els mateixos que es fan servir per a les crides de funció: text, number, date, datetime, time, timeinterval, appointment, boolean, html, color, icon, email, phone, location, file, user i any.

Tipus de taula (array)

Per retornar una taula de valors, feu servir la sintaxi següent:

#{:number(array) return [1,2,3] }#;

Tipus de registre

Per retornar registres, feu servir el nom de la taula seguit de nid o rid:

Si feu servir nid, heu de retornar una taula de valors de text que contingui l'identificador complet del registre, és a dir, l'identificador de la taula + el número del registre:

#{:nid(customer) return ['A1','A2','A3'] }#

Si feu servir rid, cal que retorneu el número del registre:

#{:rid(customer) return [1,2,3] }#

Per als noms de taula compostos, no hi afegiu com a Ninox, sinó que feu servir simplement el nom complet de la taula:

#{:rid(my long name table) return [1,2,3] }#

Amb aquesta sintaxi, Native JS retorna variables que es comporten igual que el codi de Ninox. Això vol dir que podeu fer servir la sintaxi següent com si fos un select:

(#{:rid(customer) return [1,2,3] }# order by 'Last Name').'First Name';

imatge.png

Modificació de registres

Les variables de tipus registre es passen en format JSON, amb una parella clau-valor per a cada camp del registre.

var r := first(select Customer);
#{:text return r['First Name'] }#;

Aquí, el contingut de la variable r en JavaScript té aquest aspecte:

{
 "Created on": 1648910817206,
 "Id": "A1",
 "Last modified": 1714817525840,
 "Modified by": "7zBqhAKXxfQAPmH7Y",
 "First Name": "Sofia",
 "Last Name": "Young",
 "Company": "Kollwitz GmbH",
 "Postal Code": "12345",
 "City": "New Jersey",
 "Address": "11,South Commerce Street",
 "Email": "sofi@kollwitz-gmbh.com",
 "Customer No": "K0001",
 "Title": "2",
 "Invoices": [
  1,
  16,
  17
 ],
 "Photo": "shutterstock_307218608.jpg",
 "Category": "1",
 "Position": "Marketing head",
 "Checked": true,
 "ID": "A1",
 "id": "A1"
}

Important

Segons si el codi s'executa a l'aplicació per a Mac o al web, l'ID pot tenir majúscules i minúscules diferents.
Per resoldre-ho i evitar conflictes entre plataformes, l'ID es repeteix amb totes les combinacions possibles de majúscules i minúscules.

Modificar el registre en JavaScript no l'actualitza a Ninox.

Execució asíncrona

De vegades és útil sincronitzar l'execució del codi de Ninox amb la del JavaScript.
Per exemple, quan es fa servir un temporitzador, és important que el codi només acabi després que el temporitzador hagi acabat d'executar-se.
Sense aquesta sincronització, el codi posterior a l'execució del JavaScript s'executaria immediatament, cosa que podria provocar comportaments inesperats.

En aquest primer cas, el valor «I don't know» es retorna immediatament, i la funció alert mostra el resultat abans que la pregunta arribi a plantejar-se a l'usuari.

var r:= #{:text
   setTimeout( () => {
      if (confirm("Are you ok ?"))
        return "of course";
      else
        return "Never !";
   }, 2000);
  return "I don't know";
}#;
alert( "Your answer is : "+r );

imatge.png

En passar al mode callback, la funció alert de Ninox s'executa només després que el codi JavaScript hagi cridat la funció de retorn, és a dir, després que la pregunta s'hagi plantejat a l'usuari.

var r:= #{:text:callback
   setTimeout( () => {
      if (confirm("Are you ok ?"))
         callback( "of course" );
      else
        callback( "Never !" );
   }, 2000);
   return "I don't know";
}#;
alert( "Your answer is : "+r );

Enregistrement de l’écran 2025-03-03 à 11.46.26.gif

Crida de funcions

Es poden cridar funcions de Ninox des de JavaScript. El procediment pot ser local o global; només cal que sigui dins de l'abast del codi JavaScript.

function display( message : text ) do
    alert( message );
end;
#{ display('hello world') }#;

imatge.png

Per recuperar el valor retornat d'una funció, heu de tornar a fer servir el mode de funció de retorn (vegeu més amunt: Execució asíncrona):

function add( a : number, b : number ) do
    a + b;
end;

#{:number:callback
   add( 1, 2, (returnValue) => {
     callback( returnValue )
   })
}#;

imatge.png

Si no heu de fer cap altre tractament després de cridar el procediment, podeu passar directament la funció de retorn com a paràmetre:

function add( a : number, b : number ) do
    a + b;
end;
#{:number:callback
   add( 1, 2, callback )
}#;

imatge.png

Manipular registres i funcions

Si teniu una llista d'identificadors de registre, podeu cridar una funció de Ninox per modificar cada registre un per un. Per fer-ho, només cal cridar la funció i passar-li l'identificador.

function setCustomerChecked( id : text, checked : boolean ) do
   var n := number(replacex(id, "\D",""));
   var rec := record( Customer, n );
   rec.Checked := checked;
end;
var c := select Customer;
var isChecked := not first(c).Checked;
#{
   c.forEach( v => { setCustomerChecked( v, isChecked ) } );
}#;
c.checked;

Errors d'execució

Si es produeix un error d'execució al vostre codi, es retornarà el text del missatge d'error:

imatge.png