Error en método RecLock de dbfDATASET
Publicado: Lun Dic 27, 2010 6:48 pm
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
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