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.

Error en TDbfBrowse

Foro de Xailer profesional en español
Responder
jmartial
Mensajes: 397
Registrado: Vie May 20, 2005 8:53 pm

Error en TDbfBrowse

Mensaje por jmartial »

Hola,
Necesito ponerle footer y esto es lo que me hace xailer, el footer lo pone
debajo del Header y en el sitio del footer lo deja transparente, este browse
lo defino en el IDE y para cambiar de oDataSet he puesto este código:
WITH OBJECT ::oBrwFaccli
:oHeader:lVisible:=.F.
:Reset()
:SetDbf( ::oFaccli:Alias() , ;
{"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
:aCols[1]:cHeader := "Serie"
:aCols[1]:nWidth := 47
:aCols[1]:cFooter := ""
:aCols[2]:cHeader := "Nº Factura"
:aCols[2]:nWidth := 85
:aCols[2]:cFooter := ""
:aCols[3]:cHeader := "Cliente"
:aCols[3]:nWidth := 100
:aCols[3]:cFooter := ""
:aCols[4]:cHeader := "Razón Social"
:aCols[4]:nWidth := 365
:aCols[4]:cFooter := ""
:aCols[5]:cHeader := "Total Factura"
:aCols[5]:nWidth := 150
:aCols[5]:cPicture:= "@Z 999,999,999.99"
:aCols[5]:cFooter := "Pie"
:Refresh(.T.)
:oHeader:lVisible:=.T.
END
No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
Un Saludo,
Joaquín


Attached files
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9253
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en TDbfBrowse

Mensaje por ignacio »

Joaquin,
No ocultes el Header en ningún momento. Manda un pequeño ejemplo que muestre
el error. Gracias
Un saludo,
"Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
> Hola,
>
> Necesito ponerle footer y esto es lo que me hace xailer, el footer lo pone
> debajo del Header y en el sitio del footer lo deja transparente, este
> browse
> lo defino en el IDE y para cambiar de oDataSet he puesto este código:
>
> WITH OBJECT ::oBrwFaccli
>
> :oHeader:lVisible:=.F.
> :Reset()
> :SetDbf( ::oFaccli:Alias() , ;
>
> {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
>
> :aCols[1]:cHeader := "Serie"
> :aCols[1]:nWidth := 47
> :aCols[1]:cFooter := ""
>
> :aCols[2]:cHeader := "Nº Factura"
> :aCols[2]:nWidth := 85
> :aCols[2]:cFooter := ""
>
> :aCols[3]:cHeader := "Cliente"
> :aCols[3]:nWidth := 100
> :aCols[3]:cFooter := ""
>
> :aCols[4]:cHeader := "Razón Social"
> :aCols[4]:nWidth := 365
> :aCols[4]:cFooter := ""
>
> :aCols[5]:cHeader := "Total Factura"
> :aCols[5]:nWidth := 150
> :aCols[5]:cPicture:= "@Z 999,999,999.99"
> :aCols[5]:cFooter := "Pie"
>
>
>
>
> :Refresh(.T.)
> :oHeader:lVisible:=.T.
>
> END
>
> No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
>
> Un Saludo,
> Joaquín
>
>
>
>
>
>
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jmartial
Mensajes: 397
Registrado: Vie May 20, 2005 8:53 pm

Error en TDbfBrowse

Mensaje por jmartial »

Ignacio,
Si no oculto el header el efecto de cambiar de Alias es horrible, el usuario
ve como se cargan todos los campos con los headers llamándose como el propio
campo y a continuación se ponen los headers que les he definido.
Si hay alguna manera elegante de que en un browse pueda ver algunos campos
de una base y poder cambiar de directorio para ver otra base idéntica pero
con diferentes datos, sin hacer esto, y que se vea bonito de cara al usuario
me gustaría conocerla, porque esta es la única manera que he encontrado.
Y el ejemplo es exactamente el código que he puesto, si quieres que te lo
ponga en un form con un botón te lo preparo, pero no hago nada especial más
que el trozo de código que te he puesto.
Un Saludo,
Joaquín
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje
news:[email=4241bf0f@ozsrv2.ozlan.local...]4241bf0f@ozsrv2.ozlan.local...[/email]
> Joaquin,
>
> No ocultes el Header en ningún momento. Manda un pequeño ejemplo que
muestre
> el error. Gracias
>
> Un saludo,
>
> "Joaquín Martínez" <jmartial@interbook.net> escribió en el mensaje
> news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
> > Hola,
> >
> > Necesito ponerle footer y esto es lo que me hace xailer, el footer lo
pone
> > debajo del Header y en el sitio del footer lo deja transparente, este
> > browse
> > lo defino en el IDE y para cambiar de oDataSet he puesto este código:
> >
> > WITH OBJECT ::oBrwFaccli
> >
> > :oHeader:lVisible:=.F.
> > :Reset()
> > :SetDbf( ::oFaccli:Alias() , ;
> >
> > {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
> >
> > :aCols[1]:cHeader := "Serie"
> > :aCols[1]:nWidth := 47
> > :aCols[1]:cFooter := ""
> >
> > :aCols[2]:cHeader := "Nº Factura"
> > :aCols[2]:nWidth := 85
> > :aCols[2]:cFooter := ""
> >
> > :aCols[3]:cHeader := "Cliente"
> > :aCols[3]:nWidth := 100
> > :aCols[3]:cFooter := ""
> >
> > :aCols[4]:cHeader := "Razón Social"
> > :aCols[4]:nWidth := 365
> > :aCols[4]:cFooter := ""
> >
> > :aCols[5]:cHeader := "Total Factura"
> > :aCols[5]:nWidth := 150
> > :aCols[5]:cPicture:= "@Z 999,999,999.99"
> > :aCols[5]:cFooter := "Pie"
> >
> >
> >
> >
> > :Refresh(.T.)
> > :oHeader:lVisible:=.T.
> >
> > END
> >
> > No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
> >
> > Un Saludo,
> > Joaquín
> >
> >
> >
> >
> >
> >
>
>
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9253
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en TDbfBrowse

Mensaje por ignacio »

Joaquin,
Prueba con:
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
En cuanto al ejemplo, lo siento pero no me vale, no está autocontenido y por lo tanto no puedo probarlo. Necesito un ejemplo que rápido y claramente me muestre que el error es nuestro, y no tener que hacer yo personalmente un proyecto desde cero que al final es posible que me falle o no. Espero que lo entiendas.
En cualquier caso, es posible que el browse falle irremediablemente cuando se empiezan a ocultar su header y footer y se hacen cualquier otro tipo de operaciones raras, por lo que seguramente dejaremos inaccesible el header y footer en el futuro, es decir, como datos privados de la clase.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4241f637@ozsrv2.ozlan.local...]4241f637@ozsrv2.ozlan.local...[/email]
> Ignacio,
>
> Si no oculto el header el efecto de cambiar de Alias es horrible, el usuario
> ve como se cargan todos los campos con los headers llamándose como el propio
> campo y a continuación se ponen los headers que les he definido.
>
> Si hay alguna manera elegante de que en un browse pueda ver algunos campos
> de una base y poder cambiar de directorio para ver otra base idéntica pero
> con diferentes datos, sin hacer esto, y que se vea bonito de cara al usuario
> me gustarí­a conocerla, porque esta es la única manera que he encontrado.
>
> Y el ejemplo es exactamente el código que he puesto, si quieres que te lo
> ponga en un form con un botón te lo preparo, pero no hago nada especial más
> que el trozo de código que te he puesto.
>
> Un Saludo,
> Joaquí­n
>
> "Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje
> news:[email=4241bf0f@ozsrv2.ozlan.local...]4241bf0f@ozsrv2.ozlan.local...[/email]
>> Joaquin,
>>
>> No ocultes el Header en ningún momento. Manda un pequeño ejemplo que
> muestre
>> el error. Gracias
>>
>> Un saludo,
>>
>> "Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje
>> news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
>> > Hola,
>> >
>> > Necesito ponerle footer y esto es lo que me hace xailer, el footer lo
> pone
>> > debajo del Header y en el sitio del footer lo deja transparente, este
>> > browse
>> > lo defino en el IDE y para cambiar de oDataSet he puesto este código:
>> >
>> > WITH OBJECT ::oBrwFaccli
>> >
>> > :oHeader:lVisible:=.F.
>> > :Reset()
>> > :SetDbf( ::oFaccli:Alias() , ;
>> >
>> > {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
>> >
>> > :aCols[1]:cHeader := "Serie"
>> > :aCols[1]:nWidth := 47
>> > :aCols[1]:cFooter := ""
>> >
>> > :aCols[2]:cHeader := "Nº Factura"
>> > :aCols[2]:nWidth := 85
>> > :aCols[2]:cFooter := ""
>> >
>> > :aCols[3]:cHeader := "Cliente"
>> > :aCols[3]:nWidth := 100
>> > :aCols[3]:cFooter := ""
>> >
>> > :aCols[4]:cHeader := "Razón Social"
>> > :aCols[4]:nWidth := 365
>> > :aCols[4]:cFooter := ""
>> >
>> > :aCols[5]:cHeader := "Total Factura"
>> > :aCols[5]:nWidth := 150
>> > :aCols[5]:cPicture:= "@Z 999,999,999.99"
>> > :aCols[5]:cFooter := "Pie"
>> >
>> >
>> >
>> >
>> > :Refresh(.T.)
>> > :oHeader:lVisible:=.T.
>> >
>> > END
>> >
>> > No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
>> >
>> > Un Saludo,
>> > Joaquí­n
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>
>
--
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jmartial
Mensajes: 397
Registrado: Vie May 20, 2005 8:53 pm

Error en TDbfBrowse

Mensaje por jmartial »

Ignacio,
El código que envié en vez de ocultar el header, le he puesto lo que me has dicho lRedraw a .F. y luego a .T. y con eso no parpadea nada y no se estropea el Footer, ¡gracias!
Pero, sigo reportando el mismo error, si pongo exactamente el código que me pones
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
La 1ª vez me muestra los registros bien, pero si la vuelvo a llamar con otro alias, me pone el 1º registro bien y el resto de lineas del Browse repetido el 1º registro tantas veces como registros tenga la base de datos.
La única solución para que :SetDbf() funcione es haciendo antes un reset() y luego definiendo de nuevo cada columna.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42427ead@ozsrv2.ozlan.local...]42427ead@ozsrv2.ozlan.local...[/email]
Joaquin,
Prueba con:
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
En cuanto al ejemplo, lo siento pero no me vale, no está autocontenido y por lo tanto no puedo probarlo. Necesito un ejemplo que rápido y claramente me muestre que el error es nuestro, y no tener que hacer yo personalmente un proyecto desde cero que al final es posible que me falle o no. Espero que lo entiendas.
En cualquier caso, es posible que el browse falle irremediablemente cuando se empiezan a ocultar su header y footer y se hacen cualquier otro tipo de operaciones raras, por lo que seguramente dejaremos inaccesible el header y footer en el futuro, es decir, como datos privados de la clase.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4241f637@ozsrv2.ozlan.local...]4241f637@ozsrv2.ozlan.local...[/email]
> Ignacio,
>
> Si no oculto el header el efecto de cambiar de Alias es horrible, el usuario
> ve como se cargan todos los campos con los headers llamándose como el propio
> campo y a continuación se ponen los headers que les he definido.
>
> Si hay alguna manera elegante de que en un browse pueda ver algunos campos
> de una base y poder cambiar de directorio para ver otra base idéntica pero
> con diferentes datos, sin hacer esto, y que se vea bonito de cara al usuario
> me gustarí­a conocerla, porque esta es la única manera que he encontrado.
>
> Y el ejemplo es exactamente el código que he puesto, si quieres que te lo
> ponga en un form con un botón te lo preparo, pero no hago nada especial más
> que el trozo de código que te he puesto.
>
> Un Saludo,
> Joaquí­n
>
> "Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje
> news:[email=4241bf0f@ozsrv2.ozlan.local...]4241bf0f@ozsrv2.ozlan.local...[/email]
>> Joaquin,
>>
>> No ocultes el Header en ningún momento. Manda un pequeño ejemplo que
> muestre
>> el error. Gracias
>>
>> Un saludo,
>>
>> "Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje
>> news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
>> > Hola,
>> >
>> > Necesito ponerle footer y esto es lo que me hace xailer, el footer lo
> pone
>> > debajo del Header y en el sitio del footer lo deja transparente, este
>> > browse
>> > lo defino en el IDE y para cambiar de oDataSet he puesto este código:
>> >
>> > WITH OBJECT ::oBrwFaccli
>> >
>> > :oHeader:lVisible:=.F.
>> > :Reset()
>> > :SetDbf( ::oFaccli:Alias() , ;
>> >
>> > {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
>> >
>> > :aCols[1]:cHeader := "Serie"
>> > :aCols[1]:nWidth := 47
>> > :aCols[1]:cFooter := ""
>> >
>> > :aCols[2]:cHeader := "Nº Factura"
>> > :aCols[2]:nWidth := 85
>> > :aCols[2]:cFooter := ""
>> >
>> > :aCols[3]:cHeader := "Cliente"
>> > :aCols[3]:nWidth := 100
>> > :aCols[3]:cFooter := ""
>> >
>> > :aCols[4]:cHeader := "Razón Social"
>> > :aCols[4]:nWidth := 365
>> > :aCols[4]:cFooter := ""
>> >
>> > :aCols[5]:cHeader := "Total Factura"
>> > :aCols[5]:nWidth := 150
>> > :aCols[5]:cPicture:= "@Z 999,999,999.99"
>> > :aCols[5]:cFooter := "Pie"
>> >
>> >
>> >
>> >
>> > :Refresh(.T.)
>> > :oHeader:lVisible:=.T.
>> >
>> > END
>> >
>> > No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
>> >
>> > Un Saludo,
>> > Joaquí­n
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>
>
--
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9253
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en TDbfBrowse

Mensaje por ignacio »

Joaquin,
Por lo que cuentas, ya he descubierto donde esta el problema y es que el método SetDbf() sólo inicializa el evento OnGetData de las columnas una vez, sino esta definido, y para ir lo más rápido posible el valor del Alias se convierte en un literal antes de bloquificarlo. Cuando cambias de Alias con SetDbf() ese alias ya no coincide y por lo tanto falla.
Podrí­a forzar la reinicilización de los eventos OnGetData y OnGetValue, pero entonces se perderí­an dichos eventos cuando hayan sido creados por el usuario, o también podrí­a incluir la propiedad cAlias en el codeblock generado, pero ello supondrí­a una perdida no se si apreciable de velocidad. Otra opción serí­a poner un tercer parametro lógico al metodo SetDbf() pero no sabrí­a ni como llamarlo. Tengo que pensarlo antes de hacer nada, cualquier opinión es bienvenida.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4242a5d6@ozsrv2.ozlan.local...]4242a5d6@ozsrv2.ozlan.local...[/email]
Ignacio,
El código que envié en vez de ocultar el header, le he puesto lo que me has dicho lRedraw a .F. y luego a .T. y con eso no parpadea nada y no se estropea el Footer, ¡gracias!
Pero, sigo reportando el mismo error, si pongo exactamente el código que me pones
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
La 1ª vez me muestra los registros bien, pero si la vuelvo a llamar con otro alias, me pone el 1º registro bien y el resto de lineas del Browse repetido el 1º registro tantas veces como registros tenga la base de datos.
La única solución para que :SetDbf() funcione es haciendo antes un reset() y luego definiendo de nuevo cada columna.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42427ead@ozsrv2.ozlan.local...]42427ead@ozsrv2.ozlan.local...[/email]
Joaquin,
Prueba con:
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
En cuanto al ejemplo, lo siento pero no me vale, no está autocontenido y por lo tanto no puedo probarlo. Necesito un ejemplo que rápido y claramente me muestre que el error es nuestro, y no tener que hacer yo personalmente un proyecto desde cero que al final es posible que me falle o no. Espero que lo entiendas.
En cualquier caso, es posible que el browse falle irremediablemente cuando se empiezan a ocultar su header y footer y se hacen cualquier otro tipo de operaciones raras, por lo que seguramente dejaremos inaccesible el header y footer en el futuro, es decir, como datos privados de la clase.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4241f637@ozsrv2.ozlan.local...]4241f637@ozsrv2.ozlan.local...[/email]
> Ignacio,
>
> Si no oculto el header el efecto de cambiar de Alias es horrible, el usuario
> ve como se cargan todos los campos con los headers llamándose como el propio
> campo y a continuación se ponen los headers que les he definido.
>
> Si hay alguna manera elegante de que en un browse pueda ver algunos campos
> de una base y poder cambiar de directorio para ver otra base idéntica pero
> con diferentes datos, sin hacer esto, y que se vea bonito de cara al usuario
> me gustarí­a conocerla, porque esta es la única manera que he encontrado.
>
> Y el ejemplo es exactamente el código que he puesto, si quieres que te lo
> ponga en un form con un botón te lo preparo, pero no hago nada especial más
> que el trozo de código que te he puesto.
>
> Un Saludo,
> Joaquí­n
>
> "Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje
> news:[email=4241bf0f@ozsrv2.ozlan.local...]4241bf0f@ozsrv2.ozlan.local...[/email]
>> Joaquin,
>>
>> No ocultes el Header en ningún momento. Manda un pequeño ejemplo que
> muestre
>> el error. Gracias
>>
>> Un saludo,
>>
>> "Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje
>> news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
>> > Hola,
>> >
>> > Necesito ponerle footer y esto es lo que me hace xailer, el footer lo
> pone
>> > debajo del Header y en el sitio del footer lo deja transparente, este
>> > browse
>> > lo defino en el IDE y para cambiar de oDataSet he puesto este código:
>> >
>> > WITH OBJECT ::oBrwFaccli
>> >
>> > :oHeader:lVisible:=.F.
>> > :Reset()
>> > :SetDbf( ::oFaccli:Alias() , ;
>> >
>> > {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
>> >
>> > :aCols[1]:cHeader := "Serie"
>> > :aCols[1]:nWidth := 47
>> > :aCols[1]:cFooter := ""
>> >
>> > :aCols[2]:cHeader := "Nº Factura"
>> > :aCols[2]:nWidth := 85
>> > :aCols[2]:cFooter := ""
>> >
>> > :aCols[3]:cHeader := "Cliente"
>> > :aCols[3]:nWidth := 100
>> > :aCols[3]:cFooter := ""
>> >
>> > :aCols[4]:cHeader := "Razón Social"
>> > :aCols[4]:nWidth := 365
>> > :aCols[4]:cFooter := ""
>> >
>> > :aCols[5]:cHeader := "Total Factura"
>> > :aCols[5]:nWidth := 150
>> > :aCols[5]:cPicture:= "@Z 999,999,999.99"
>> > :aCols[5]:cFooter := "Pie"
>> >
>> >
>> >
>> >
>> > :Refresh(.T.)
>> > :oHeader:lVisible:=.T.
>> >
>> > END
>> >
>> > No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
>> >
>> > Un Saludo,
>> > Joaquí­n
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>
>
--
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jmartial
Mensajes: 397
Registrado: Vie May 20, 2005 8:53 pm

Error en TDbfBrowse

Mensaje por jmartial »

A ver,
Según entiendo de tu explicación lo único que se me ocurre es incluir cAlias como parámetro del Codeblock, de tal manera que un cambio de alias no te afecte en la representación de las columnas, la velocidad es cierto, no sé, pero otra opción más elaborada pero igual de rápida que tu idea inicial serí­a poner como 3º parámetro algo como "lRefreshAlias" y deberí­a cambiar el alias antiguo por el nuevo. No he visto el código fuente pero me imagino que OnGetData serí­a algo como {|| articu0->campo1 } por lo que si lRefreshAlias = .T. habrí­a que buscar en la cadena el antiguo alias y sustituirlo por el nuevo, es decir, serí­a algo como Function SustAlias( cCadenaBlockOnGetData , "articu0", "articu1"), esto se hace al hacer SetDbf() y no creo que se notara siquiera lo que tarda.
No veo otra forma en principio, la 2ª me gusta bastante y es fácil de implementar.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42447cc4@ozsrv2.ozlan.local...]42447cc4@ozsrv2.ozlan.local...[/email]
Joaquin,
Por lo que cuentas, ya he descubierto donde esta el problema y es que el método SetDbf() sólo inicializa el evento OnGetData de las columnas una vez, sino esta definido, y para ir lo más rápido posible el valor del Alias se convierte en un literal antes de bloquificarlo. Cuando cambias de Alias con SetDbf() ese alias ya no coincide y por lo tanto falla.
Podrí­a forzar la reinicilización de los eventos OnGetData y OnGetValue, pero entonces se perderí­an dichos eventos cuando hayan sido creados por el usuario, o también podrí­a incluir la propiedad cAlias en el codeblock generado, pero ello supondrí­a una perdida no se si apreciable de velocidad. Otra opción serí­a poner un tercer parametro lógico al metodo SetDbf() pero no sabrí­a ni como llamarlo. Tengo que pensarlo antes de hacer nada, cualquier opinión es bienvenida.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4242a5d6@ozsrv2.ozlan.local...]4242a5d6@ozsrv2.ozlan.local...[/email]
Ignacio,
El código que envié en vez de ocultar el header, le he puesto lo que me has dicho lRedraw a .F. y luego a .T. y con eso no parpadea nada y no se estropea el Footer, ¡gracias!
Pero, sigo reportando el mismo error, si pongo exactamente el código que me pones
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
La 1ª vez me muestra los registros bien, pero si la vuelvo a llamar con otro alias, me pone el 1º registro bien y el resto de lineas del Browse repetido el 1º registro tantas veces como registros tenga la base de datos.
La única solución para que :SetDbf() funcione es haciendo antes un reset() y luego definiendo de nuevo cada columna.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42427ead@ozsrv2.ozlan.local...]42427ead@ozsrv2.ozlan.local...[/email]
Joaquin,
Prueba con:
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
En cuanto al ejemplo, lo siento pero no me vale, no está autocontenido y por lo tanto no puedo probarlo. Necesito un ejemplo que rápido y claramente me muestre que el error es nuestro, y no tener que hacer yo personalmente un proyecto desde cero que al final es posible que me falle o no. Espero que lo entiendas.
En cualquier caso, es posible que el browse falle irremediablemente cuando se empiezan a ocultar su header y footer y se hacen cualquier otro tipo de operaciones raras, por lo que seguramente dejaremos inaccesible el header y footer en el futuro, es decir, como datos privados de la clase.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4241f637@ozsrv2.ozlan.local...]4241f637@ozsrv2.ozlan.local...[/email]
> Ignacio,
>
> Si no oculto el header el efecto de cambiar de Alias es horrible, el usuario
> ve como se cargan todos los campos con los headers llamándose como el propio
> campo y a continuación se ponen los headers que les he definido.
>
> Si hay alguna manera elegante de que en un browse pueda ver algunos campos
> de una base y poder cambiar de directorio para ver otra base idéntica pero
> con diferentes datos, sin hacer esto, y que se vea bonito de cara al usuario
> me gustarí­a conocerla, porque esta es la única manera que he encontrado.
>
> Y el ejemplo es exactamente el código que he puesto, si quieres que te lo
> ponga en un form con un botón te lo preparo, pero no hago nada especial más
> que el trozo de código que te he puesto.
>
> Un Saludo,
> Joaquí­n
>
> "Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje
> news:[email=4241bf0f@ozsrv2.ozlan.local...]4241bf0f@ozsrv2.ozlan.local...[/email]
>> Joaquin,
>>
>> No ocultes el Header en ningún momento. Manda un pequeño ejemplo que
> muestre
>> el error. Gracias
>>
>> Un saludo,
>>
>> "Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje
>> news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
>> > Hola,
>> >
>> > Necesito ponerle footer y esto es lo que me hace xailer, el footer lo
> pone
>> > debajo del Header y en el sitio del footer lo deja transparente, este
>> > browse
>> > lo defino en el IDE y para cambiar de oDataSet he puesto este código:
>> >
>> > WITH OBJECT ::oBrwFaccli
>> >
>> > :oHeader:lVisible:=.F.
>> > :Reset()
>> > :SetDbf( ::oFaccli:Alias() , ;
>> >
>> > {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
>> >
>> > :aCols[1]:cHeader := "Serie"
>> > :aCols[1]:nWidth := 47
>> > :aCols[1]:cFooter := ""
>> >
>> > :aCols[2]:cHeader := "Nº Factura"
>> > :aCols[2]:nWidth := 85
>> > :aCols[2]:cFooter := ""
>> >
>> > :aCols[3]:cHeader := "Cliente"
>> > :aCols[3]:nWidth := 100
>> > :aCols[3]:cFooter := ""
>> >
>> > :aCols[4]:cHeader := "Razón Social"
>> > :aCols[4]:nWidth := 365
>> > :aCols[4]:cFooter := ""
>> >
>> > :aCols[5]:cHeader := "Total Factura"
>> > :aCols[5]:nWidth := 150
>> > :aCols[5]:cPicture:= "@Z 999,999,999.99"
>> > :aCols[5]:cFooter := "Pie"
>> >
>> >
>> >
>> >
>> > :Refresh(.T.)
>> > :oHeader:lVisible:=.T.
>> >
>> > END
>> >
>> > No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
>> >
>> > Un Saludo,
>> > Joaquí­n
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>
>
--
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9253
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en TDbfBrowse

Mensaje por ignacio »

Joaquin,
Ya está arreglado y creo que de la mejor forma posible, sin codeblock alguno.
Un saludo
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4245d173@ozsrv2.ozlan.local...]4245d173@ozsrv2.ozlan.local...[/email]
A ver,
Según entiendo de tu explicación lo único que se me ocurre es incluir cAlias como parámetro del Codeblock, de tal manera que un cambio de alias no te afecte en la representación de las columnas, la velocidad es cierto, no sé, pero otra opción más elaborada pero igual de rápida que tu idea inicial serí­a poner como 3º parámetro algo como "lRefreshAlias" y deberí­a cambiar el alias antiguo por el nuevo. No he visto el código fuente pero me imagino que OnGetData serí­a algo como {|| articu0->campo1 } por lo que si lRefreshAlias = .T. habrí­a que buscar en la cadena el antiguo alias y sustituirlo por el nuevo, es decir, serí­a algo como Function SustAlias( cCadenaBlockOnGetData , "articu0", "articu1"), esto se hace al hacer SetDbf() y no creo que se notara siquiera lo que tarda.
No veo otra forma en principio, la 2ª me gusta bastante y es fácil de implementar.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42447cc4@ozsrv2.ozlan.local...]42447cc4@ozsrv2.ozlan.local...[/email]
Joaquin,
Por lo que cuentas, ya he descubierto donde esta el problema y es que el método SetDbf() sólo inicializa el evento OnGetData de las columnas una vez, sino esta definido, y para ir lo más rápido posible el valor del Alias se convierte en un literal antes de bloquificarlo. Cuando cambias de Alias con SetDbf() ese alias ya no coincide y por lo tanto falla.
Podrí­a forzar la reinicilización de los eventos OnGetData y OnGetValue, pero entonces se perderí­an dichos eventos cuando hayan sido creados por el usuario, o también podrí­a incluir la propiedad cAlias en el codeblock generado, pero ello supondrí­a una perdida no se si apreciable de velocidad. Otra opción serí­a poner un tercer parametro lógico al metodo SetDbf() pero no sabrí­a ni como llamarlo. Tengo que pensarlo antes de hacer nada, cualquier opinión es bienvenida.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4242a5d6@ozsrv2.ozlan.local...]4242a5d6@ozsrv2.ozlan.local...[/email]
Ignacio,
El código que envié en vez de ocultar el header, le he puesto lo que me has dicho lRedraw a .F. y luego a .T. y con eso no parpadea nada y no se estropea el Footer, ¡gracias!
Pero, sigo reportando el mismo error, si pongo exactamente el código que me pones
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
La 1ª vez me muestra los registros bien, pero si la vuelvo a llamar con otro alias, me pone el 1º registro bien y el resto de lineas del Browse repetido el 1º registro tantas veces como registros tenga la base de datos.
La única solución para que :SetDbf() funcione es haciendo antes un reset() y luego definiendo de nuevo cada columna.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42427ead@ozsrv2.ozlan.local...]42427ead@ozsrv2.ozlan.local...[/email]
Joaquin,
Prueba con:
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
En cuanto al ejemplo, lo siento pero no me vale, no está autocontenido y por lo tanto no puedo probarlo. Necesito un ejemplo que rápido y claramente me muestre que el error es nuestro, y no tener que hacer yo personalmente un proyecto desde cero que al final es posible que me falle o no. Espero que lo entiendas.
En cualquier caso, es posible que el browse falle irremediablemente cuando se empiezan a ocultar su header y footer y se hacen cualquier otro tipo de operaciones raras, por lo que seguramente dejaremos inaccesible el header y footer en el futuro, es decir, como datos privados de la clase.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4241f637@ozsrv2.ozlan.local...]4241f637@ozsrv2.ozlan.local...[/email]
> Ignacio,
>
> Si no oculto el header el efecto de cambiar de Alias es horrible, el usuario
> ve como se cargan todos los campos con los headers llamándose como el propio
> campo y a continuación se ponen los headers que les he definido.
>
> Si hay alguna manera elegante de que en un browse pueda ver algunos campos
> de una base y poder cambiar de directorio para ver otra base idéntica pero
> con diferentes datos, sin hacer esto, y que se vea bonito de cara al usuario
> me gustarí­a conocerla, porque esta es la única manera que he encontrado.
>
> Y el ejemplo es exactamente el código que he puesto, si quieres que te lo
> ponga en un form con un botón te lo preparo, pero no hago nada especial más
> que el trozo de código que te he puesto.
>
> Un Saludo,
> Joaquí­n
>
> "Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje
> news:[email=4241bf0f@ozsrv2.ozlan.local...]4241bf0f@ozsrv2.ozlan.local...[/email]
>> Joaquin,
>>
>> No ocultes el Header en ningún momento. Manda un pequeño ejemplo que
> muestre
>> el error. Gracias
>>
>> Un saludo,
>>
>> "Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje
>> news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
>> > Hola,
>> >
>> > Necesito ponerle footer y esto es lo que me hace xailer, el footer lo
> pone
>> > debajo del Header y en el sitio del footer lo deja transparente, este
>> > browse
>> > lo defino en el IDE y para cambiar de oDataSet he puesto este código:
>> >
>> > WITH OBJECT ::oBrwFaccli
>> >
>> > :oHeader:lVisible:=.F.
>> > :Reset()
>> > :SetDbf( ::oFaccli:Alias() , ;
>> >
>> > {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
>> >
>> > :aCols[1]:cHeader := "Serie"
>> > :aCols[1]:nWidth := 47
>> > :aCols[1]:cFooter := ""
>> >
>> > :aCols[2]:cHeader := "Nº Factura"
>> > :aCols[2]:nWidth := 85
>> > :aCols[2]:cFooter := ""
>> >
>> > :aCols[3]:cHeader := "Cliente"
>> > :aCols[3]:nWidth := 100
>> > :aCols[3]:cFooter := ""
>> >
>> > :aCols[4]:cHeader := "Razón Social"
>> > :aCols[4]:nWidth := 365
>> > :aCols[4]:cFooter := ""
>> >
>> > :aCols[5]:cHeader := "Total Factura"
>> > :aCols[5]:nWidth := 150
>> > :aCols[5]:cPicture:= "@Z 999,999,999.99"
>> > :aCols[5]:cFooter := "Pie"
>> >
>> >
>> >
>> >
>> > :Refresh(.T.)
>> > :oHeader:lVisible:=.T.
>> >
>> > END
>> >
>> > No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
>> >
>> > Un Saludo,
>> > Joaquí­n
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>
>
--
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
jmartial
Mensajes: 397
Registrado: Vie May 20, 2005 8:53 pm

Error en TDbfBrowse

Mensaje por jmartial »

Oye,
No me vayas a dejar con la intriga!! dime que se te ha ocurrido y nada más tengas el obj para probarlo pasaló ¿vale?
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=424701e2@ozsrv2.ozlan.local...]424701e2@ozsrv2.ozlan.local...[/email]
Joaquin,
Ya está arreglado y creo que de la mejor forma posible, sin codeblock alguno.
Un saludo
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4245d173@ozsrv2.ozlan.local...]4245d173@ozsrv2.ozlan.local...[/email]
A ver,
Según entiendo de tu explicación lo único que se me ocurre es incluir cAlias como parámetro del Codeblock, de tal manera que un cambio de alias no te afecte en la representación de las columnas, la velocidad es cierto, no sé, pero otra opción más elaborada pero igual de rápida que tu idea inicial serí­a poner como 3º parámetro algo como "lRefreshAlias" y deberí­a cambiar el alias antiguo por el nuevo. No he visto el código fuente pero me imagino que OnGetData serí­a algo como {|| articu0->campo1 } por lo que si lRefreshAlias = .T. habrí­a que buscar en la cadena el antiguo alias y sustituirlo por el nuevo, es decir, serí­a algo como Function SustAlias( cCadenaBlockOnGetData , "articu0", "articu1"), esto se hace al hacer SetDbf() y no creo que se notara siquiera lo que tarda.
No veo otra forma en principio, la 2ª me gusta bastante y es fácil de implementar.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42447cc4@ozsrv2.ozlan.local...]42447cc4@ozsrv2.ozlan.local...[/email]
Joaquin,
Por lo que cuentas, ya he descubierto donde esta el problema y es que el método SetDbf() sólo inicializa el evento OnGetData de las columnas una vez, sino esta definido, y para ir lo más rápido posible el valor del Alias se convierte en un literal antes de bloquificarlo. Cuando cambias de Alias con SetDbf() ese alias ya no coincide y por lo tanto falla.
Podrí­a forzar la reinicilización de los eventos OnGetData y OnGetValue, pero entonces se perderí­an dichos eventos cuando hayan sido creados por el usuario, o también podrí­a incluir la propiedad cAlias en el codeblock generado, pero ello supondrí­a una perdida no se si apreciable de velocidad. Otra opción serí­a poner un tercer parametro lógico al metodo SetDbf() pero no sabrí­a ni como llamarlo. Tengo que pensarlo antes de hacer nada, cualquier opinión es bienvenida.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4242a5d6@ozsrv2.ozlan.local...]4242a5d6@ozsrv2.ozlan.local...[/email]
Ignacio,
El código que envié en vez de ocultar el header, le he puesto lo que me has dicho lRedraw a .F. y luego a .T. y con eso no parpadea nada y no se estropea el Footer, ¡gracias!
Pero, sigo reportando el mismo error, si pongo exactamente el código que me pones
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
La 1ª vez me muestra los registros bien, pero si la vuelvo a llamar con otro alias, me pone el 1º registro bien y el resto de lineas del Browse repetido el 1º registro tantas veces como registros tenga la base de datos.
La única solución para que :SetDbf() funcione es haciendo antes un reset() y luego definiendo de nuevo cada columna.
Un Saludo,
Joaquí­n
"Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje news:[email=42427ead@ozsrv2.ozlan.local...]42427ead@ozsrv2.ozlan.local...[/email]
Joaquin,
Prueba con:
with object oBrw
:lRedraw := .F.
:SetDbf( cAlias )
:lRedraw := .T.
:Refresh( .T. )
end with
En cuanto al ejemplo, lo siento pero no me vale, no está autocontenido y por lo tanto no puedo probarlo. Necesito un ejemplo que rápido y claramente me muestre que el error es nuestro, y no tener que hacer yo personalmente un proyecto desde cero que al final es posible que me falle o no. Espero que lo entiendas.
En cualquier caso, es posible que el browse falle irremediablemente cuando se empiezan a ocultar su header y footer y se hacen cualquier otro tipo de operaciones raras, por lo que seguramente dejaremos inaccesible el header y footer en el futuro, es decir, como datos privados de la clase.
Un saludo,
"Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje news:[email=4241f637@ozsrv2.ozlan.local...]4241f637@ozsrv2.ozlan.local...[/email]
> Ignacio,
>
> Si no oculto el header el efecto de cambiar de Alias es horrible, el usuario
> ve como se cargan todos los campos con los headers llamándose como el propio
> campo y a continuación se ponen los headers que les he definido.
>
> Si hay alguna manera elegante de que en un browse pueda ver algunos campos
> de una base y poder cambiar de directorio para ver otra base idéntica pero
> con diferentes datos, sin hacer esto, y que se vea bonito de cara al usuario
> me gustarí­a conocerla, porque esta es la única manera que he encontrado.
>
> Y el ejemplo es exactamente el código que he puesto, si quieres que te lo
> ponga en un form con un botón te lo preparo, pero no hago nada especial más
> que el trozo de código que te he puesto.
>
> Un Saludo,
> Joaquí­n
>
> "Ignacio Ortiz" <NoNameToAvoidSpam@ozs.com> escribió en el mensaje
> news:[email=4241bf0f@ozsrv2.ozlan.local...]4241bf0f@ozsrv2.ozlan.local...[/email]
>> Joaquin,
>>
>> No ocultes el Header en ningún momento. Manda un pequeño ejemplo que
> muestre
>> el error. Gracias
>>
>> Un saludo,
>>
>> "Joaquí­n Martí­nez" <jmartial@interbook.net> escribió en el mensaje
>> news:[email=42415e03@ozsrv2.ozlan.local...]42415e03@ozsrv2.ozlan.local...[/email]
>> > Hola,
>> >
>> > Necesito ponerle footer y esto es lo que me hace xailer, el footer lo
> pone
>> > debajo del Header y en el sitio del footer lo deja transparente, este
>> > browse
>> > lo defino en el IDE y para cambiar de oDataSet he puesto este código:
>> >
>> > WITH OBJECT ::oBrwFaccli
>> >
>> > :oHeader:lVisible:=.F.
>> > :Reset()
>> > :SetDbf( ::oFaccli:Alias() , ;
>> >
>> > {"c_serie","c_numfaccl","c_codigoc","c_rsocialc","c_tfaccl "})
>> >
>> > :aCols[1]:cHeader := "Serie"
>> > :aCols[1]:nWidth := 47
>> > :aCols[1]:cFooter := ""
>> >
>> > :aCols[2]:cHeader := "Nº Factura"
>> > :aCols[2]:nWidth := 85
>> > :aCols[2]:cFooter := ""
>> >
>> > :aCols[3]:cHeader := "Cliente"
>> > :aCols[3]:nWidth := 100
>> > :aCols[3]:cFooter := ""
>> >
>> > :aCols[4]:cHeader := "Razón Social"
>> > :aCols[4]:nWidth := 365
>> > :aCols[4]:cFooter := ""
>> >
>> > :aCols[5]:cHeader := "Total Factura"
>> > :aCols[5]:nWidth := 150
>> > :aCols[5]:cPicture:= "@Z 999,999,999.99"
>> > :aCols[5]:cFooter := "Pie"
>> >
>> >
>> >
>> >
>> > :Refresh(.T.)
>> > :oHeader:lVisible:=.T.
>> >
>> > END
>> >
>> > No sé hacerlo de otra forma y que refresque bien. Adjunto Foto
>> >
>> > Un Saludo,
>> > Joaquí­n
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>
>
--
Responder