Para utilizar una función específica, es necesario tomar algunos cuidados. El uso inadecuado puede causar problemas y no conformidades en el funcionamiento del Protheus. A continuación listamos los cuidados básicos:
Nombre de funciones
Evite el uso de nombres de funciones que ya existen en el Protheus estándar en las funciones específicas. Estas deben tener un nombre propio, de preferencia que sigan una regla de composición diferente del uso en los módulos de TOTVS.
Una alternativa es crear una regla de nomenclatura de los fuentes específicos basada, por ejemplo, en el nombre del cliente, en una sigla indicando que se trata de una función personalizada, etc.
No utilice como nombre de sus funciones específicas:
- Por ejemplo, rutinas del estándar, como MATA010, MATA460 y FINA040.
- Obs.: existen algunos puntos de entrada que utilizan los mismos nombres de rutinas del estándar. En este caso, se puede utilizar el mismo nombre.
- Por ejemplo, funciones del estándar como A460Dupl y A460Process.
Nombre de variables
Dentro de las funciones específicas no se deben utilizar variables públicas para atribuir valores u otros fines que no sean aquellos ya previstos por el Protheus. Las variables que se refieren al proceso personalizado que está contenido en la función específica, las mismas que se declararán en ésta, deben ser nuevas y exclusivas.
Como ejemplo de variables públicas estándar que no se deben utilizar con otra finalidad dentro de una función específica, podemos citar a las nOpc y dDataBase, que contienen la opción seleccionada por el usuario dentro de una mBrowse y la fecha base del sistema, respectivamente.
Bloqueo de registros
En muchos puntos de entrada o funciones específicas se actualizan los campos de una tabla. Como ya se describió en la documentación del lenguaje AdvPL, es necesario bloquear el registro que se actualizará.
Después de grabar, es necesario tomar cuidado para no olvidarse de liberar el registro. En caso contrario, cuando el Protheus intente actualizar la misma información, el sistema acusará que el registro está bloqueado e impedirá la actualización, lo que generará trastornos en la ejecución de los procesos estándar del sistema.
Por lo tanto, nunca se debe olvidar de utilizar la función MsUnLock() dentro de un punto de entrada y de una función específica.
Áreas de Trabajo
Cuando se ejecuta una personalización, principalmente un punto de entrada, el sistema ya está posicionado en algunas áreas de trabajo, con su índice y registro también posicionados.
Por ello, una buena práctica de programación es guardar el área de trabajo corriente y las áreas de trabajo que serán manejadas por la función específica.
Para guardar las informaciones de un área de trabajo, se utiliza la función GetArea(). Para restaurarlas, se utiliza la función RestArea().
Veamos el siguiente ejemplo:
USER FUNCTION SF2460I()
Local aArea := GetArea()
Local aAreaSC6 := SC6->(GetArea())
Local aAreaSC5 := SC5->(GetArea())
Local nQtdeVen := 0
Local aFifo := {}
Local nXv := 0
Local aAreaSF2 := SF2->( GetArea() )
Local aAreaSD2 := SD2->( GetArea() )
…
…
…
RestArea( aAreaSD2 )
RestArea( aAreaSF2 )
RestArea(aAreaSC5)
RestArea(aAreaSC6)
RestArea(aArea)
Return Nil