Definición y modificación de métodos en tablas
Cuando se crea una nueva tabla en el Arbol de Objetos de la Aplicación, MorphX automáticamente crea una serie de métodos para ella. Añadiendo código X++ a estos métodos podemos modificar el comportamiento predeterminado del sistema.
Además, podemos definir nuestros propios métodos. Los métodos de sistema y los definidos por el usuario comparten el mismo ámbito, por lo tanto es posible añadir nuevos métodos que pueden ser utilizados desde los métodos definidos por el sistema. Así como acceder a los métodos de sistema desde cualquier nuevo método.
Es importante señalar que no podemos modificar el tipo de retorno, la lista de parámetros o el tipo de dichos parámetros en los métodos definidos por el sistema, aunque podemos añadir parámetros adicionales siempre que declaremos un valor predeterminado para ellos.
Métodos de sistema
Los métodos de sistema son ejecutados cuando se utiliza la tabla, por ejemplo, cuando introducimos, actualizamos o borramos datos.
El cuerpo de estos métodos inicialmente únicamente contiene una llamada al método super(). En capítulos posteriores se describirá con más detalle este método. De momento nos basta con saber que corresponde al comportamiento predeterminado del sistema. Cuando se añade código X++ a los métodos definidos por el sistema, se sobrecarga este comportamiento.
A continuación se presentan la lista de métodos de sistema de una tabla. En apartados posteriores se describirán con más detalle los más importantes.
Método |
Se ejecuta cuando... |
Caption |
se muestra la cabecera de un formulario. El texto se genera a partir de las propiedades de la tabla. |
Clear |
se borran los campos del registro actual (tienen valores NULL). |
Delete |
se elimina un registro. |
HelpField |
se muestra en la barra de estado el texto de ayuda de un campo, por ejemplo cuando pasamos al campo siguiente en un formulario. |
InitValue |
Inicializa los campos de un registro recién creado. |
Insert |
se introduce un nuevo registro en la tabla. |
Merge |
se unen o combinan dos registros. |
PostLoad |
se carga un registro. |
RenamePrimaryKey |
se renombra la clave primaria de la tabla. |
ReRead |
se relee un registro. |
ToolTipField |
el puntero del ratón se sitúa en un campo de un formulario. |
ToolTipRecord |
se va a mostrar un consejo para el campo actual. El método super() realiza una llamada a Caption. |
Update |
antes de modificar un registro existente. |
ValidateDelete |
se va a borrar un registro. |
ValidateField |
se abandona un campo, por ejemplo cuando saltamos al siguiente campo de un registro. |
ValidateWrite |
antes de escribir un registro en la base de datos. |
Métodos de validación en tablas
Los métodos de validación permiten al programador comprobar que se cumplen ciertas condiciones antes de que se ejecute una acción.
En Axapta, se pueden programar métodos de validación a dos niveles:
- Tabla
- Origen de datos de un formulario
Es importante conocer que los métodos de validación de las tablas se ejecutan siempre que se introducen o borran registros. Mientras que si la validación se realiza en el formulario, sólo funcionará cuando estemos trabajando con ese formulario.
- Siempre que sea posible, la validación de datos debe realizarse en la tabla.
Métodos
Los métodos de validación en tablas son los siguientes:
ValidateField
Se ejecuta cuando movemos el cursor desde un campo del formulario a otro, es decir, cuando abandonamos un campo. Devuelve un dato de tipo booleano. Si el resultado es falso, el cursor permanecerá en el campo.
La llamada al método super() comprueba las relaciones de validación, es decir, relaciones en un campo donde la propiedad Validate tiene valor afirmativo. Por lo tanto, debemos respetar la tarea realizada por dicho método super().
- No deben codificarse validaciones que puedan realizarse con alguna propiedad. Así, evitaremos escribir código en el método ValidateField si las condiciones pueden comprobarse con la propiedad Validate de una relación.
ValidateWrite
Se ejecuta antes de insertar o actualizar un registro en la tabla. Devuelve un dato de tipo booleano. Si devuelve falso, el registro no se inserta o actualiza.
La llamada al método super() examina todos los campos para comprobar el valor de la propiedad Mandatory. Por lo tanto, debemos respetar la tarea realizada por dicho método super().
- Evitaremos introducir código que compruebe si un campo tiene valor, siempre que podamos utilizar la propiedad Mandatory.
ValidateDelete
No hay que olvidar, que a menudo también queremos comprobar ciertas condiciones antes de borrar un registro de una tabla. Para hacer esto, utilizamos el método ValidateDelete().
ValidateDelete() se llama automáticamente desde formularios y es utilizado para comprobar si el registro actual puede ser borrado.
La llamada al método super() comprueba si hay registros relacionados en tablas con DeleteActions del tipo Restricted. Si ese es el caso, el método super() devuelve falso. Por lo tanto, debemos respetar la tarea realizada por dicho método.
- Siempre que podamos utilizar un DeleteAction, evitaremos introducir código en el método ValidateDelete.
Estructura de los métodos de validación
Para mantener una buena estructura de programación, es recomendable que el código para las comprobaciones no se sitúe directamente en estos métodos de validación. Es más conveniente que creemos métodos de comprobación que serán llamados desde los métodos de validación anteriormente descritos.
Ejemplo de método de validación
Boolean validateWrite()
{
Boolean ret;
ret = checkSomething() && checkSomethingElse();
return ret;
}
Cuando no se cumple alguna de las condiciones, el método de comprobación debe realizar dos cosas:
- presentar al usuario un mensaje de error
- devolver el valor falso como resultado
El método CheckFailed(‘Mensaje de error’) escribe la cadena de texto que recibe como parámetro en la ventana de información (Infolog) y devuelve el valor falso. Por lo tanto, mediante la utilización de este método, conseguimos simultáneamente los dos objetivos.
Ejemplo de utilización de CheckFailed
Boolean checkSomething ()
{
Boolean ret;
if (!something)
{
ret = checkFailed(‘Something is wrong’);
}
return ret;
}
Podríamos utilizar la estructura anterior, pero existen casos en los que nos interesa comprobar la misma condición Something, presente en el método CheckSomething(), sin presentar ningún mensaje al usuario. En este caso necesitaríamos un método adicional, que comprobara la condición pero que no mostrara ningún mensaje.
Sin embargo, esto no sería muy eficiente, porque estaríamos duplicando el código de comprobación, por lo tanto es más recomendable crear un método llamado Something(), al que podremos llamar cuando queramos, que se encargará de realizar dicha comprobación.
Deberemos, además, cambiar el método CheckSomething(), para que realice una llamada a este nuevo método. El método CheckSomething() lo utilizaremos únicamente cuando queramos mostrar un mensaje al usuario.
Ejemplo de validación completa
Boolean something ()
{
if (!something)
{
return false;
}
return true;
}
Boolean checkSomething ()
{
Boolean ret;
if (!something())
{
ret = checkFailed(‘Something is wrong’);
}
return ret;
}
- Podemos considerar un estándar de nomenclatura de Axapta, la utilización del prefijo Check, en el nombre de todos aquellos métodos que hagan una llamada al método global CheckFailed(). De esta forma sabremos qué métodos presentan mensajes en la ventana Infolog.
Métodos de sistema más utilizados
A continuación vamos a describir algunos de los métodos más utilizados en las tablas, que por su importancia merecen un tratamiento algo más exhaustivo. Los ejemplos de los métodos han sido obtenidos a partir de la tabla CustTable.
InitValue
El método InitValue se ejecuta cuando añadimos un nuevo registro. También es llamado automáticamente desde los formularios. Por lo tanto, utilizaremos el método para asignar valores iniciales o por defecto en un nuevo registro.
Ejemplo
void initValue()
{
CustParameters custParameters;
super();
this.languageId = CustParameters::languageId();
this.currency = CompanyInfo::find().currencyCode;
}
Hay que señalar que la llamada al método super() no hace nada.
Insert
El método Insert se ejecuta cuando se introduce un nuevo registro en la tabla. Es muy importante asegurar cualquier transacción relacionada para asegurar la integridad de la base de datos. Las técnicas de control de transacciones se verán en un capítulo posterior.
Ejemplo
void insert()
{
this.setNameAlias();
super();
}
Si el registro no puede ser insertado en la tabla, la llamada al método super() devuelve un error.
Update
El método Update se ejecuta antes de modificar un registro existente en la tabla. En este caso, también es muy importante controlar cualquier transacción relacionada para asegurar la integridad de la base de datos.
Ejemplo
void update()
{
CustTable this_Orig = this.orig();
ttsbegin;
this.setNameAlias();
super();
this.setAccountOnVend(this_Orig);
if (this_Orig.custGroup != this.custGroup)
ForecastSales::setCustGroupId(this.accountNum,
this_Orig.custGroup,
this.custGroup);
ttscommit;
}
En el ejemplo se utiliza el método orig(). Éste método nos da acceso al registro antes de la actualización.
Delete
El método delete se ejecuta cuando se elimina un registro. Es muy importante asegurar cualquier transacción relacionada para asegurarnos la integridad de la base de datos.
Supongamos dos tablas relacionadas llamadas TableA y TableB. Si en TableA hemos definido un DeleteAction de tipo cascada (Cascade) con respecto a TableB, cuando se borre un registro de TableA se borrarán los registros relacionados en TableB.
Por razones de rendimiento, se debe evitar escribir código en el método Delete de dichas tablas relacionadas (en el ejemplo, TableB). Si no se ha añadido código, los borrados en cascada pueden ser realizados rápidamente por el sistema gestor de base de datos utilizando directamente instrucciones de borrado SQL.
Sin embargo, si añadimos código en esas tablas (lo que puede ser necesario en algunas ocasiones), el sistema crea una instrucción while select y ejecuta el método Delete en todas las tablas hijas relacionadas. De esta forma el rendimiento es menor que cuando utilizamos directamente instrucciones de borrado en SQL.
Volver |