|
Página 1 de 3
|
Un Nuevo Control PageGrid: Gridview Apto Para Tablas Grandes
Autor |
Mensaje |
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Un Nuevo Control PageGrid: Gridview Apto Para Tablas Grandes
Para manejar tablas grandes he creado éste control al que he llamado pageGrid. Yo lo he probado con 600.000 registros contra una tabla MySQL y es prácticamente instantáneo con mi conexión lenta de internet (4mb).
En realidad es una derivación (que no una herencia) de el dbGridFilter que tenéis en los dbControles. Lo que he hecho ha sido paginar las consultas utilizando la clausula de SQL "Limit". Con eso da igual los miles de registros que tenga una tabla porque sólo se retona el número de filas especificadas en el valor de limit. Una vez hecha la consulta, se pasan los valores a un Variant[] que contiene un String[] por cada registro, y es sobre ese Variant[] que se rellena el Grid.
Le he puesto una pequeña base de datos sqlite para que funcione el ejemplo.
El aspecto es éste:
Como véis podéis moveros la cantidad de registros que establezcáis hacia delante, atrás, al final, al principio o a la página seleccionada.
Por supuesto se mantienen las capacidades de hacer filtros, búsquedas y ordenaciones, alto automático de fila, etc. que ya tenía dbGridfilter.
Lo he subido a la Granja con el nombre pageGrid
Espero que os sea útil.
Descripción: |
|
Descargar |
Nombre del archivo: |
pageGrid-0.1.1.tar.gz |
Tamaño: |
44.13 KB |
Descargado: |
29 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
pageGrid-0.1.1.tar.gz |
Tamaño: |
44.13 KB |
Descargado: |
29 veces |
Descripción: |
|
Descargar |
Nombre del archivo: |
pageGrid-0.1.1.tar.gz |
Tamaño: |
44.13 KB |
Descargado: |
29 veces |
=================== No podemos regresar
última edición por shordi el Viernes, 30 Junio 2017, 18:53; editado 5 veces
|
#1 Lunes, 19 Junio 2017, 12:42 |
|
|
tincho
Analista Programador
Registrado: Noviembre 2014
Mensajes: 2565
Edad: 48 Ubicación:
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
Me lo descargue, le voy a echar un vistazo.
Saludos.
|
#2 Lunes, 19 Junio 2017, 14:10 |
|
|
mckaygerhard
PICCORO Lenz McKAY
Programador
Registrado: Julio 2013
Mensajes: 120
Edad: 65 Ubicación:
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
shordi no sirve para odbc, porque en el evento data no puedes hacer MoveTo.. ya que el cursor es foward only en FReeTDS y muchos otros...
ya descarge y revise el codigo.. interesante lo que intentqaste hacer pero ahora explota con freetds... posteare que puedo encontrar
EXCEKENTE EL CONTROL! ah y conteste el correo con respuestas muy cortas
última edición por mckaygerhard el Lunes, 19 Junio 2017, 16:46; editado 1 vez
|
#3 Lunes, 19 Junio 2017, 16:44 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
Citar: shordi no sirve para odbc, porque en el evento data no puedes hacer MoveTo.. ya que el cursor es foward only en FReeTDS y muchos otros...
Cambiálo a MoveNext, entonces, usando la clase wgridfilter, que trabaja en ram.
=================== No podemos regresar
última edición por shordi el Lunes, 19 Junio 2017, 17:09; editado 1 vez
|
#4 Lunes, 19 Junio 2017, 17:04 |
|
|
mckaygerhard
PICCORO Lenz McKAY
Programador
Registrado: Julio 2013
Mensajes: 120
Edad: 65 Ubicación:
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
Citar: Cambiálo a MoveNext, entonces, usando la clase wgridfilter, que trabaja en ram.
de esa el codigo es mas dificil de seguirte, ya lo voy probar, umm tengo mis dudas, ok apenas termine con algo de hardinfo pruebo..
sin embargo lo probe con sqlite, y parece ahora el problema es que aunque en una pc mas moderna del trabajo (me hiciste ir al trabajo hostias) tengo gabmas 3.9 explota igual.. estoy en estos momentos corriendo por pasitos... a ver donde
última edición por mckaygerhard el Lunes, 19 Junio 2017, 20:48; editado 1 vez
|
#5 Lunes, 19 Junio 2017, 20:46 |
|
|
mckaygerhard
PICCORO Lenz McKAY
Programador
Registrado: Julio 2013
Mensajes: 120
Edad: 65 Ubicación:
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
creo pude dar con el bug.. pero parece que nunca lo probaste realmente con odbc o siquiera mysql..
la busqueda saca el nombre de la tabla, del nombre de las columnas, y ya habia dicho que esto solo se cumple con sqlite.. para el resto de las DBMS cuando gambas coloca el nombre de las columnas lo hace como debe ser que es solo "<columna>" en vez de "<tabla>.<columna>".. por eso explota con otra cosa que no sea sqlite..
'Devuelve el campo de la columna entrecomillado, separando la tabla y el campo en diferentes comillas si es que en el result está así
tabla = IIf(InStr(columna, ".") > 0, Left(columna, InStr(columna, ".") - 1), "")
esto no se puede asumir muchisimo menos en odbc.. buena el truco para disernir entre varias tablas pero no funciona en odbc, mejor es remover desde $source el punto y tratar todas las columnas como que vienen correctamtne desde odbc
dspues de detectar la columna, y realizar la construccion al reves del query, intenta "re"-paginar.. aqui no pude seguir el codigo puesto ya llevaba un Error en el previa llamada de paginacion que no se porque no lo muestra.. pero en la segunda vez ocurre un aserction failed con este error:
GLib:ERROR:/media/DATASUPER/MASSENKOH-new/MASSENKOH-REPO/msksqueeze/desktop/glibsq/glib2.0-2.25.15/g
lib/gmain.c:2122:g_main_dispatch: assertion failed: (current->dispatching_sources == ¤t_source
_link)
its quite rare but only happened with lasted gambas, with gambas 3.5.1 does not happened, i search something for that and fgot unresolved things: https://groups.google.com/forum/#!topic/jenkinsci-users/R6ikq12KNDM
sin embargo cuando trate ver en "populate" veo el backtrace imprime :
Citar: Error: Query failed: no such column: Countries.Capital: odbGrid.populate.186
y atrapa una excepcion, puesto asume las columnas y el query siempre es calificado, cuando no es asi, simplemente sqlite devuelve el nombre de la tabla como si fuera qualificado.. lo cual es un bug de sqlite que ya habia dicho..
esto hace que en grid_data no exista un result y explote
por mi mismo no puedo resolverlo, es una simple conjetura que realizo dado la documentacion obviamente esta en la cabeza de shordi ..
como solucion de lopoco que deduge es realizar la adaptacion a eliminar el bug que hereda de sqlite.. aunque me fue facil en wGrid & wGridfilter aqui no me es sencillo realizarlo..
última edición por mckaygerhard el Lunes, 26 Junio 2017, 21:41; editado 1 vez
|
#6 Lunes, 26 Junio 2017, 21:41 |
|
|
mckaygerhard
PICCORO Lenz McKAY
Programador
Registrado: Julio 2013
Mensajes: 120
Edad: 65 Ubicación:
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
adiciono me falto, esto no causa problemas pero es interesante que no encuente su propio nombre de columna si lo repite:
esto es mas extraño: si puedes revisarlo por favor y corregir que parte de mi anterior analisis estaba malo: porque no entiendo porque no encuentra una palabra que si existe segun el sql que construye a menos que mi analisis sea cierto
última edición por mckaygerhard el Lunes, 26 Junio 2017, 22:11; editado 1 vez
|
#7 Lunes, 26 Junio 2017, 22:10 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
Citar:
creo pude dar con el bug.. pero parece que nunca lo probaste realmente con odbc o siquiera mysql..
la busqueda saca el nombre de la tabla, del nombre de las columnas, y ya habia dicho que esto solo se cumple con sqlite.. para el resto de las DBMS cuando gambas coloca el nombre de las columnas lo hace como debe ser que es solo "<columna>" en vez de "<tabla>.<columna>".. por eso explota con otra cosa que no sea sqlite..
Estas en un error, bueno en dos:
El primero es que el componente está probado con sqlite y con MySQL. En sqlite con varias bases de datos y en MySQL, con una conexión remota a un servidor y una línea de 4mb de ancho de banda contra una tabla con 25 campos y 600.000 registros. El resultado es casi instantáneo y sin problemas.
El segundo es que la busca no saca el nombre del nombre de las columnas. Estás obsesionado con eso que tú llamas un bug de sqlite. No es ningún bug de sqllite, pero no voy a entrar en ese tema ahora.
La busca saca el nombre del nombre de los campos... como habrás podido ver en la llamada a la función donde esa línea reside (dbcomillas)
col = dbcomillas($rs.Fields[column].name)
y la función se limita a poner las comillas inversas (o como se llamen) en los nombre de los campos: si el nombre del campo es direccion, esa función lo convierte en `direccion`. Si el nombre del campo es mitabla.direccion esta función lo convierte en `mitabla`.`direccion`
No hay ningún error por ese lado... salvo que tu base no admita el caracter ` como separador de nombres. Eso yo no lo puedo probar porque no tengo información sobre esa base de datos. Si no es así, pues sustitúyelo por el carácter que use.
El segundo bug que dices de la columna Capital no he podido reproducirlo. A mí me funciona perfectamente. A ver si puedes aislar la secuencia de acciones que te llevan a él y entonces podremos corregirlo.
Por otra parte he modificado el control para que sólo recorra el result una vez en modo forward only. Eso te permite (en teoría) trabajar directamente con él con la conexión odbc sin tu man in the middle. Pruébalo que yo no tengo acceso a ninguna base odbc y ahí toco de oído.
Está actualizado en la granja y en éste mismo hilo.
Saludos.
=================== No podemos regresar
|
#8 Martes, 27 Junio 2017, 12:44 |
|
|
mckaygerhard
PICCORO Lenz McKAY
Programador
Registrado: Julio 2013
Mensajes: 120
Edad: 65 Ubicación:
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
ok entonces si lo probaste con mysql, yo lo probe con sybase y con db2, disculpame, me base en los resultados mios unicamente...
col = dbcomillas($rs.Fields[column].name)
en la consulta esta no devuelve el nombre de la tabla en el nombre de los campos.. pero con sqlite ve te invito realices esta prueba:
a) si depuras el objeto Result de una consulta sqlite "select * from tabla" los campos se devuelven asi: "col1.tabla, col2.tabla"
b) si depuras el objeto Result de una consulta db2/sybase "select * from tabla" los campos se devuleven asi: "col1, col2"
c) inclusive si realizo "select tabla1.col1, tabla2.col2 from tabla1, tabla2" los campos en Result se devuelven asi: "col1, col2" incluso aunque las columnas sean iguales
El segundo bug que dices de la columna Capital no he podido reproducirlo. A mí me funciona perfectamente. A ver si puedes aislar la secuencia de acciones que te llevan a él y entonces podremos corregirlo.
Por otra parte he modificado el control para que sólo recorra el result una vez en modo forward only. Eso te permite (en teoría) trabajar directamente con él con la conexión odbc sin tu man in the middle. Pruébalo que yo no tengo acceso a ninguna base odbc y ahí toco de oído.
Está actualizado en la granja y en éste mismo hilo.
Saludos.
El bug lo reproduzco solo en linux embebidos.. con glibc 2.25 sin embargo la misma combinacion pero sin usar gambas 3.9 sino usando 3.5 logro ejecutarlo.. es lo extraño
voy a probar con tu modificacion a ver que pasa.. espero me ayude..
última edición por mckaygerhard el Martes, 27 Junio 2017, 13:22; editado 1 vez
|
#9 Martes, 27 Junio 2017, 13:21 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
Re: Un Nuevo Control OdbcGrid: Gridview Apto Para ODBC
Citar: ) si depuras el objeto Result de una consulta sqlite "select * from tabla" los campos se devuelven asi: "col1.tabla, col2.tabla"
Efectivamente es así. Pero no es un bug, es el comportamiento de sqlite. Si quieres que un campo se llame como tú quieres en una consulta, debes ponerle un alias (cláusula AS)
Lo tienes en la documentación de sqlite.
Citar: If the columns of your result set are named by AS clauses, then SQLite is guaranteed to use the identifier to the right of the AS keyword as the column name. If the result set does not use an AS clause, then SQLite is free to name the column anything it wants. See the sqlite3_column_name() documentation for further information.
Y en el sqlite3_column_name() dice:
Citar:
The name of a result column is the value of the "AS" clause for that column, if there is an AS clause. If there is no AS clause then the name of the column is unspecified and may change from one release of SQLite to the next.
Es decir, si no quieres la referencia de las tablas tienes que usar: "select col1 as 'col1', col2 as 'col2' from tabla"
Así es como se comporta Sqlite. Sqlite tiene unas magníficas ayudas on-line y eso es lo primero que uno debe leer cuando decide utilizar una base de datos. Lanzarse a gritar "BUG" cada vez que algo no se comporta según lo que uno espera, a menudo nos deja en evidencia.
Saludos.
=================== No podemos regresar
|
#10 Martes, 27 Junio 2017, 13:53 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 3
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
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
|
|
|
|
|