Página 1 de 1

Error en método RecLock de dbfDATASET

Publicado: Lun Dic 27, 2010 6:48 pm
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

Error en método RecLock de dbfDATASET

Publicado: Lun Ene 03, 2011 1:44 pm
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

Error en método RecLock de dbfDATASET

Publicado: Lun Ene 03, 2011 5:04 pm
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