Sintaxis
[ STATIC / USER ] FUNCTION <nome da função> [ ( <lista de parâmetros> ) ]
...
<instruções>
...
RETURN <expressão de retorno>
Propósito
El comando FUNCTION declara una función definida por el usuario (función de usuario) y sus parámetros.
Argumentos
<nome da função >
Define el nombre que identificará la función de usuario declarada. Un nombre puede tener cualquier tamaño, pero solamente los 10 primeros caracteres se utilizan para identificar la función. Se pueden utilizar cualquier tipo de caracteres, incluso números y el signo (guión bajo) underline ( _ ). Por otro lado, un nombre no se puede iniciar con guión bajo.
<lista de parâmetros>
Declara una o más variables para recibir los argumentos pasados a la función. Las variables especificadas en la lista son automáticamente declaradas como locales. Cada nombre de variable se debe separar del siguiente con una coma.
STATIC FUNCTION
Declara una función de usuario que puede ser invocada tan sólo por otras funciones declaradas en el mismo programa. Es decir, en el mismo archivo PRW que contiene su código.
USER FUNCTION
Declara una función de usuario específica que no pertenece al estándar del Protheus. Esta puede ser invocada por cualquier otra función que pertenece al Protheus.
RETURN <expressão de retorno>
Finaliza la función devolviendo el control del flujo de ejecución a la rutina que invocó la función declarada, suministrando el resultado de la expresión de devolución como el valor de la función. Cada función de usuario debe tener como mínimo un comando RETURN que suministre un valor de retorno.
Se pueden incluir diversos comandos RETURN en cualquier punto dentro del cuerpo de la función, de acuerdo con su estructura de programación.
Utilización
El comando FUNCTION permite declarar y construir funciones definidas por el propio usuario, utilizando los recursos del lenguaje AdvPL. Este comando prácticamente abre la arquitectura del lenguaje AdvPL para el usuario, ya que por medio de éste es posible expandirla creando funciones propias, según sea necesario.
Además de permitir la definición para cumplir con la necesidad específica de procesamiento, el comando FUNCTION permite la creación de una biblioteca propia de funciones, que se puede utilizar en todas las aplicaciones desarrolladas en AdvPL.
Una función de usuario se puede entender como un programa formado por un conjunto de declaraciones y comandos que se ejecutan cada vez que se invoque la respectiva función. Una función se identifica por su nombre, seguido por un par de abre y cierra paréntesis, dentro de los que se pueden pasar parámetros o no.
La definición de una función se inicia con el comando FUNCTION y se finaliza con el comando RETURN. Declaraciones de funciones no pueden ser intercaladas por otras declaraciones de funciones.
Por lo general, las funciones se utilizan para contener un bloque de instrucciones que, una vez procesado, suministra un valor como resultado. Este valor se puede utilizar en expresiones en las cuales la función se puede incluir directamente.
La utilización de funciones aumenta la modularidad y la legibilidad del código, facilita la realización de modificaciones y ajustes, así como permite la construcción de aplicaciones complejas con más rapidez.
Las funciones tienen dos clases de visibilidad: públicas y estáticas. Las funciones públicas son visibles en cualquier parte de una aplicación y son declaradas por el comando FUNCTION. Las funciones estáticas son visibles tan sólo por las otras funciones contenidas en el mismo programa (archivo .PRW). Las funciones estáticas son declaradas por el comando STATIC FUNCTION.
Sugerencias
Una función de usuario se llama por medio de la misma notación que las funciones de la biblioteca estándar del Protheus:
<nome da função> ( [ <lista de argumentos> ] )
Si el valor de retorno de la función no es necesario, se debe utilizar la misma sintaxis para colocar la función de usuario sola en una línea de instrucción del programa. En este caso, el valor de retorno de la función se descartará automáticamente por medio del AdvPL.
Una función también se puede invocar por medio de una expresión precedida por un alias. Por ejemplo:
<alias> -> ( <função>(<lista de argumentos>) )
En este caso, se selecciona automáticamente el área de trabajo vinculado al alias especificado y se ejecuta la expresión en la cual está contenida la función. Al finalizar, se selecciona nuevamente el área de trabajo.
Las funciones reciben los parámetros en el orden en que estos son pasados. En el AdvPL, no es necesario que los números de los argumentos pasados sean iguales a los números de parámetros esperados por la función. Cuando los argumentos se pasan, estos se pueden ignorar, dejando su lugar vacío en la lista de argumentos, o simplemente olvidado, lo que deja de ser especificado a la izquierda de la lista de parámetros previstos.
Cuando no se recibe un parámetro, el valor NIL se atribuye automáticamente a la variable que lo recibiría. El parámetro se puede enviar por valor o por referencia.
Ejemplos
El siguiente ejemplo utiliza la función Centra() para devolver un mensaje que se mostrará al usuario:
MSGALERT( Mensag(“Financiero”) )
// Función que seleccionará el mensaje que se debe mostrar al usuario.
FUNCTION Mensag(cTexto)
LOCAL cRet := “”
IF cTexto == “Financiero”
cRet := “Dé baja al título por cobrar o pagar”
ELSEIF cTexto == “Facturación”
cRet := “Facture el Pedido de Venta o el Pedido de Compra”
ELSEIF cTexto == “Compras”
cRet := “Incluya un Pedido de Compra”
ELSE
cRet := “No hay operación disponible”
ENDIF
RETURN cRet
La función Dpc(), mostrada a continuación, suministra, en el formato MMM/AA y en español, el nombre del mes y el año de la fecha pasada como argumento.
FUNCTION Dpc(dData)
LOCAL nAux := 3 * MONTH(dData) – 2
LOCAL cMes := “JANFEVMARABRMAIJUNJULAGOSETOUTNOVDEZ”
LOCAL cDc := “”
cDc := SUBSTR(cMes, nAux, 3) + SUBSTR(DTOC(dData), 6, 8)
RETURN cDc