Usina BRGuía AdvPL
Ingresar
← Todos los temas
FUNDAMENTOPublicado

Bloques de código (CodeBlock)

{ |[parâmetros]| [expressão1, expressão2, ...] }

Crea funciones anónimas almacenables, recibe parámetros y evalúa expresiones bajo demanda con Eval().

CodeBlockBloques de códigoEvalFunciones anónimasExpresiones
01 · DESCRIPCIÓN GENERAL

Descripción general

Un bloque de código es un valor AdvPL de tipo B (Block), similar a una función anónima. Puede recibir parámetros y ejecutar una o más expresiones separadas por comas. Eval() ejecuta el bloque y devuelve el resultado de la última expresión. A diferencia de una función común, su cuerpo admite expresiones y llamadas a funciones, pero no comandos del lenguaje.

02 · SINTAXIS

Sintaxis

{ |[parâmetros]| [expressão1, expressão2, ...] }

Parámetros

parâmetros
ListaOpcional

Nombres entre las barras verticales. Son locales al bloque y reciben los argumentos proporcionados.

expressões
AdvPLOpcional

Una o más expresiones AdvPL separadas por comas y ejecutadas de izquierda a derecha.

retorno
QualquerOpcional

Resultado de la última expresión; un bloque vacío devuelve NIL.

03 · EJEMPLO PRÁCTICO

Bloque simple con retorno

User Function ExBloqueSuma()
    Local bSumar := { |nValor1, nValor2| Abs(nValor1) + Abs(nValor2) }
    Local nResultado := Eval(bSumar, 10, -20)

    ConOut("Resultado: " + CValToChar(nResultado))
Return
Resultado esperado

Eval() proporciona dos argumentos y recibe 30, resultado de la última expresión.

04 · EJEMPLO PRÁCTICO

Varias expresiones

User Function ExBloqueLista()
    Local bCalcular := { |nValor| ConOut("Valor recibido: " + CValToChar(nValor)), nValor * 2 }
    Local nResultado := Eval(bCalcular, 5)

    MsgInfo("Doble: " + CValToChar(nResultado))
Return
Resultado esperado

Las expresiones se ejecutan de izquierda a derecha y el retorno es 10, resultado de la última expresión.

05 · EJEMPLO PRÁCTICO

Ordenación personalizada con ASort

User Function ExOrdenacao()
    Local aNomes := {"CARLA", "ANDREA", "BEATRIZ"}
    Local bDecrescente := { |cNome1, cNome2| cNome1 > cNome2 }

    ASort(aNomes, , , bDecrescente)
Return
Resultado esperado

El bloque compara pares seleccionados por ASort() y permite orden descendente.

06 · EJEMPLO PRÁCTICO

Paso por referencia

User Function ExReferencia()
    Local bIncrementar := { |nValor| nValor += 1 }
    Local nContador := 0

    Eval(bIncrementar, nContador)  // nContador continua 0
    Eval(bIncrementar, @nContador) // nContador passa a 1
Return
Resultado esperado

Sin @, el bloque recibe una copia; con @, el cambio alcanza la variable original.

07 · EJEMPLO PRÁCTICO

Captura de variable local

User Function ExContexto()
    Local nContador := 0
    Local bSomar := { |nValor| nContador += nValor }

    Eval(bSomar, 5)
    ConOut("Contador: " + CValToChar(nContador))
Return
Resultado esperado

El bloque referencia y modifica nContador en el contexto Local donde fue creado.

BUENAS PRÁCTICAS
  • Las llaves delimitan el bloque y dos barras verticales delimitan su lista de parámetros, incluso cuando está vacía.
  • Los parámetros tienen ámbito restringido al propio bloque.
  • Eval(bBloque, argumentos...) ejecuta el contenido; @ permite pasar una variable por referencia.
  • Los bloques se usan en eventos visuales, ordenaciones, evaluaciones y otras API que reciben comportamiento como argumento.
  • Un bloque puede capturar una variable Local visible al crearse y conservar ese contexto mientras siga referenciado.
ERRORES COMUNES
  • { .T. } y { IIF(...) } son arrays de un elemento, no bloques; les faltan las barras verticales.
  • Evita bloques extensos: extrae la lógica a una función y utiliza el bloque para llamarla.
  • La referencia oficial desaconseja llamar una Static Function desde un bloque que pueda ejecutarse en otro fuente, porque nombres estáticos iguales pueden causar comportamiento indeterminado.
  • Conservar durante mucho tiempo un bloque que capturó contexto Local puede retener memoria; elimina sus referencias con NIL cuando ya no sea necesario.
  • Respeta la cantidad de parámetros y el tipo de retorno esperados por la función que ejecuta el bloque.

Contenido relacionado

REFERENCIAS
  1. TOTVS. Bloques de Código. TDN. Creado por Adriana Panseri Santos; última modificación por Julio Wittwer el 11 de septiembre de 2021.
Estado
Publicado
Página creada el
Última revisión el
Idioma original
Portugués
Revisión
Usina.BR