In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Problema con sqlite, memdataset y filterbar del browse

Foro público de Xailer en español
Responder
Fredy
Mensajes: 199
Registrado: Mié Mar 29, 2006 1:28 am

Problema con sqlite, memdataset y filterbar del browse

Mensaje por Fredy »

Hola,
Estoy teniendo un problema que de momento me pasa en sqlite, pero no sé si pasará con otras bases de datos.
Os cuento:
Tengo un SqliteDataSource, un Memdataset y un DbBrowse
Cargo el Mendataset con:
::oMemDataset1:open(::oSQLiteDataSource1:QueryArray("SELECT * FROM nombres",@aCabecera),@aCabecera)
El DbBrowse tiene lFilterBar := .t.
En el Filtro del browse pongo, por ejemplo, ALF
Me filtra los datos y me muestra sólo los que contienen el texto que he indicado antes.
Pulso el botón Recargar, que lo único que hace es volver a llamar al ::oMemDataSet:Open que hemos llamado al principio
Borro el contenido del filtro del browse
En lugar de aparecer todos los datos de la tabla, sólo me aparecen los que se mostraban en el filtro anterior (los que empiezan por ALF)
Si consultamos las propiedades del MemDataSet, podemos ver que aData tiene 10 registros (el total de los que tiene la tabla) pero aWork sólo tiene 2 (los que contienen ALF) a pesar de haber borrado los datos del cFilter
He probado a hacer un close() antes de reabrir el Memdataset, a poner a nil el cFilter, pero sigue igual.
Lo he medio arreglado con :aWork := :aData, pero la barra de scroll no toma todos los registros y me temo que es una solución no demasiado acertada.
Os adjunto el proyecto de prueba.
1 Saludico,
Fredy
--

Attached files PRUEBA1-1-0-0-0.zip (3 KB)Â
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Problema con sqlite, memdataset y filterbar del browse

Mensaje por ignacio »

Fredy,
No se debe rellamar a Open() sin haber hecho un close() anteriormente. Antes o después del Close() deberias haber quitado el fitro.
Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
xmessoft
Mensajes: 37
Registrado: Lun Jun 06, 2011 5:15 pm

Problema con sqlite, memdataset y filterbar del browse

Mensaje por xmessoft »

Holaaaaaaa Fredy cómo estás?
Te doy un consejo en general y sobre todo para SQLite (si quieres te
cuento el porqué) yo harí­a:
"SELECT * FROM nombres where tucampo like 'ALF%'",@aCabecera),@aCabecera)
El trabajo del filtro lo hace el servidor y tránsito en la red es menor
ya que se desechan los registros que no la cumplen en el propio servidor
antes de ser enviados...
Espero que te valga :-)
Tu siempre amigo Manu Expósito
Saludos
El 22/05/2011 21:59, Fredy escribió:
> Hola,
>
> Estoy teniendo un problema que de momento me pasa en sqlite, pero no sé si pasará con otras bases de datos.
>
> Os cuento:
>
>
> Tengo un SqliteDataSource, un Memdataset y un DbBrowse
>
> Cargo el Mendataset con:
> ::oMemDataset1:open(::oSQLiteDataSource1:QueryArray("SELECT * FROM nombres",@aCabecera),@aCabecera)
>
> El DbBrowse tiene lFilterBar := .t.
>
> En el Filtro del browse pongo, por ejemplo, ALF
>
> Me filtra los datos y me muestra sólo los que contienen el texto que he indicado antes.
>
> Pulso el botón Recargar, que lo único que hace es volver a llamar al ::oMemDataSet:Open que hemos llamado al principio
>
> Borro el contenido del filtro del browse
>
> En lugar de aparecer todos los datos de la tabla, sólo me aparecen los que se mostraban en el filtro anterior (los que empiezan por ALF)
>
> Si consultamos las propiedades del MemDataSet, podemos ver que aData tiene 10 registros (el total de los que tiene la tabla) pero aWork sólo tiene 2 (los que contienen ALF) a pesar de haber borrado los datos del cFilter
>
> He probado a hacer un close() antes de reabrir el Memdataset, a poner a nil el cFilter, pero sigue igual.
>
> Lo he medio arreglado con :aWork := :aData, pero la barra de scroll no toma todos los registros y me temo que es una solución no demasiado acertada.
>
>
> Os adjunto el proyecto de prueba.
>
> 1 Saludico,
> Fredy
xmessoft
Mensajes: 37
Registrado: Lun Jun 06, 2011 5:15 pm

