11/17 Methods (find, exist, findRecId)


Los métodos en las tablas son porciones de código que ejecutan acciones relacionadas con la tabla.

¿Cómo haremos para crearnos un método?
Situándonos encima del nodo Methods y botón derecho para abrir el submenú.


.

Tenemos tres submenus importantes:

Ver código: Nos permitirá ver el código del método en el que estemos situado (Lo mismo que hacer doble-click en un método).
Anular método: Anulará el método que seleccionemos entre los existentes por defecto en Ax.
Nuevo método: Nos permitirá crear un nuevo método.

Lo primero que explicaré sobre los métodos es como crear uno nuevo desde cero; para el ejemplo aprovecharé para crear los métodos que las buenas prácticas de Microsoft indica que se han de crear en todas las tablas. Éstos son los métodos find y exist; incluiré para la versión 2012 el findRecId ya que muchas de las relaciones del actual Ax es sobre RecId's.

Siguiendo con la explicación, en el submenu presionamos Nuevo método. Nos aparecerá algo como lo que vemos en la imagen.



Método Find

Un método find se utiliza para recuperar un registro de la tabla pasándole por parámetros los campos que forman el índice principal de ésta, se acostumbra a utilizar el índice que no permite duplicados.



En la imagen tenéis como quedaría el método find para nuestra tabla FarmTable.



Si no entendéis lo que estáis viendo y como lo hemos hecho, lo explicaremos paso a paso.

Empezaremos por la estructura del método:
En la primera línea tenemos la cabecera del método la cual está estructurada de la siguiente manera.

Tipo de método + valor de retorno + nombre del método
static + FarmTable + find


En la primera línea dentro del método nos declaramos una variable de la tabla que vamos a devolver y en la última línea un return con la tabla que devolveremos.

static FarmTable find()
{
FarmTable farmTable;

return farmTable;
}


Los parámetros que recibe el método son: el índice de la tabla que no permite duplicados, los campos que lo componen y un boleano para indicarle si el registro devuelto será utilizado para actualizarse.

El/los campo/s que forman el índice único.

static FarmTable find(
FarmId _farmId,
Boolean _forUpdate = false)



La siguiente parte del método lo que hace es comprobar si se le ha pasado valor por parámetros (Evidentemente si el índice es único y está marcado como mandatory no permitirá valores en blanco),

if (_farmId)


Aquí comprobamos si le hemos indicado por parámetros que el registro será actualizado, en caso afirmativo, en el SelectForUpdate se lo indicaremos.

if (_forUpdate)

farmTable.selectForUpdate(_forUpdate);

Al final le haremos un select con la sintaxis que se ve para recuperar el registro.

Select firstOnly farmTable
index hint Farmidx
where farmTable.Farmid == _farmId;


¿Cómo llamaremos a los métodos estáticos de la tabla?

Como a cualquier método estático de la aplicación NombreDelObjecto::MétodoEstático
En la imagen veréis un ejemplo de como llamar a un método estático.

Fijaos que Ax nos indica los parámetros que tiene el método, si nos fijamos el parámetro _forUpdate está entre corchete, eso le indica que no es obligatorio en caso de no pasarle valor tomará el que tiene por defecto en el método find.




Si ejecutamos el job veremos que la segunda variable (FarmTableUpd) está preparada para ser actualizada(podemos hacerle un update), si intentáramos actualizar la primera Ax nos mandaría un error.






Método FindByRecId/FindRecId

Idéntico al método find pero utilizando el campo Recid




Método exist

El método exist se utiliza para devolver si existe un registro en la tabla, la base es la misma que la del Find pero en este caso devolviendo un boleano. En la imagen tenemos como quedaría dicho método.



Entiendo que el método exist pueda verse raro y no entenderse por eso lo explicaré.

Supongo que se entiende que el método recibe por parámetros un FarmId(Campos del índice) y retorna un boleano (True, False)

El select nos devolverá un RecId (si recordáis un RecId es un campo de tipo Int64), así que siempre que encuentre un registro devolverá un valor.

Select FirstOnly RecId
from farmTable
index hint Farmidx
where farmTable.Farmid == _farmId


Si leemos un poco más e intentamos entender esta expresion veremos que es muy simple, lo que realmente hacemos es comparar dos valores, lo que hay entre los parentesis nos devuelve el recId que encuentre de la tabla FarmTable y el .RecId posterior al paréntesis le indica que queremos que nos devuleva el valor del campo RecId.

Lo que al final estamos comparando es lo siguiente:

Un recId (Ej: 45784211) != 0

Esto realmente es una expresión true o false.

(select firstOnly RecId
from farmTable

index hint Farmidx
where farmTable.Farmid == _farmId).recId != 0

Para acabar entenderemos la expresión del método.



return _farmId
&& (select firstOnly RecId


from farmTable
index hint Farmidx
where farmTable.Farmid == _farmId).recId != 0;


Recordamos que para Ax si una variable tiene valor en una condición sería true. Así que lo que hace Ax en esta sentencia es: return _farmId && (true/false) y recordad que _farmid será tratado como un boleano dependiendo de si  tiene valor con lo que nos quedaría algo como; return (true/false) && (true/false).
Espero que estos métodos simples se hayan entendido.


















  



Comentarios