Page 1 of 1

Error DBFCDX/1022

Posted: Tue Nov 12, 2013 10:31 pm
by Loren
Compañeros,

Mi aplicativo, que utiliza indices CDX y trabaja en RED LOCAL, me genera aleatoriamente este error:

Error DBFCDX/1022
Lock required

Llamado desde GFACTURAS(355)


... y justo la linea donde falla es un APPEND BLANK tipo:

select 4 ; append blank
replace nrctes with ....

NO es necesario bloquear ningun registro cuando se trata de un append blank, así que ¿ Cómo es posible ?

Mil gracias
Un saludo.
LORENZO.

Re: Error DBFCDX/1022

Posted: Tue Nov 12, 2013 11:25 pm
by cnavarro
Seguramente tendrás que realizar el bloqueo del fichero, no del registro antes de realizar el Append

Code: Select all

if Flock()

endif
 

Re: Error DBFCDX/1022

Posted: Thu Nov 14, 2013 4:42 pm
by emmort2000
Hola, amigo te envio estas dos funciones a ver si te ayudan en algo:

*******************************************************************************
FUNCTION Add_Reg(cAlias,nSecs,lEspera)
*******************************************************************************
/*
Funcion: Add_reg()
Sintaxis: Add_reg( <cNomdbf>,[<nSecs>],[<lEspera>] )
Descripcion: Agrega un registro en blanco a la base de datos

Parametros:
<cNomdbf> Nombre de la base de datos a abrir
[<nSecs>] Segundos que tiene que esperar si no puede bloquear el registro
[<lEspera>] Solo saldra hasta poder agregar un el registro

Regresa: .t. si se pudo bloquear el registro
.f. no se logro el bloque o cancelacion de la operacion
*/
LOCAL lVret := .F.,;
lError := .T.,;
nTimer
DEFAULT nSecs := 5
DEFAULT lEspera := .T.
nTimer := SECONDS() + nSecs
DO WHILE lError
(cAlias)->(DBAPPEND())
lError := NETERR()
IF lError
IF SECONDS() >= nTimer
IF !lEspera
IF MsgRetryCancel("ARCHIVO NO DISPONIBLE: "+upper(cALIAS),"ATENCION.....")
nTimer := SECONDS() + nSecs // Se incrementan los segundos
ELSE
lError := .F.
ENDIF
ELSE
nTimer := SECONDS() + nSecs // Se incrementan los segundos
ENDIF
ENDIF
ELSE
IF Reg_Lock(cAlias,nSecs)
lVret := .T.
ENDIF
ENDIF
ENDDO
RETURN (lVret)

*******************************************************************************
FUNCTION Reg_Lock(cAlias,nSecs,lEspera)
*******************************************************************************
/*
Funcion: Reg_lock()
Sintaxis: Reg_lock( <cNomdbf>,[<nSecs>],[<lEspera>] )
Descripcion: Realiza el bloqueo de un registro
Parametros:
<cNomdbf> Nombre de la base de datos a abrir
[<nSecs>] Segundos que tiene que esperar si no puede bloquear el registro
[<lEspera>] Solo saldra hasta poder agregar un el registro
Regresa: .t. si se pudo bloquear el registro o
.f. en caso de que no se logro el bloque o cancelacion de la operacion
*/
LOCAL lVret := .F.
LOCAL lError := .F.
LOCAL nTimer , oSay ,oFont
DEFAULT nSecs := 5
DEFAULT lEspera := .T.
nTimer := SECONDS() + nSecs
DO WHILE !lError
lError := (cAlias)->(RLOCK(.t.))
IF lError
lVret := .T.
ELSE
IF !lEspera
IF SECONDS() >= nTimer
IF MsgRetryCancel("REGISTRO NO DISPONIBLE" ,"ATENCION.....")
nTimer := SECONDS() + nSecs
ELSE
lError := .T.
ENDIF
ENDIF
ELSE
MSGINFO("REGISTRO NO DISPONIBLE","ATENCION.....")
nTimer := SECONDS() + nSecs
ENDIF
ENDIF
ENDDO
RETURN (lVret)