Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Migration of unmigrated content due to installation of a new plugin

Los Bloques de código constituyen un poderoso recurso del AdvPL. Permiten la exportación de pequeños pedazos de código ejecutable de un lugar a otro dentro de la aplicación. El AdvPL trata los bloques de código como valores de datos, permitiendo de esta manera que puedan almacenarse en variables, pasados como argumentos a funciones y utilizarse como una alternativa más eficiente para el operador macro ( & ).

 

Definición

 

La sintaxis utilizada para la definición de un bloque de código es:

...

Las barras verticales ( | | ), que delimitan la lista de argumentos de los bloques de código, son obligatorias, aunque no existan argumentos. A continuación, listamos algunos ejemplos de bloques de código: 

Sem Formato
{ | | “Bloque sin argumentos” }
{ | x | x + 1 }
{ | a, b | Func1(a) + Func2(b) }
{ | i, j, k | Func(i), Func(j), Func(k) }

...

Ejecución de bloques de código

 

La ejecución o evaluación del resultado de los bloques de código se realiza por la función EVAL(), cuya sintaxis es:

...

El siguiente ejemplo muestra la función Mensaje sin la utilización de bloques de código. En este caso, la función depende del tipo de dato pasado.

 

Sem Formato
// Muestra un dato en la pantalla, por una determinada cantidad de veces.
FUNCTION Mensagem(xDado, nVezes)

	LOCAL nRepet := 0

	IF VALTYPE(xDado) == ?"C?"
	// Dato del tipo carácter
		xDado := xDado

	ELSEIF VALTYPE(xDado) == ?"N?"
	// Dato del tipo numérico
		xDado := LTRIM(STR(xDado))

	ELSEIF VALTYPE(xDado) == ?"D?"
	// Dato del tipo fecha
		xDado := DTOC(xDado)

	ELSEIF VALTYPE(xDado) == ?"L?"
	// Dato del tipo lógico
		xDado := IIF(xDado, ?"Verdadero?", ?"Falso?")

	ELSE
	// Otro tipo de dato
		xDado := ?"Indefinido?"
	ENDIF

	FOR nRepet := 1 TO nVezes
		MSGALERT(xDado)
	NEXT nRepet

RETURN

 

 

 

Para dejar la función Mensaje más genérica, independientemente del tipo de dato pasado, podrían utilizarse los siguientes bloques de código: 

Sem Formato
bCarCod   := { | xDado | xDado }
bNumCod   := { | xDado | LTRIM(STR(xDado)) }
bLogCod   := { | xDado | IF(xDado, “Verdadero”, “Falso”) }
bDatCod   := { | xDado | DTOC(xDado) }

 

...

 

Pasando los bloques de código definidos anteriormente, la función Mensaje podría tener la siguiente forma: 

Sem Formato
// Muestra un dato en la pantalla, por una determinada cantidad de veces.
FUNCTION Mensagem(xTexto, bBloco, nVezes)


LOCAL nRepet := 0


FOR nRepet := 1 TO nVezes
          MSGALERT(EVAL(bBloco, xTexto))
NEXT nRepet


RETURN

...

Los bloques de código no pueden almacenarse directamente en campos de archivos de datos, a menos que se transformen en variables del tipo carácter. Para utilizarlos posteriormente, se utiliza el operador macro ( & ), de acuerdo con el siguiente ejemplo: 

Sem Formato
FUNCTION Mensagem()

LOCAL bBloco := “”

// Graba el bloque de código en el campo de la Tabla SE2 (Título por pagar) como una variable carácter
SE2->E2_TEXTO := “ { |xDado| Func1(xDado) } ”

// Atribuye el bloque de código a la variable bBloco
bBloco := &(SE2->E2_TEXTO)

// Ejecuta el bloque de código almacenado en la variable bBloco
EVAL(bBloco, xDado)


RETURN NIL

...