Re: [k2btools] Paginado manual en WebPanelDesigner

Muchas gracias Federico,

te respondo recién ahora porque no había tenido tiempo de probar lo que me pasaste. Te cuento que me vino bárbaro la doc y me sirve para lo que quería hacer. Entendí el tema de saltear algún registro cuando el for each lo resuelve genexus, utilizando &LoadRow_<GridName>, y la opción de cargar una grilla sin tabla base a partir de un SDT o un DataProvider. Con esto por ahora puedo cargar las grillas que quiero. De todas formas aprovecho para preguntarte como sería el caso de querer cargar la grilla sin tabla base a partir de un "for each mio". Por lo que veo de la sub 'U_LoadRowVars(GridName)' se va llamando para cargar una a una las lineas de la grilla, entonces una forma que encontré de usar un for each sería algo así:

    if (&I_LoadCount_Grid = 1)
        &OrdIdUlt = 0
    else
        for each OrdId
        where OrdId > &OrdIdUlt
        defined by OrdFchIng
            &MsgDesc = OrdMsg
            &OrdIdUlt = OrdId
            exit
        when none
            &Exit_Grid = True
        endfor
    endif

O sea, iría ejecutando cada vez un for each para ir trayendo los registros de a uno hasta no tener mas. Sin embargo dependiendo de la cantidad de registros que tenga eso no parece muy performante. Cual sería otra forma de usar un for each propio como me comentaste en tu mail anterior? Está previsto este uso sin perder el paginado automático y no me di cuenta como hacerlo? Porque la otra que tengo es hacer un for each con el comando "load" dentro de la de la sub 'U_LoadRowVars(GridName)'  para el (&I_LoadCount_Grid = 1) y luego setear &Exit_Grid = True pero ahí pierdo el control del paginado manejado por el designer.

Saludos,
Pablo.

El 9 de agosto de 2012 12:05, Federico Dominioni <fdominioni@k2business.com> escribió:
Hola Pablo, te respondo:

Cuando definís una grilla con variables, tenes dos casos, uno con foreach inferido (se genera automáticamente el ForEach).
Además de esto puedes controlar que determinado registro que cumple las condiciones del foreach no sea cargado en la grilla.
Esto lo puedes hacer en la subrutina 
U_LoadRowVars(GridProduct)

Para decidir que determinado registro no sea cargado lo que tienes que hacer es setear la variable &LoadRow_<GridName>
en false. 

Esta es una forma que tienes de restringir la carga de registros en la grilla.

La otra forma que tienes es que el foreach no sea inferido, por tanto el WebPanelDesigner no genera el foreach y vos manualmente tenes que hacer la carga, ya sea de un SDT, DataProvider o con algún foreach propio.


Te paso un ejemplo de documentación en beta que explica como es el funcionamiento de dicha grilla abajo. Cualquier cosa a las órdenes y gracias por el SAC.

Saludos.

Este tipo de grillas se utiliza cuando se cargan datos desde un DataProvider, SDT u otras fuentes de datos distintas a la base de datos.

 

Nos encontramos ante este tipo de grilla cuando no se tiene ningún atributo en grilla y además no se pudo inferir el foreach asociado. En estos casos el editor intenta subsanar los problemas de carga de la grilla, paginado, filtros, etc, mediante el siguiente evento load:

 

 

 

Event GridProduct.Load

      // ---- K2BTools - Do Not Change, Native Method ----

      If &Reload_GridProduct = False

            For Each line In GridProduct

                  Load

            EndFor

      Else

            &LoadCount_GridProduct = 0

            &HasNextPage_GridProduct = False

            &Exit_GridProduct = False

            Do While True

                  &LoadCount_GridProduct += 1

                  If (&LoadCount_GridProduct > 10 * &CurrentPage_GridProduct)

                        &HasNextPage_GridProduct = True

                        exit

                  EndIf

                  Do 'U_LoadRowVars(GridProduct)'

                  If (&Exit_GridProduct = True)

                             exit

                  EndIf

                  If (&LoadCount_GridProduct > (10 * (&CurrentPage_GridProduct - 1)) and &LoadCount_GridProduct <= (10 * &CurrentPage_GridProduct))

                        Load

                  EndIf

            EndDo

            Do 'UpdatePagingControls(GridProduct)'

      EndIf

EndEvent

 

 

El evento realiza un Do While en el cual administra la carga de la grilla invocando la subrutina 'U_LoadRowVars(<GridName>)' en la cual el desarrollador deberá cargar las columnas de la misma.

Para finalizar la carga (salir del Do While) se deberá setear la variable &Exit_<Gridname> en True, en caso de no setear esta variable la ejecución entrara en un loop infinito.

 

La variable &LoadCount_GridProduct se utiliza como índice.

 

Veamos un ejemplo de cómo cargar este tipo de grilla a partir de un SDT:

 

Usaremos la variable &ProductToPurchase para guardar el SDT en pantalla.

 

 

 

Sub 'U_LoadRowVars(GridProduct)'

// &LoadCount_GridProduct - 1: Number of record loaded in grid Do not change variable value)

// &Exit_GridProduct: Set to True when finish load or when there aren´t more records to load     

      If &LoadCount_GridProduct = 1

