Posted: Wed Dec 07, 2005 7:26 pm Post subject: Columna de saldo en grid de transacciones
//**********************************************************
// Tipo : Desarrollo
// Titulo : Columna de saldo en grid de transacciones
// Codigo : TD0001
// Keywords : Programacion, Axapta 2.5, Axapta 3.0
// Sub-keywords : metodo display, columna acumulado, columna saldo
//**********************************************************
Hola a todos,
Este es el primero de una larga lista de trucos/consejos.
Este en concreto nos llega de la mano de David, desde aquí le damos las grácias
En fin, vamos al tema ...
Imaginad que necesitais mostrar al usuario en un formulario una lista de transacciones.
Hasta aquí bien, pero ... imaginad que lo que quieren es ver las transacciones con su fecha, su importe y una columna con el saldo (suma de todas las transacciones anteriores hasta esa).
Aqui ya se complica un poco, pero ... es que ademas ... quieren poder ordenar las transacciones (el simple click en el título de la columna del grid) y que la columna saldo se recalcule en función del nuevo orden ...
(ver columna acumulado de la imagen)
Pues bien, esto lo realizamos mediante un "campo calculado", osea, un método de tipo display en el datasource del formulario.
Para este truco hemos creado una tabla y un formulario (podeis descargar el proyecto en la zona de descargas).
Basicamente la idea consiste en : Cada vez que tengamos que calcular el saldo de una transacción realizaremos una consulta a la base de datos calculando la suma de las transacciones anteriores e iguales a esta según las claves de ordenación que esten activas en el grid en ese momento.
A continuación expongo el código del método display en cuestión :
x++:
Display Amount Acumulado(PruebasAcumulados _PruebasAcumulados) {
Query Query;
QueryRun _QueryRun; // Para ejecutar nuestra consulta
QueryBuildDataSource Qbds; // Para acceder a la consulta actual
QueryBuildDataSource _Qbds; // La usamos en nuestra consulta int i;
FieldId FieldId;
FieldId FId;
PruebasAcumulados __PruebasAcumulados;
Amount Resultado = 0;
SortOrder SortOrder;
;
// Accedemos al QueryBuildDataSource del query principal del formulario (mediante el formdatasource) // lo hacemos porque mas adelante desearemos saber como estan ordenados los datos en este momento
Qbds = PruebasAcumulados_Ds.queryRun().query().dataSourceTable(TableNum(PruebasAcumulados));
// Vamos a crear un query para realizar nuestra consulta
Query = new Query();
// Creamos el QueryRun
_QueryRun = new QueryRun(Query);
// Añadimos la tabla
_Qbds = _QueryRun.query().addDataSource(TableNum(PruebasAcumulados));
// Aqui le indicamos que no queremos que use todos los campos en la consulta, ya le diremos nosotros // que campos debe usar
_Qbds.fields().dynamic(false);
// Aqui le indicamos el campo que queremos y como lo queremos // Es decir .... le estamos diciendo : Select sum(Amount) ...
_Qbds.fields().addField(Fieldnum(PruebasAcumulados,Amount),SelectionField::Sum);
// Comprobamos el orden de los datos actualmente en el Formulario ... // Si no hay orden establecido ... usaremos el recid if(Qbds.sortFieldCount() == 0) {
_Qbds.addRange(FieldNum(PruebasAcumulados, RecId)).value('..'+Int2Str(_PruebasAcumulados.RecId));
} else { // Aqui vamos a tener que recorrer las claves de ordenación de la consulta actual for(i = 1 ; i <= Qbds.sortFieldCount() ; i++) { // Que campo es ?
FieldId = Qbds.sortField(i);
FId = FieldExt2Id(FieldId);
// Orden Ascendente o descendente ?
SortOrder = Qbds.sortDirection(i);
// Ahora añadimos rangos a nuestra consulta en función de si el orden actual // era ascendente o descendente if(SortOrder == SortOrder::Ascending)
_Qbds.addRange(FId).value('..'+QueryValue(_PruebasAcumulados.(FId)));
else
_Qbds.addRange(FId).value(QueryValue(_PruebasAcumulados.(FId))+'..');
} }
// Lanzamos nuestra consulta // Nota : si lo hemos hecho bien tan solo deberia devolvernos un registro // recordad (select sum(amount)...), pero por si las flys .... // recorremos todo lo que devuelva while(_QueryRun.next()) {
__PruebasAcumulados = _QueryRun.get(tableNum(PruebasAcumulados));
Resultado += __PruebasAcumulados.Amount;
}
Return Resultado;
}
Bien, he intentado comentar bastante el código para que se vea que intentamos hacer en cada momento, de todas formas, si alguien tiene alguna duda ... pues ... para eso estan los foros .
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
Axapta y Dynamics Ax son marcas registradas de Microsoft corporation. Todos los logos y marcas son propiedad de sus respectivos propietarios. Excepto trucosAx.com que este si que es mio :-). (c) 2005 by Manel Querol (Mkz) TrucosAx.com no pertenece ni está asociada a Microsoft corporation. Los fragmentos de código y proyectos importables que aquí se muestren están realizados sobre bancos de pruebas. No nos hacemos responsables de cualquier daño o pérdida de datos que se pudiera originar del hecho de instalar alguno de estos ejemplos en un sistema productivo. Es responsabilidad del usuario ser consciente del impacto que puede ocasionar en sus aplicaciones el uso del código que de aquí extraiga.