Problema con sqlite, memdataset y filterbar del browse

Mensaje por xmessoft »

Holaaaaaaa Fredy cómo estás?
Te doy un consejo en general y sobre todo para SQLite (si quieres te
cuento el porqué) yo harí­a:
"SELECT * FROM nombres where tucampo like 'ALF%'",@aCabecera),@aCabecera)
El trabajo del filtro lo hace el servidor y tránsito en la red es menor
ya que se desechan los registros que no la cumplen en el propio servidor
antes de ser enviados...
Espero que te valga :-)
Tu siempre amigo Manu Expósito
Saludos
Fredy
Mensajes: 199
Registrado: Mié Mar 29, 2006 1:28 am

Problema con sqlite, memdataset y filterbar del browse

Mensaje por Fredy »

Ehh Manu, Pasa pues!!
Cuanto tiempo!, me alegro mucho de leerte.
Seguiré tu consejo
1 Saludico,
Fredy
Claudio[1]
Mensajes: 59
Registrado: Vie May 01, 2009 5:40 am

Problema con sqlite, memdataset y filterbar del browse

Mensaje por Claudio[1] »

Estimados Colegas
Al heredar una clase que tiene definidas variables de instancia de clase
( ClassData ) las clases heredadas comparten la misma variable de clase
( aunque son dos clases diferentes )
Por ejemplo:
CLASS QValida
CLASSDATA cDato
.....
CLASS QValidaCentro From QValida // Clase Hija de Qvalida
......
CLASS QValidaImpuesto From QValida // Clase Hija de Qvalida
......
Si se instancian las dos clases Hija, ambas comparten la misma variable.
¿Es esto correcto? porque aunque hereden comportamientos de QValida (
clase madre ) al momento de instanciarse son clases diferentes ( y cada
una de las clases deberí­a tener su juego de variables de clase )
Por el momento resolvi el tema declarando las CLASSDATA en cada una de
las clases que heredan.
Me gustarí­a saber si es incorrecto mi pensamiento en cuanto a clases ya
que éstas serán clases 'primitivas' que serán heredadas varias veces.
Desde ya agradezco vuestra atención.
Claudio Carramal
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Problema con sqlite, memdataset y filterbar del browse

Mensaje por jlalin »

Claudio,
> Si se instancian las dos clases Hija, ambas comparten la misma variable.
> ¿Es esto correcto? porque aunque hereden comportamientos de QValida (clase
> madre ) al momento de instanciarse son clases diferentes ( y cada una de
> las clases deberí­a tener su juego de variables de clase )
Sí­, ese es el comportamiento de CLASSDATA.
> Por el momento resolvi el tema declarando las CLASSDATA en cada una de las
> clases que heredan.
Es incorrecto. Declara con DATA en la clase padre y verás que funciona tal
como esperabas que lo hiciera.
Saludos,
José Lalí­n
Claudio[1]
Mensajes: 59
Registrado: Vie May 01, 2009 5:40 am

Problema con sqlite, memdataset y filterbar del browse

Mensaje por Claudio[1] »

