Repetir una acción: for y while

Un bucle repite una acción: recorrer todas las facturas de un cliente para sumarlas, crear una línea por mes, comprobar cada registro de una tabla…

Un bucle for sirve para ejecutar código y/o devolver un array de valores. El tipo del array devuelto corresponde al tipo de la última instrucción que hay entre do y end.

Bucle for

Recorrer un intervalo de números:

Ninox
for i from 1 to 10 do
    i;
end;

Recorrer un array:

Ninox
var myArray := [1, 3, 5, 7];
for i in myArray do
    i;
end;

Recorrer las claves y los valores de un objeto JSON:

Ninox
var config := {
    sep: ",",
    qut: """",
    lf: "%0D%0A",
    numberFormat: "point",
    dateFormat: "locale",
    header: true,
    sepHeader: false,
    encoding: "utf8"
};

for key, value in config do
    key + " = " + value;
end;

Vea cómo manipular las variables JSON en Ninox: Trabajar con datos JSON.

También se puede hacer lo mismo con un registro, pero hay que usar NativeJS de Ninext para transformar un registro (nid) en JSON:

Ninox
var rec := (first(select Customer));

"Transforming a record into a JSON object";
var config := #{:any return rec}#;

for fieldName, value in config do
    fieldName + " = " + value;
end;

Este enfoque puede resultar útil para exportar todos los campos de una tabla a formatos como CSV. Dos precauciones:

  • El objeto obtenido contiene, además de los campos designados por su etiqueta, las claves técnicas Id, ID, id y _node, y sus valores están en bruto (una fecha, por ejemplo, es en él un número de milisegundos). Descarte esas claves para una exportación.
  • El bloque #{ … }# solo se ejecuta en el navegador donde está cargado Ninext: en un do as server o en un trigger de tabla (después de crear, después de modificar), no tiene efecto. La pestaña Errores de Ninext lo señala.

Bucle while

Los bucles While son sencillos y no devuelven ningún valor. Sirven únicamente para realizar tareas repetitivas y no se pueden usar para construir arrays.

Ejemplo:

Ninox
var a := 1;
while a < 10 do
    a := a + 1;
end;