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
>> >
>> >
>> >
>> >
>> >
>> >
>>
>>
>
>
--