Estimado José
Gracias por tu pronta respuesta y disculpá mi tardanza en responder ( no
fue por deinterés: tuve que salir por trabajo unos dí­as )
Creo entender que una ClassData definida en una clase madre No es
compartida por las clases heredadas.
Cada una de las Clases heredadas deberí­a tener una variable de instancia
de clase, pero sin embargo comparten ambas clases una misma variable de
clase.
Preparé un ejemplo:
- Clase principal Grafo
- Clases heredadas: triangulo y cuadrado
Instancio un objeto de cada clase heredada ( oCua y oTri ) , le cargo
distintos datos en cada instancia ( Azul y Rojo ) y.....
Cuando les solicito el valor de clase ( color ) ambas instancias me
muestran el mismo valor: rojo ( el ultimo asignado )
Bien, adjunto ejemplo y copia de pantalla sin dejar de agradecer vuestro
tiempo.
Claudio.
//---------------------------------------------------------- --------------------
Class grafo
ClassData Color
method new()
endclass
method new() Class grafo
return self
Class cuadrado From grafo
endclass
Class triangulo From grafo
endclass
//---------------------------------------------------------- --------------------
METHOD Button1Click( oSender ) CLASS TForm1
local oCua:=cuadrado():new()
local oTri:=triangulo():new()
oCua:color:='Azul'
oTri:color:='Rojo'
msgstop('Cuadrado:color = ' + oCua:color +chr(13)+chr(10)+ ;
'Triangulo:color = ' + oTri:color ,'Colores' )
RETURN Nil
//---------------------------------------------------------- --------------------
El 08/06/2011 04:28 a.m., José Lalí­n escribió:
> Claudio,
>
>> Si se instancian las dos clases Hija, ambas comparten la misma variable.
>> ¿Es esto correcto? porque aunque hereden comportamientos de QValida
>> (clase
>> madre ) al momento de instanciarse son clases diferentes ( y cada una de
>> las clases deberí­a tener su juego de variables de clase )
>
> Sí­, ese es el comportamiento de CLASSDATA.
>
>> Por el momento resolvi el tema declarando las CLASSDATA en cada una
>> de las
>> clases que heredan.
>
> Es incorrecto. Declara con DATA en la clase padre y verás que funciona
> tal como esperabas que lo hiciera.
>
> Saludos,
> José Lalí­n
>
>
--
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Problema con sqlite, memdataset y filterbar del browse

Mensaje por ignacio »

Creo que te estás liando con los CLASSDATA. Un classdata es simplemente un variable de ámbito parecida a una estática en el mismo PRG donde se declara la clase. Es decir, el valor de dicho miembro es compartido por todas las instancias de dicha clase o cualquier clase que herede de ella.
Si tienes nociones acerca de patrones de programación, te dirí­a que dicha propiedad es muy apropiada para realizar patrones del tipo 'singleton'
Un saludo,
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Problema con sqlite, memdataset y filterbar del browse

Mensaje por jlalin »

Claudio,
> Creo entender que una ClassData definida en una clase madre No es compartida por
> las clases heredadas.
> Cada una de las Clases heredadas deberí­a tener una variable de instancia de
> clase, pero sin embargo comparten ambas clases una misma variable de clase.
Es justo al revés. Las CLASSDATAs son compartidas y las DATAs no. Cambia en
tu ejemplo CLASSDATA por DATA y verás como se comporta de otra manera.
Saludos,
José Lalí­n
Claudio[1]
Mensajes: 59
Registrado: Vie May 01, 2009 5:40 am

Problema con sqlite, memdataset y filterbar del browse

Mensaje por Claudio[1] »

Perfecto y entendido.
Muchas gracias José.
El 13/06/2011 06:37 a.m., José Lalí­n escribió:
> Claudio,
>
>> Creo entender que una ClassData definida en una clase madre No es
>> compartida por
>> las clases heredadas.
>> Cada una de las Clases heredadas deberí­a tener una variable de
>> instancia de
>> clase, pero sin embargo comparten ambas clases una misma variable de
>> clase.
>
> Es justo al revés. Las CLASSDATAs son compartidas y las DATAs no.
> Cambia en tu ejemplo CLASSDATA por DATA y verás como se comporta de
> otra manera.
>
> Saludos,
> José Lalí­n
>
Responder