Buenas compañeros, llevo toda la semana loco con un error en un programa
de un cliente que me parecía inconcebible, en los tDbfDataset al editar
unos registros machacaba su contenido con el contenido de otros registro
del mismo tDbfDataset.
Dándole mil vueltas con debuger y demás me doy cuenta de que al hacer un
tDbfDataset:Seek( xxxx ) me encuentra el registro que le pido, lo
bloqueo modifico unos campos en el y lo grabo y los campos por mi
grabados están bien y el resto se lo cepilla con los datos del anterior
registro que estaba activo.
Conclusión después de hacer el Seek no hace un Load y por lo tanto no
refresca el contenido de los objetos Datafield.
He puesto un tDbfDataset:Load()después de cada Seek y ahora yo no hay
problemas.
¿ Hay que hacer un Load() cada vez que hago un Seek o un Goto o
cualquier otro movimiento semejante ?
En ese caso sería mas lógico modificar las clases en las que veo que
solo se hace Load en contadísimas ocasiones como al hacer :Edit() por
ejemplo.
Salu2.
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.
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.
Pregunta sobre tDataset / tDbfDataSet
-
- Mensajes: 1310
- Registrado: Mié Sep 26, 2007 7:12 pm
- ignacio
- Site Admin
- Mensajes: 9459
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Pregunta sobre tDataset / tDbfDataSet
Bingen,
No comentas COMO modificas y grabas los campos del registro del Seek. No
comentas si en el anterior registro que estaba activo estabas en modo
edición o no.
El dataset sólo realiza un Load() automático cuando entra en edición con el
método Edit(). Como ves, todo depende de como hagas la grabación en el
registro del Seek. Si estás usando el métodos directo Save() de grabación
entonces es tu responsabilidad llamar a Load() antes de modificar cualquier
Datafield. Como te puedes imaginar la utilización del método Load() está
restringida al mínimo para no perder velocidad.
No obstante, acabo de modificarlo para que se haga un Load() automático
cuando se intenta modificar el buffer de cualquier DataField sino se
econtraba en edición vía método Edit() o AddNew(). Estará disponible en la
siguiente actualización.
Un saludo,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Bingen Ugaldebere" <bingen@muninser.com> escribió en el mensaje
news:46a5ba15$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Buenas compañeros, llevo toda la semana loco con un error en un programa
> de un cliente que me parecía inconcebible, en los tDbfDataset al editar
> unos registros machacaba su contenido con el contenido de otros registro
> del mismo tDbfDataset.
>
> Dándole mil vueltas con debuger y demás me doy cuenta de que al hacer un
> tDbfDataset:Seek( xxxx ) me encuentra el registro que le pido, lo bloqueo
> modifico unos campos en el y lo grabo y los campos por mi grabados están
> bien y el resto se lo cepilla con los datos del anterior registro que
> estaba activo.
>
> Conclusión después de hacer el Seek no hace un Load y por lo tanto no
> refresca el contenido de los objetos Datafield.
>
> He puesto un tDbfDataset:Load()después de cada Seek y ahora yo no hay
> problemas.
>
> ¿ Hay que hacer un Load() cada vez que hago un Seek o un Goto o cualquier
> otro movimiento semejante ?
>
> En ese caso sería mas lógico modificar las clases en las que veo que solo
> se hace Load en contadísimas ocasiones como al hacer :Edit() por ejemplo.
>
> Salu2.
No comentas COMO modificas y grabas los campos del registro del Seek. No
comentas si en el anterior registro que estaba activo estabas en modo
edición o no.
El dataset sólo realiza un Load() automático cuando entra en edición con el
método Edit(). Como ves, todo depende de como hagas la grabación en el
registro del Seek. Si estás usando el métodos directo Save() de grabación
entonces es tu responsabilidad llamar a Load() antes de modificar cualquier
Datafield. Como te puedes imaginar la utilización del método Load() está
restringida al mínimo para no perder velocidad.
No obstante, acabo de modificarlo para que se haga un Load() automático
cuando se intenta modificar el buffer de cualquier DataField sino se
econtraba en edición vía método Edit() o AddNew(). Estará disponible en la
siguiente actualización.
Un saludo,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Bingen Ugaldebere" <bingen@muninser.com> escribió en el mensaje
news:46a5ba15$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> Buenas compañeros, llevo toda la semana loco con un error en un programa
> de un cliente que me parecía inconcebible, en los tDbfDataset al editar
> unos registros machacaba su contenido con el contenido de otros registro
> del mismo tDbfDataset.
>
> Dándole mil vueltas con debuger y demás me doy cuenta de que al hacer un
> tDbfDataset:Seek( xxxx ) me encuentra el registro que le pido, lo bloqueo
> modifico unos campos en el y lo grabo y los campos por mi grabados están
> bien y el resto se lo cepilla con los datos del anterior registro que
> estaba activo.
>
> Conclusión después de hacer el Seek no hace un Load y por lo tanto no
> refresca el contenido de los objetos Datafield.
>
> He puesto un tDbfDataset:Load()después de cada Seek y ahora yo no hay
> problemas.
>
> ¿ Hay que hacer un Load() cada vez que hago un Seek o un Goto o cualquier
> otro movimiento semejante ?
>
> En ese caso sería mas lógico modificar las clases en las que veo que solo
> se hace Load en contadísimas ocasiones como al hacer :Edit() por ejemplo.
>
> Salu2.
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
-
- Mensajes: 1310
- Registrado: Mié Sep 26, 2007 7:12 pm
Pregunta sobre tDataset / tDbfDataSet
> No comentas COMO modificas y grabas los campos del registro del Seek. No
> comentas si en el anterior registro que estaba activo estabas en modo
> edición o no.
> El dataset sólo realiza un Load() automático cuando entra en edición con el
> método Edit(). Como ves, todo depende de como hagas la grabación en el
> registro del Seek. Si estás usando el métodos directo Save() de grabación
> entonces es tu responsabilidad llamar a Load() antes de modificar cualquier
> Datafield. Como te puedes imaginar la utilización del método Load() está
> restringida al mínimo para no perder velocidad.
No no estaba en edición y lo que hago es esto que dices, vamos lo que
había hecho siempre (manías de Fw que habrá que ir olvidando)
If ::oDbfFond:Seek(::oDbfMov:Fondo)
::oDbfFond:Load()
::oDbfFond:RecLock()
If ::oDbfMov:TipoMovimi="A" .And. (
::oDbfFond:FechaAlta=Ctod(" - - ") .Or.
::oDbfFond:FechaAlta>::oDbfMov:Fecha )
::oDbfFond:FechaAlta:=::oDbfMov:Fecha
Endif
If ::oDbfMov:TipoMovimi="M" .And. (
::oDbfFond:FechUltMov=Ctod(" - - ") .Or.
::oDbfFond:FechUltMov<::oDbfMov:Fecha )
::oDbfFond:FechUltMov:=::oDbfMov:Fecha
Endif
If ::oDbfMov:TipoMovimi="B" .And. (
::oDbfFond:FechaBaja=Ctod(" - - ") .Or.
::oDbfFond:FechaBaja<::oDbfMov:Fecha )
::oDbfFond:FechaBaja:=::oDbfMov:Fecha
Endif
::oDbfFond:Save()
::oDbfFond:RecUnLock()
::oDbfMov:RecLock()
::oDbfMov:Banco:=::oDbfFond:BaCodi
::oDbfMov:Save()
::oDbfMov:RecUnLock()
Endif
Sin hacer Load y Reclock ¿puedo hacer simplemente Edit supongo aunque no
va a haber una edición visual? y asi no debería de hacer ni Save ni
RecUnlock sino simplemente Update, digo yo.
> No obstante, acabo de modificarlo para que se haga un Load() automático
> cuando se intenta modificar el buffer de cualquier DataField sino se
> econtraba en edición vía método Edit() o AddNew(). Estará disponible en la
> siguiente actualización.
Muchas gracias.
Salu2.
> comentas si en el anterior registro que estaba activo estabas en modo
> edición o no.
> El dataset sólo realiza un Load() automático cuando entra en edición con el
> método Edit(). Como ves, todo depende de como hagas la grabación en el
> registro del Seek. Si estás usando el métodos directo Save() de grabación
> entonces es tu responsabilidad llamar a Load() antes de modificar cualquier
> Datafield. Como te puedes imaginar la utilización del método Load() está
> restringida al mínimo para no perder velocidad.
No no estaba en edición y lo que hago es esto que dices, vamos lo que
había hecho siempre (manías de Fw que habrá que ir olvidando)
If ::oDbfFond:Seek(::oDbfMov:Fondo)
::oDbfFond:Load()
::oDbfFond:RecLock()
If ::oDbfMov:TipoMovimi="A" .And. (
::oDbfFond:FechaAlta=Ctod(" - - ") .Or.
::oDbfFond:FechaAlta>::oDbfMov:Fecha )
::oDbfFond:FechaAlta:=::oDbfMov:Fecha
Endif
If ::oDbfMov:TipoMovimi="M" .And. (
::oDbfFond:FechUltMov=Ctod(" - - ") .Or.
::oDbfFond:FechUltMov<::oDbfMov:Fecha )
::oDbfFond:FechUltMov:=::oDbfMov:Fecha
Endif
If ::oDbfMov:TipoMovimi="B" .And. (
::oDbfFond:FechaBaja=Ctod(" - - ") .Or.
::oDbfFond:FechaBaja<::oDbfMov:Fecha )
::oDbfFond:FechaBaja:=::oDbfMov:Fecha
Endif
::oDbfFond:Save()
::oDbfFond:RecUnLock()
::oDbfMov:RecLock()
::oDbfMov:Banco:=::oDbfFond:BaCodi
::oDbfMov:Save()
::oDbfMov:RecUnLock()
Endif
Sin hacer Load y Reclock ¿puedo hacer simplemente Edit supongo aunque no
va a haber una edición visual? y asi no debería de hacer ni Save ni
RecUnlock sino simplemente Update, digo yo.
> No obstante, acabo de modificarlo para que se haga un Load() automático
> cuando se intenta modificar el buffer de cualquier DataField sino se
> econtraba en edición vía método Edit() o AddNew(). Estará disponible en la
> siguiente actualización.
Muchas gracias.
Salu2.
- ignacio
- Site Admin
- Mensajes: 9459
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Pregunta sobre tDataset / tDbfDataSet
Bingen,
Cuando haces: oDataset:Campo := "lo que sea" sin haber realizado ningún
oDataset:AddNew() o oDataset:Edit() realmente estas modificando directamente
el campo de la tabla, y para nada el buffer del datafield, por lo tanto no
hay necesidad de hacer ningún SAVE().
Un saludo,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Bingen Ugaldebere" <bingen@muninser.com> escribió en el mensaje
news:46a5d310$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
>> No comentas COMO modificas y grabas los campos del registro del Seek. No
>> comentas si en el anterior registro que estaba activo estabas en modo
>> edición o no.
>> El dataset sólo realiza un Load() automático cuando entra en edición con
>> el método Edit(). Como ves, todo depende de como hagas la grabación en el
>> registro del Seek. Si estás usando el métodos directo Save() de grabación
>> entonces es tu responsabilidad llamar a Load() antes de modificar
>> cualquier Datafield. Como te puedes imaginar la utilización del método
>> Load() está restringida al mínimo para no perder velocidad.
>
> No no estaba en edición y lo que hago es esto que dices, vamos lo que
> había hecho siempre (manías de Fw que habrá que ir olvidando)
>
> If ::oDbfFond:Seek(::oDbfMov:Fondo)
> ::oDbfFond:Load()
> ::oDbfFond:RecLock()
> If ::oDbfMov:TipoMovimi="A" .And. (
> ::oDbfFond:FechaAlta=Ctod(" - - ") .Or.
> ::oDbfFond:FechaAlta>::oDbfMov:Fecha )
> ::oDbfFond:FechaAlta:=::oDbfMov:Fecha
> Endif
> If ::oDbfMov:TipoMovimi="M" .And. (
> ::oDbfFond:FechUltMov=Ctod(" - - ") .Or.
> ::oDbfFond:FechUltMov<::oDbfMov:Fecha )
> ::oDbfFond:FechUltMov:=::oDbfMov:Fecha
> Endif
> If ::oDbfMov:TipoMovimi="B" .And. (
> ::oDbfFond:FechaBaja=Ctod(" - - ") .Or.
> ::oDbfFond:FechaBaja<::oDbfMov:Fecha )
> ::oDbfFond:FechaBaja:=::oDbfMov:Fecha
> Endif
> ::oDbfFond:Save()
> ::oDbfFond:RecUnLock()
>
> ::oDbfMov:RecLock()
> ::oDbfMov:Banco:=::oDbfFond:BaCodi
> ::oDbfMov:Save()
> ::oDbfMov:RecUnLock()
> Endif
>
>
> Sin hacer Load y Reclock ¿puedo hacer simplemente Edit supongo aunque no
> va a haber una edición visual? y asi no debería de hacer ni Save ni
> RecUnlock sino simplemente Update, digo yo.
>
>> No obstante, acabo de modificarlo para que se haga un Load() automático
>> cuando se intenta modificar el buffer de cualquier DataField sino se
>> econtraba en edición vía método Edit() o AddNew(). Estará disponible en
>> la siguiente actualización.
>
> Muchas gracias.
>
> Salu2.
Cuando haces: oDataset:Campo := "lo que sea" sin haber realizado ningún
oDataset:AddNew() o oDataset:Edit() realmente estas modificando directamente
el campo de la tabla, y para nada el buffer del datafield, por lo tanto no
hay necesidad de hacer ningún SAVE().
Un saludo,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Bingen Ugaldebere" <bingen@muninser.com> escribió en el mensaje
news:46a5d310$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
>> No comentas COMO modificas y grabas los campos del registro del Seek. No
>> comentas si en el anterior registro que estaba activo estabas en modo
>> edición o no.
>> El dataset sólo realiza un Load() automático cuando entra en edición con
>> el método Edit(). Como ves, todo depende de como hagas la grabación en el
>> registro del Seek. Si estás usando el métodos directo Save() de grabación
>> entonces es tu responsabilidad llamar a Load() antes de modificar
>> cualquier Datafield. Como te puedes imaginar la utilización del método
>> Load() está restringida al mínimo para no perder velocidad.
>
> No no estaba en edición y lo que hago es esto que dices, vamos lo que
> había hecho siempre (manías de Fw que habrá que ir olvidando)
>
> If ::oDbfFond:Seek(::oDbfMov:Fondo)
> ::oDbfFond:Load()
> ::oDbfFond:RecLock()
> If ::oDbfMov:TipoMovimi="A" .And. (
> ::oDbfFond:FechaAlta=Ctod(" - - ") .Or.
> ::oDbfFond:FechaAlta>::oDbfMov:Fecha )
> ::oDbfFond:FechaAlta:=::oDbfMov:Fecha
> Endif
> If ::oDbfMov:TipoMovimi="M" .And. (
> ::oDbfFond:FechUltMov=Ctod(" - - ") .Or.
> ::oDbfFond:FechUltMov<::oDbfMov:Fecha )
> ::oDbfFond:FechUltMov:=::oDbfMov:Fecha
> Endif
> If ::oDbfMov:TipoMovimi="B" .And. (
> ::oDbfFond:FechaBaja=Ctod(" - - ") .Or.
> ::oDbfFond:FechaBaja<::oDbfMov:Fecha )
> ::oDbfFond:FechaBaja:=::oDbfMov:Fecha
> Endif
> ::oDbfFond:Save()
> ::oDbfFond:RecUnLock()
>
> ::oDbfMov:RecLock()
> ::oDbfMov:Banco:=::oDbfFond:BaCodi
> ::oDbfMov:Save()
> ::oDbfMov:RecUnLock()
> Endif
>
>
> Sin hacer Load y Reclock ¿puedo hacer simplemente Edit supongo aunque no
> va a haber una edición visual? y asi no debería de hacer ni Save ni
> RecUnlock sino simplemente Update, digo yo.
>
>> No obstante, acabo de modificarlo para que se haga un Load() automático
>> cuando se intenta modificar el buffer de cualquier DataField sino se
>> econtraba en edición vía método Edit() o AddNew(). Estará disponible en
>> la siguiente actualización.
>
> Muchas gracias.
>
> Salu2.
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
-
- Mensajes: 1310
- Registrado: Mié Sep 26, 2007 7:12 pm
Pregunta sobre tDataset / tDbfDataSet
Pues si muy buena aclaración.
Gracias.
Ignacio Ortiz de Zúñiga escribió:
> Bingen,
>
> Cuando haces: oDataset:Campo := "lo que sea" sin haber realizado ningún
> oDataset:AddNew() o oDataset:Edit() realmente estas modificando directamente
> el campo de la tabla, y para nada el buffer del datafield, por lo tanto no
> hay necesidad de hacer ningún SAVE().
>
> Un saludo,
>
>
>
Gracias.
Ignacio Ortiz de Zúñiga escribió:
> Bingen,
>
> Cuando haces: oDataset:Campo := "lo que sea" sin haber realizado ningún
> oDataset:AddNew() o oDataset:Edit() realmente estas modificando directamente
> el campo de la tabla, y para nada el buffer del datafield, por lo tanto no
> hay necesidad de hacer ningún SAVE().
>
> Un saludo,
>
>
>