@Source: sentencias de control
El cuerpo imperativo de un Program/Screen: asignaciones, control de flujo, acceso a tablas, declaraciones de Procedure/Function, invocaciones y reportes.
For Each In: recorrer una tabla
For Each In Tabla [Index NombreIndice]
[Where Campo = expr]...
// cuerpo, corre por cada fila encontrada
[When None
// corre si no hubo ninguna fila
]
EndFor
Index: opcional, selecciona el acceso (por defecto el de acceso secuencial).Where: cero o más, filtra por igualdad.When None: opcional, corre si el loop no encontró ninguna fila.
Delete(): borrar la fila actual
For Each In Tabla
If &Vencido
Delete()
EndIf
EndFor
Sin argumentos — borra la fila que la iteración tiene cargada en ese momento. Sólo válido dentro de un For Each In (no dentro de un For Each Row, que recorre el subfile del DataGridView, no una tabla); válido tanto en Program como en Screen. Una fila borrada no se actualiza además, aunque el cuerpo también le haya asignado algún campo antes del Delete().
For Each Row: recorrer un DataGridView
For Each Row
// cuerpo — corre una vez por cada fila ya cargada en el subfile
EndFor
Sin Index/Where/When None (no hay tabla que recorrer). Sólo válido dentro de cualquier Event de un Screen con DataGridView. Antes de cada iteración escribe cada Column (incluidas Hidden) en su variable atada — ver DataGridView.
For clásico: contador
For &Variable = inicio To fin [Step incremento]
// cuerpo
EndFor
Cuenta desde inicio hasta fin, incrementando &Variable en incremento en cada vuelta. Step es opcional (default 1); con un Step negativo, inicio debe ser mayor que fin para recorrer hacia abajo.
Recorrer un List
No existe un For Each sobre un list en memoria (For Each In es exclusivo de tablas de base de datos, ver más abajo). Se recorre con el For clásico, usando Count() como límite y el indexado &Variable[&i]:
For &i = 1 To &Lista.Count()
// ... &Lista[&i] ...
EndFor
Ver Tipos de dato: List para la sintaxis completa de Add/Clear/Remove/Count.
New: insertar una fila
New In Tabla
Campo = expr
...
[When Duplicate
// corre si el insert choca con una clave única existente
]
EndNew
If / While
If condicion
...
Else
...
EndIf
While condicion
...
EndWhile
condicion combina comparaciones con And/Or (p.ej. &a = 1 And &b = 2 Or &c = 3). And liga más fuerte que Or (a And b Or c se lee como (a And b) Or c).
Procedure / Function
Procedure Nombre(¶m)
...
EndProc
Function Nombre(¶m) tipoRetorno
...
Return expr
EndFunc
Procedure(sin retorno,subes sinónimo): se invoca conDo Nombre(expr, ...).Function(con retorno, tipo obligatorio justo después de la lista de parámetros — misma sintaxis que@Fields/@Variables): se invoca como expresión,&variable = Nombre(expr, ...), tipado contra&variable.- Un parámetro/retorno puede ser
struct(Template)— ver Tipos de dato: Struct. El argumento pasado debe ser siempre una variable declarada con ese mismo template exacto (nunca una expresión ni un template distinto, aunque tenga los mismos miembros).
Call vs Do
| Sentencia | Uso |
|---|---|
Call(Nombre, expr, ...) | Invoca un programa o pantalla externo (uno de @References/Programs o @References/Screens), resuelto en tiempo de compilación. |
Call("Nombre", expr, ...) | Invoca un programa externo por nombre, resuelto en tiempo de ejecución. |
Do Nombre(expr, ...) | Invoca un Procedure de este mismo archivo (siempre nombre sin comillas). |
Un Screen referenciado en @References/Screens se invoca con Call(Nombre, ...) exactamente igual que un Program — típicamente para mostrarlo como ventana emergente (ver @Properties). El Screen invocado puede declarar @Parameters igual que un Program.
Print("NombreBlock")
Imprime una instancia de un Block de @Layout — ver @Layout. Escribe líneas de 132 caracteres al spool de QPRINT (OVRPRTF + open al inicio, close al final); con Print Mode: Screen el spool además se muestra (DSPSPLF) y se borra (DLTSPLF) al terminar el programa.
Member / Export: reportes con miembros de datos
Member(Tabla, expr)
Export(Tabla, destino)
Ver la guía completa: Reportes con Member()/Export().
Member(Tabla, expr): liga un miembro de datos aTablapara todo el programa (ADDPFM+OVRDBF, antes de cualquieropen). EnProgram, sólo a nivel superior de@Source; enScreen, sólo a nivel superior deEvent Init(ver @Source: Event y Screen). A lo sumo una vez por tabla.Export(Tabla, destino): copia el miembro activo deTablaa un stream file del IFS (CPYTOIMPF, delimitado por coma). Sólo válido enProgram(no enScreen); sin restricción de posición dentro de él.
Return
Return [expr]
Sale de un Function (el valor es obligatorio si se quiere honrar el tipo de retorno declarado).