Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Un Nuevo Control WGridFilter (bueno, Dos)
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Un Nuevo Control WGridFilter (bueno, Dos) 
 
A raíz de una consulta a la lista internacional, he hecho publico uno (bueno dos) de los nuevos controles que he hecho para el trabajo últimanente. wGrid y wGridFilter.
Son muy similares a los que hay en los dbControles o "Controles enganchados" pero con una diferencia: no dependen de una base de datos. Se podrían definir como: "
Un gridview que muestra un array de dos dimensiones, colección o result, con ordenación de las columnas y filtrado simple de los datos"

Tóma ya.

La necesidad de ésto me surgió por dos lados, de uno, hay consultas muy lentas a Bases de Datos, que no son de recibo en los controles enganchados porque en ellos cada vez que filtras u ordenas hay que volver a recurrir a la base de datos y eso lo hace todo super lento. Por tanto decidí hacer un control que haga lo mismo que los conocidos dbGrid y dbGridFilter, pero sin depender de una base de datos.

Tienen una propiedad Source tipo Variant de donde se toman los datos, que puede ser un variant[] de string[], es decir un array de arrays de textos, o un array de colecciones o directamente un result (como se usa en el ejemplo).

En caso del Array[][] se usa directamente (hay una propiedad boolean, setheads,con la que puedes usar la primera línea del Array como cabeceras, pensada para cuando se pasa un array[][] basado en un CSV.
En caso de Collection[] se usan las claves como cabeceras y los contenidos, convertidos a string, como celdas.
En caso de Result, se usan los nombres de campo como cabeceras y el contenido como celdas y sólo se recurre a la base de datos una vez.

Tiene también la propiedad Titles que es un string[] para personalizar las cabeceras, WordWrap para textos completos, y demás.

La propiedad Value devuelve una colección con el título de la columna como clave y el contenido de las celdas de la línea seleccionada como valores.

En el traspaso y simplificación (siempre necesarios porque la escribí para el curro) puede que se me haya colado algún bug, que agradecería que me comunicaseis.

Espero que os sea útil.

wGridFilterSample-0.1.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: wGridFilterSample-0.1.1.tar.gz
Tamaño: 33 KB
Descargado: 45 veces
wGridFilterSample-0.1.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: wGridFilterSample-0.1.1.tar.gz
Tamaño: 33 KB
Descargado: 45 veces
wGridFilterSample-0.1.1.tar.gz
Descripción:  
Descargar
Nombre del archivo: wGridFilterSample-0.1.1.tar.gz
Tamaño: 33 KB
Descargado: 45 veces

 




===================
No podemos regresar
 
última edición por shordi el Viernes, 23 Junio 2017, 18:41; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
Si miráis el código veréis que se compone de dos clases distintas: hay una clase wGrid, que es la que maneja los datos y las ordenaciones y wgridfilter, que añade el tema de los filtros.
Podéis usar ambas por separado, claro. Si necesitáis sólo una visualización de datos, sin filtrados y demás, usad wgrid sola, siempre será más rápida que la otra con su mecanismo de filtros.

Saludos.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
Lo he subido a la granja con un pequeño bug corregido. Por si a alguien interesa
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
buenisimo, mi pequeña primera contribucion, gracias a ti ahorre mucho trabajo, tabien con lso dbcontroles..

1) en el caso de sqlite, los nombres de campos se devuelven <table>.<column> en vez de solo <column> por tanto en solo 3 partes cambias el codigo ylisto:

es la linea 227 de wGridfilter:

clave = $Grid.rslt.Fields[n].Name
 


se necesita poner:
detectar = Split($Grid.rslt.Fields[n].Name, ".")
 clave = detectar[detectar.Max]
 


en el wgridform en linea 385

        For c = 0 To grid.rslt.Fields.Count - 1
            detectar = Split(grid.rslt[grid.rslt.Fields[c].name],".")
            linea &= "\"" & detectar[detectar.Max] & "\";"
        Next
 


y finalmente wgrid en 286:

                detectar = Split(value.Fields[f].Name, ".")
                Me.Columns[f].Title = detectar[detectar.Max]
 


esto solventa el que ponga en los titulos "tabla.titulo" y solo ponga "titulo"


lo segundo es que voy modificar para que se pueda usar como lib, esto porque no siempre tendremos el password de root para instalar como componente y asi yo lo pueda usar en gambas 3.5

NOTA: el de odbc que subiste explota con freetds, puesto no podemos hacer Move to en un cursor foward only
 



 
mckaygerhard - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
pregunta, no encuentro la documentacion para <gridview>Rows.Selection solo rows...
 



 
mckaygerhard - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
mckaygerhard escribió:  
buenisimo, mi pequeña primera contribucion, gracias a ti ahorre mucho trabajo, tabien con lso dbcontroles..

1) en el caso de sqlite, los nombres de campos se devuelven <table>.<column> en vez de solo <column> por tanto en solo 3 partes cambias el codigo ylisto:

es la linea 227 de wGridfilter:

