Expresiones y operadores
Operadores aritméticos/concatenación
| Operador | Uso |
|---|---|
+ | 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:
- Después de un operador:
+ - * /, las comparaciones= <> < <= > >=,And,Or,Not, y después del=de una asignación. - 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 deProcedure/Functiony expresiones entre paréntesis. And/Oral 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 unFor Each/Newsobre 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/Removecomo sentencia,Count()como expresión) — ver Tipos de dato: List. - Método
Json()destruct, delist(struct(...))y delistde 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
®.FixedWidth()y sentencias®.FromFixedWidth(&texto),FixedWidthSplit(®istros, &lineas),FixedWidthParse(&lineas, ®istros)— 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.