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 método RecLock de dbfDATASET

Foro público de Xailer en español
Responder
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Error en método RecLock de dbfDATASET

Mensaje por jose.luis »

Hola,
Entiendo que lo siguiente es un error. Por ejemplo, esté código:
::oMidbf:GoTop() //--> Objeto tdbfDataset sobre un tADSDatasource
DO WHILE !::oMidbf:Eof()
IF ::oMidbf:RecLock()
::oMidbf:micampo := "unvalor"
::oMidbf:RecUnLock()
ENDIF
::oMidbf:Skip()
ENDDO
El caso es que el método RECLOCK de dbfDATASET tiene un DEFAULT nRecord TO
::RecNo() cuando, si no se indica nada, deberí­a no tener valor.
Eso provoca que cada vez que se haga un bloqueo de registro no se eliminen
los bloqueos anteriores. Y en el caso de ADS (y puede que en DBFCDX) al
llegar a los 4000 y pico de bloqueos da errores de 'Timeout' dado que ya no
'caben' más bloqueos. Y mientras no se llegue a ese número la aplicación va
más lenta (dado que tiene que manejar una lista creciente de bloqueos).
Creo que lo apropiado serí­a dejar el método de esta manera:
METHOD RecLock( nRecord, nTimeOut ) CLASS XDbfDataSet
LOCAL lForever
LOCAL nCounter := 0
DEFAULT nTimeOut TO ::oDataSource:nTimeOut
lForever := ( nTimeOut == 0 )
DO WHILE lForEver .OR. nTimeOut > 0
IF ( ::cAlias )->( DbRlock( nRecord ) )
RETURN .T.
ENDIF
Sleep( 500 )
nTimeOut -= .5
IF lForever .AND. nTimeOut <= 0
MsgAlert( LT(
XA_MSG_REGISTRO_BLOQUEADO_POR_OTRO_USUARIO_O_APLICACION ), LT(
XA_MSG_ERROR_EN_BLOQUEO_DE_REGISTRO_EN_ALIAS ) + " " + ::cAlias )
nTimeOut := ::oDataSource:nTimeOut
ENDIF
ENDDO
::NewError( LT( XA_MSG_REGISTRO_BLOQUEADO_POR_OTRO_USUARIO ) )
RETURN .F.
Saludos,
José Luis Capel
jose.luis
Mensajes: 1633
Registrado: Vie Oct 14, 2005 10:56 pm

Error en método RecLock de dbfDATASET

Mensaje por jose.luis »

Hola,
¿Os ha dado tiempo a mirar esto?
Saludos,
José Luis Capel
"José Luis Capel" escribió en el mensaje de
noticias:[email=4d18d0c7@svctag-j7w3v3j....]4d18d0c7@svctag-j7w3v3j....[/email]
Hola,
Entiendo que lo siguiente es un error. Por ejemplo, esté código:
::oMidbf:GoTop() //--> Objeto tdbfDataset sobre un tADSDatasource
DO WHILE !::oMidbf:Eof()
IF ::oMidbf:RecLock()
::oMidbf:micampo := "unvalor"
::oMidbf:RecUnLock()
ENDIF
::oMidbf:Skip()
ENDDO
El caso es que el método RECLOCK de dbfDATASET tiene un DEFAULT nRecord TO
::RecNo() cuando, si no se indica nada, deberí­a no tener valor.
Eso provoca que cada vez que se haga un bloqueo de registro no se eliminen
los bloqueos anteriores. Y en el caso de ADS (y puede que en DBFCDX) al
llegar a los 4000 y pico de bloqueos da errores de 'Timeout' dado que ya no
'caben' más bloqueos. Y mientras no se llegue a ese número la aplicación va
más lenta (dado que tiene que manejar una lista creciente de bloqueos).
Creo que lo apropiado serí­a dejar el método de esta manera:
METHOD RecLock( nRecord, nTimeOut ) CLASS XDbfDataSet
LOCAL lForever
LOCAL nCounter := 0
DEFAULT nTimeOut TO ::oDataSource:nTimeOut
lForever := ( nTimeOut == 0 )
DO WHILE lForEver .OR. nTimeOut > 0
IF ( ::cAlias )->( DbRlock( nRecord ) )
RETURN .T.
ENDIF
Sleep( 500 )
nTimeOut -= .5
IF lForever .AND. nTimeOut <= 0
MsgAlert( LT(
XA_MSG_REGISTRO_BLOQUEADO_POR_OTRO_USUARIO_O_APLICACION ), LT(
XA_MSG_ERROR_EN_BLOQUEO_DE_REGISTRO_EN_ALIAS ) + " " + ::cAlias )
nTimeOut := ::oDataSource:nTimeOut
ENDIF
ENDDO
::NewError( LT( XA_MSG_REGISTRO_BLOQUEADO_POR_OTRO_USUARIO ) )
RETURN .F.
Saludos,
José Luis Capel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9459
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en método RecLock de dbfDATASET

Mensaje por ignacio »

José Luis,
Hecho para conseguir el mismo funcionamiento que la función DBRLock(). La
modificación que propones es la que se ha realizado. Gracias.
Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
http://www.xailer.com/forum
http://www.xailer.com/dokuwiki
"José Luis Capel" escribió en el mensaje de
noticias:[email=4d18d0c7@svctag-j7w3v3j....]4d18d0c7@svctag-j7w3v3j....[/email]
Hola,
Entiendo que lo siguiente es un error. Por ejemplo, esté código:
::oMidbf:GoTop() //--> Objeto tdbfDataset sobre un tADSDatasource
DO WHILE !::oMidbf:Eof()
IF ::oMidbf:RecLock()
::oMidbf:micampo := "unvalor"
::oMidbf:RecUnLock()
ENDIF
::oMidbf:Skip()
ENDDO
El caso es que el método RECLOCK de dbfDATASET tiene un DEFAULT nRecord TO
::RecNo() cuando, si no se indica nada, deberí­a no tener valor.
Eso provoca que cada vez que se haga un bloqueo de registro no se eliminen
los bloqueos anteriores. Y en el caso de ADS (y puede que en DBFCDX) al
llegar a los 4000 y pico de bloqueos da errores de 'Timeout' dado que ya no
'caben' más bloqueos. Y mientras no se llegue a ese número la aplicación va
más lenta (dado que tiene que manejar una lista creciente de bloqueos).
Creo que lo apropiado serí­a dejar el método de esta manera:
METHOD RecLock( nRecord, nTimeOut ) CLASS XDbfDataSet
LOCAL lForever
LOCAL nCounter := 0
DEFAULT nTimeOut TO ::oDataSource:nTimeOut
lForever := ( nTimeOut == 0 )
DO WHILE lForEver .OR. nTimeOut > 0
IF ( ::cAlias )->( DbRlock( nRecord ) )
RETURN .T.
ENDIF
Sleep( 500 )
nTimeOut -= .5
IF lForever .AND. nTimeOut <= 0
MsgAlert( LT(
XA_MSG_REGISTRO_BLOQUEADO_POR_OTRO_USUARIO_O_APLICACION ), LT(
XA_MSG_ERROR_EN_BLOQUEO_DE_REGISTRO_EN_ALIAS ) + " " + ::cAlias )
nTimeOut := ::oDataSource:nTimeOut
ENDIF
ENDDO
::NewError( LT( XA_MSG_REGISTRO_BLOQUEADO_POR_OTRO_USUARIO ) )
RETURN .F.
Saludos,
José Luis Capel
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder