Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Expresiones y operadores

Operadores aritméticos/concatenación

OperadorUso
+Suma numérica entre Number, o concatenación entre char/varchar (según el tipo de los operandos).
-Resta numérica.
*Multiplicación numérica.
/División numérica.
&Total = &Precio * &Cantidad
&Saludo = "Hola, " + &Usuario

Operadores de comparación

=, <>, <, <=, >, >= — usados en Where, If, While.

Operadores lógicos

And/Or combinan comparaciones (típicamente en If/While): And liga más fuerte que Or. Not expr niega una condición.

If &a = 1 And &b = 2 Or &c = 3
    ...
EndIf

Not (negación lógica)

Not expr invierte la condición que le sigue. Es una palabra reservada, igual que And y Or.

Precedencia, de menor a mayor: Or, And, Not, comparaciones. Es decir, Not liga más flojo que una comparación y más fuerte que And:

// Not &a = 1 And &b = 2  se lee como  (Not (&a = 1)) And (&b = 2)
If Not &a = 1 And &b = 2
    ...
EndIf

Para negar una condición compuesta, use paréntesis: Not (&a = 1 Or &b = 2).

Not también se puede usar en las condiciones de @Layout (ver @Layout: condiciones).

WARP no tiene un tipo booleano propio: cada operando se valida como cualquier otra expresión.

Continuación implícita de línea

En @Source, una expresión o sentencia puede repartirse en varias líneas sin ningún carácter especial. El salto de línea se ignora en estos casos:

  1. Después de un operador: + - * /, las comparaciones = <> < <= > >=, And, Or, Not, y después del = de una asignación.
  2. Dentro de paréntesis: tras (, tras cada , y antes de ). Aplica a llamadas a función o builtin (DateAdd(…)), Do Proc(...), Call(...), Message(...), Member(...), Export(...), listas de parámetros de Procedure/Function y expresiones entre paréntesis.
  3. And/Or al inicio de la línea siguiente también continúan la condición.
&texto = "uno" +
    "dos"

&f = DateAdd(
    &f,
    1,
    Days
)

If &n > 1
   And &n < 10
    ...
EndIf

Reglas adicionales:

  • Un operador aritmético o de comparación al inicio de la línea siguiente (por ejemplo + "dos") sigue siendo error (E00008), porque sería ambiguo.
  • No se puede continuar en medio de un identificador ni de un literal de texto.
  • Los comentarios // entre las líneas continuadas se ignoran.
  • Los números de línea de los diagnósticos siguen siendo los reales.

Literales

  • Números: 100, 9.5.
  • Texto: "texto" o 'texto' (equivalentes).
  • Fecha/hora: se obtienen con TODAY()/TIME(), no hay literal de fecha.

Variables y campos

  • Variable: siempre con & (&Usuario).
  • Campo de tabla: sin &, sólo dentro de un For Each/New sobre esa tabla (CodCli, Nombre).
  • Elemento de list/matrix: &Variable[índice] / &Variable[fila, col] (1-based).
  • Miembro de struct: &Variable.Miembro (lectura y asignación); con structs anidados, por camino: &Variable.Cab.Miembro, &Variable.Cab.Lista.Add(&fila), &Variable.Cab.Lista[1] — ver Tipos de dato: Struct.
  • Método de list: &Variable.Metodo(...) (Add/Clear/Init/Remove como sentencia, Count() como expresión) — ver Tipos de dato: List.
  • Método Json() de struct, de list(struct(...)) y de list de escalares (list(char), list(number), list(date), list(time), list(timestamp); el resultado es un arreglo JSON, p. ej. ["a","b"] o [1,2])
  • Sentencia JsonSplit(&json, &lista[, sangría]): parte un JSON en líneas — ver JsonSplit.
  • Tramas de ancho fijo: expresión &reg.FixedWidth() y sentencias &reg.FromFixedWidth(&texto), FixedWidthSplit(&registros, &lineas), FixedWidthParse(&lineas, &registros) — ver Tramas de ancho fijo.

Llamadas a función/procedimiento como expresión

&variable = NombreFuncion(expr, ...)

Ver Funciones builtin y @Source: sentencias de control para Functions propias.