Algoritmia - We are geeks, after all ;)
  Crear una cuenta
Inicio Buscar Foros Chat Downloads Login
 [Login]
Foros
Ir a los foros 

Menú Trucos Ax
 Inicio(Noticias) :
 Inicio
 Enviar Noticias
 Archivo de noticias
 Buscar
 Temas

 Miembros :
 Lista de miembros
 Tu Cuenta(Regístrate)

 Comunidad :
 Chat

 Foros

 Links

 Downloads

 Estadísticas :
 Estadísticas
 Top 10
 Encuestas

 Otros Servicios :
 Publicidad


 Miscelanea :
Añadir a favoritos
Contactar


Hemos recibido

impresiones desde Diciembre 2005


 Enlázanos :
Copia el código siguiente en tu web para enlazarnos :


Trucos Ax


Mensajes rápidos

Sólo los usuarios registrados pueden escribir login o crear una cuenta.

Trucos
Ir a trucos programación
Ir a trucos consultoría

AxSearch

AxSearch
Es un motor de búsqueda
específico sobre temas
de Axapta (Dynamics Ax)

Anuncios



Mapa

¿De donde venimos?
Ubicación de visitantes de esta página

Webs Amigas
[axapta-links.com] - The startpage for Axapta
DaxGuy


Fred Shen

Comunidad Ax
Conunidad AX

Anuncios



Trucos Ax: Foros

Trucos Ax :: View topic - Columna de saldo en grid de transacciones
 Forum FAQForum FAQ   SearchSearch   UsergroupsUsergroups   ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Columna de saldo en grid de transacciones

 
Post new topic   Reply to topic    Trucos Ax Forum Index -> Trucos desarrollo
View previous topic :: View next topic  

Crees que es útil este truco ?
Si
100%
 100%  [ 4 ]
No
0%
 0%  [ 0 ]
Total Votes : 4

Author Message
Manekaze
Site Admin
Site Admin


Joined: Dec 02, 2005
Posts: 384

PostPosted: Wed Dec 07, 2005 7:26 pm    Post subject: Columna de saldo en grid de transacciones Reply with quote

//**********************************************************
// 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 Wink

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 Very Happy .


Grácias.
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Trucos Ax Forum Index -> Trucos desarrollo All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©

 
Trucos Axapta 
Comunidad aprobada por :
Microsoft corp. MVP LogoVisit community


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.