clave = $Grid.rslt.Fields[n].Name
 


se necesita poner:
detectar = Split($Grid.rslt.Fields[n].Name, ".")
 clave = detectar[detectar.Max]
 


en el wgridform en linea 385

        For c = 0 To grid.rslt.Fields.Count - 1
            detectar = Split(grid.rslt[grid.rslt.Fields[c].name],".")
            linea &= "\"" & detectar[detectar.Max] & "\";"
        Next
 


y finalmente wgrid en 286:

                detectar = Split(value.Fields[f].Name, ".")
                Me.Columns[f].Title = detectar[detectar.Max]
 


esto solventa el que ponga en los titulos "tabla.titulo" y solo ponga "titulo"


lo segundo es que voy modificar para que se pueda usar como lib, esto porque no siempre tendremos el password de root para instalar como componente y asi yo lo pueda usar en gambas 3.5

NOTA: el de odbc que subiste explota con freetds, puesto no podemos hacer Move to en un cursor foward only


Eso que has hecho con el nombre de los campos... mmmm... dudoso. Hay nombres de campo que contienen puntos, con lo que el resultado no es predecible. Hay campos que se llaman igual en dos tablas relacionadas de la misma consulta. Si quitas la referencia pierdes todo eso.

Para evitar ese problema tienes la propiedad Titles que es un string[] con las cabeceras de columnas. Esto te permite también "embellecer" el aspecto del grid. Así un campo llamdo dni, por ejemplo, puedes establecer una cabecera D.N.I., un campo f_nacimiento, lo estableces a Fecha de Nacimiento o F. Nacimiento, etc.

La filosofía es: Usa los nombres de campos como cabeceras si no se provee una cabecera específica

Saludos.
 




===================
No podemos regresar
 
última edición por shordi el Martes, 20 Junio 2017, 08:01; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
shordi escribió:  
de los campos... mmmm... dudoso. Hay nombres de campo que contienen puntos

AH POR FAVOR crear un campo con un punto o con "ñ" es una atrocidad..
esto que yo puse solo ocurre con sqlite.. en el resto de las DB no ocurre..

Citar:
Hay campos que se llaman igual en dos tablas relacionadas de la misma consulta.

la unica DBMS que permite esta otra atrocidad mejor llamada "ambiguedad" es MSSQL y MYSQL, esto no deberia ser en ninguna consulta.. el estandar SQL tampoco lo permite

otra pregunta: Me.Rows.Selection.Find o $Grid[$Grid.Rows.Selection[c], n] no puede emularse de otra forma? es porque en los daruma, gambas 3.9 no compila, usan gambas 3.1 y 3.5, en 3.5 fiunciona bien el componente y los controles tuyos, pero en 3.1 no..

NOTA: los darumas son equipos pequeños, que aguantan mucho maltrado, soportan fulctuaciones de electricidad eso me ahorra coste, si pongo compilar gambas 3.9 pide actualizar muchas cosas, lo cual es ilogico apra un equipo que no se conecta nunca a internet y solo conecta con un servidor local.. ademas solo tiene 512Mb ram y ningun linux moderno funciona alli..
 



 
mckaygerhard - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
Citar:

AH POR FAVOR crear un campo con un punto o con "ñ" es una atrocidad..
esto que yo puse solo ocurre con sqlite.. en el resto de las DB no ocurre..

En MySql y oracle, hasta donde recuerdo, también se permite. Recuerda que wGrid no trabaja con campos de tablas, trabaja con el resultado de una sentencia SQL que incluye la gestión de alias (por ejemplo: select id_producto as `Id. Producto`, ano as `Año`) y caracteres especiales como estándar desde el año 92.

Citar:
la unica DBMS que permite esta otra atrocidad mejor llamada "ambiguedad" es MSSQL y MYSQL, esto no deberia ser en ninguna consulta.. el estandar SQL tampoco lo permite

Eso es, simplemente falso. ¿Me estás diciendo que tu amado sybase no permite que si tienes trescientas tablas no puedes repetir ningún nombre de campo en ninguna? No me lo creo. Si el estándar no permitiese eso ¿para qué se implementan las referencias de pertenencia nombredetabla.nombredecampo? Si no se pueden repetir nombres es absolutamente inútil todo ese mecanismo.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
shordi escribió:  
trabaja con el resultado de una sentencia SQL que incluye la gestión de alias (por ejemplo: select id_producto as `Id. Producto`, ano as `Año`) y caracteres especiales como estándar desde el año 92.

nada que ver, tranquilo, el parche propuesto por mi no es afectado por esto que dices.. cuando realizas esto el modulo/componente obtiene solo el nombre de columna.. el error o inclusion de nombre de tabla courre solo y unicamente con sqlite.. desde que fue reescrito el componente

que crees, que no probe intensamente eso? funciona de maravilla, creeme cuando dije que me ahorraste una semana de trabajo.. esa idea de la colleccion fue una maravilla... yo la habia hecho pero un paso extra, usando sqlite por medio.. ya lo elimine y estoy aprendiendo de tu componente/control...