//Si es la primera vez que el load invoca el método cargo el sdt desde //la variable en pantalla.

            &ProductToPurchase.FromXml(&ProductSDTXml)

      EndIf

If &LoadCount_GridProduct > &ProductToPurchase.Count

// Si ya se cargó todo el SDT me voy.

            &Exit_GridProduct1 = True

      Else

// Seteo las variables de la grilla con el valor del ítem que se encuentra en el lugar &LoadCount_GridProduct.

&ProductToPurchaseItem = &ProductToPurchase.Item(&LoadCount_GridProduct)

            &SelectedProductId = &ProductToPurchaseItem.ProductId

&SelectedProductDescription = &ProductToPurchaseItem.ProductDescription

            &SelectedProductPrice = &ProductToPurchaseItem.ProductPrice

&SelectedProductQuantity = &ProductToPurchaseItem.ProductQuantity

&SelectedProductTotal = &ProductToPurchaseItem.ProductLineTotal

EndIf

EndSub








El 8 de agosto de 2012 19:14, Pablo Timbal <ptimbal@gmail.com> escribió:

Hola Federico,

Si exacto, recién me estaba por "autoresponder" que estoy haciendo eso, usar una grilla con variables en vez de una con atributos y me quedó andando el paginado como decís vos, sin la cantidad de páginas totales, pero de todas formas no molesta tanto mientras se pueda paginar.

Aprovecho para preguntarte como funciona bien el tema de una grilla sin tabla base.

Lo que yo hice fue definir la grilla con variables indicándole en la propiedad "Load from attribute" el valor TRUE y en las "Advanced Conditions" de la grilla agregué todos los filtros que WHERE que necesitaba.

Primero traté de poner Load from attribute en FALSE pero no supe donde hacer el load a la grilla, traté de hacer mi for each en la subrutina "U_LoadRowVars(Grid)" pero no me funcionó bien. Esta subrutina de usuario está pensada para esto? Por ejemplo si quiero condicionar lo que cargo en el load con algún IF , o hacer un corte de control, o cualquier otra cosa que haría normalmente en un webpanel hecho a mano en el evento LOAD como lo tendría que hacer?

Saludos,
Pablo.

PD:
Lo del PageCount = -1 pienso que viene por el lado de este SAC  # 24444
Descripción : No funciona RecordCount en Grid condicionado por formula
Abstract
Se tiene un Grid con tabla base y se filtra el grid de acuerdo a un att. formula del Grid, el RecordCount no funciona correctamente
Descripción Detallada
Los registros que quedan excluidos por no satisfacer la condición (p.e. AttFormula = true), igual son contados por el RecordCount, pero la grilla se filtra correctamente.
El Select generado no incluye dicho filtro.
SELECT COUNT(*) FROM [Trn156599] WITH (NOLOCK)
No funciona ni en .NET ni en Java.
NOTA:
El problema en este caso es que no se puede resolver este recordcount en el server, y resolverlo en el cliente tendria un alto costo de procesamiento.
A partir de u8 de Ev1, se hace un fix, que consiste en que retorne -1 el recordCount en este caso (como en todos los demás casos que ya tenemos que retorna -1 cuando no se puede resolver el recordCount con un COUNT sobre el server).


El 8 de agosto de 2012 18:52, Federico Dominioni <fdominioni@k2business.com> escribió:

Hola Pablo, ¿cómo andas?

¿está bien que el grid.pagecount de -1? o es un bug de GX.

La alternativa que tenes usando el webpaneldesigner es crear la grilla sin tabla base. Al tenerla así no va a ejecutar la función grid.pagecount. Tampoco te va a mostrar la cantidad de registros que te quedan, va a ir avanzando hasta que no encuentre más.

Estaba pensando en que algo que podría brindar el web panel designer es la capacitad de cuando la grilla no tiene tabla base permitirle al usuario setear en alguna subrutina la cantidad de páginas que registros que se van a cargar y en función de eso mostrar ese valor.... pero por el momento la solución es usar la grilla sin tabla base, te va a paginar bien pero no te va a mostrar cuantos registros quedan.

Saludos.

El 8 de agosto de 2012 14:59, Pablo Timbal <ptimbal@gmail.com> escribió:

Hola,

Hay posibilidad de redefinir el paginado en forma manual en un objeto
hecho con K2bWebPanelDesigner?

El problema que tengo es que uso un par de funciones en las conditions
para cargar la grilla y como no se puede resolver el count del número
de registros en el server, el Grid.PageCount devuelver "-1". Entonces,
lo que haría en un webpanel hecho todo a mano sería hacer un for each
en el refresh para contar la cantidad de registros y luego usar ese
valor obtenido en el paginado.

Saludos,
Pablo.



--
___________________________
Ing. Federico Dominioni
fdominioni@k2business.com | www.k2btools.com

   
¿Ya se suscribió a las noticias K2B Tools?





--
___________________________
Ing. Federico Dominioni
fdominioni@k2business.com | www.k2btools.com

   
¿Ya se suscribió a las noticias K2B Tools?


--
Has recibido este mensaje porque estás suscrito al grupo "GeneXus" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a genexus@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a genexus+unsubscribe@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/genexus?hl=es.

0 Response to "Re: [k2btools] Paginado manual en WebPanelDesigner"

Publicar un comentario