Citar:
Eso es, simplemente falso. ¿Me estás diciendo que tu amado sybase no permite que si tienes trescientas tablas no puedes repetir ningún nombre de campo en ninguna? No me lo creo. Si el estándar no permitiese eso ¿para qué se implementan las referencias de pertenencia nombredetabla.nombredecampo? Si no se pueden repetir nombres es absolutamente inútil todo ese mecanismo.


si permite referencias a tabla.campo. yo me referia a
tabla."campo.nombre"
con las comillas permite mysql que el nombre en si tenga un punto o una "ñ"
ojo me refiero al nombre de campo con "ñ", o algo asi tabla."cam.po" no lo permite me dice que el sql no es deterministico jijijij! bueno no es tan amado, me da rabia que no lo pueda alterar como todo sofotware opensource
 



 
última edición por mckaygerhard el Miercoles, 21 Junio 2017, 16:48; editado 5 veces 
mckaygerhard - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Un Nuevo Control WGridFilter (bueno, Dos) 
 
umm pegue los respuestas en el otro hilo, lo pego aqui tambien a manera informativa para otros desarrolladores:

El uso de la primera fila como cabecera de columna se controla con la propiedad setheads.

Cuando setheads es cierta, como cabeceras de columnas:
-Si Source es un result, se usa el nombre de los campos.
-Si source es un array de colecciónes, se usan las claves de la primera colección
-Si source es un Variant[][], se usan los valores del primer array.
-Si es falsa no se ponen más cabeceras que las que tú establezcas en la propiedad Titles.

el parche mio anterior realiza esto automatico ahora con la correccion de shordi, ya que el bug de tabla.col solo ocurre con sqlite.

wGrid tiene tres posibles fuentes de datos: un Result, un array de colecciones y un array de string[]. La propiedad source, en su método source_write lo que hace es convertir todo al tercer tipo: Un array de arrays string[]. Si la propiedad setheads es True utiliza como cabeceras de columna

-El nombre de los campos, si es un result (linea 287 del wgrid en la versión anterior)
-Las claves de la primera colección si es una colección (linea 323 de la version anterior
-Los valores del primer string[]  si es un Array[][] (como ocurre cuando le pasas el resultado de un CSV, por ejemplo, que suelen llevar el nombre de los campos en la primera fila) (linea 343 de la verision anterior)

Por otro lado, cuando estableces un filtro se hace una copia del array[][] construido por la propiedad source_write. y cuando pulsas el botón de deshacer filtros se envia esa copia (llamada $original) en el código, como source de wGrid.
El fallo es que antes la primera vez se usaban los nombres de campo porque source era un result y al pulsar "Quitar Filtro" lo que se usa como source es un Varian[][], y entonces se usaba (porque $setheads sigue true) la primera fila del array.
Lo he modificado para que en lugar de meter directamente los nombres de campo o de claves de la collection[] en las cabeceras, las meta en la propiedad $titles y sea éste $titles el que se usa de cabeceras siempre.(líneas 352 a 354 de wGrid)

ultimo:

me llama la atencion esta pieza de codigo en wgridfilter, y explico que la correccion ahora lanza un nuevo bug (y no se ve por falta de git)

Private Sub posButtons_Write(Value As Integer)

    If value <> Align.Bottom And Value <> Align.Right Then Return
 


el codigo anterior tenia una referencia inconclusa que recalque, y aqui veo lo corregiste.. esto lo documento aqui ya que no se ve: ajusta el valor mal visto en las propiedades del componente grafico, ya que hereda del la clase "ampliada" wgridfilter, en el primer upload, no se podia ajustar, porque cuadno se realizaba la botonera se perdia..

sin embargo ahora hay otro bug, si la botonera estsa vertical el inputfilter no se alinea.. y se pierde, la botonera ya no pero el inputfilter si..

NOTA: para los que no lo ven esto me llama la atencion porque si deseo revisar los cambios para aprender no puedo ya que la granja no ofrece esa capacidad, y no usan los codigos en git, svn esta fino pero un solo archivo corrupto en la veintena de subdirectorios y listo...
 



 
mckaygerhard - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Creación De Un Nuevo Control En Gambas3: ... jsbsan Videotutoriales 3 Viernes, 06 Febrero 2015, 12:44 Ver último mensaje
jsbsan
No hay nuevos mensajes Un Nuevo Control: BDTree shordi Controles/Librerías/Componentes 9 Sabado, 23 Abril 2016, 09:51 Ver último mensaje
shordi
No hay nuevos mensajes Nuevo Control: Gb.estado jsbsan Aplicaciones/Fragmentos de Código 3 Lunes, 17 Octobre 2016, 22:34 Ver último mensaje
Grandamakulo
No hay nuevos mensajes Nuevo Control: TableEdit shordi Controles/Librerías/Componentes 13 Viernes, 19 May 2017, 12:08 Ver último mensaje
tercoIDE
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron