Page 1 of 1

Colgado al agregar un registro

Posted: Thu Oct 01, 2020 4:19 pm
by miarcod
Hola a todos

Para agregar un registro en un ambiente de red a un fichero dbf/cdx venía utilizando el codigo:

Code: Select all

nIntentos := 5
cAlias    := "ALIAS"
lUnLock   := .F.

DO WHILE .T.
   (cAlias)->(dbAppend(lUnLock))
   If !NetErr() // Si no hay error
      RETURN .t.
   EndIf
   If nIntentos <=0
      EXIT
   EndIf
   Depura("Esperando 1/2 segundo para agregar un registro")
   syswait(0.5)
   nIntentos ++
ENDDO
Depura("finAgregaRegistrocon error")
 
Debido a que en algunas ocasiones me aparecían registros vacios modifique el codigo haciendo que despues de agregar el registro se mueva el puntero al registro que se acaba de añadir.

Code: Select all

   (cAlias)->(dbAppend(lUnLock))
   If !NetErr() // Si no hay error
      (cAlias)->(dbgoto( (cAlias)->(RECNO())))
      sysrefresh()
      RETURN .t.
   EndIf
 
Ahora en algunas ocasiones el programa se queda colgado cuando ejecuto la línea en la que se mueve el puntero

¿Alguna idea de que puede estar pasando?

Re: Colgado al agregar un registro

Posted: Thu Oct 01, 2020 5:01 pm
by karinha

Code: Select all

FUNCTION NEWRECORD()

   DBAPPEND() 

   IF NETERR() 

      MsgInfo( "Erro: Nao posso criar um novo registro ", "Confirma " )

      RETURN( .F. ) 

   ENDIF 

RETURN( .T. ) 

FUNCTION RECORDLOCK()  // TRABAR REGISTRO.

   LOCAL ABORTED := .F. 
   LOCAL TRY := 1

   DO WHILE .NOT. RLOCK()

      SYSREFRESH()

      INKEY(0.5) 

      IF ++TRY > 10 

         ABORTED := .T. 
         EXIT 

      ENDIF 

   ENDDO 

   IF ABORTED 

      MsgInfo( "Registro bloqueado por outro usuario", "Confirma" )

   ENDIF 

RETURN( ABORTED )
 

Re: Colgado al agregar un registro

Posted: Thu Oct 01, 2020 5:54 pm
by miarcod
Karinha, gracias por contestar

Lo que me propones es lo mismo que hago yo, pero como en ocasiones se generaban registros vacios le agrege el movimiento del puntero en el area de trabajo y ahora en determinadas ocasiones (no se exactamento cual el la situación) se queda colgado en la orden (dbgoto)

Tengo verirficado que el sistema se queda colgado en esa instrucción. Supongo que desde otro terminal se hizo algo pero no acabo de tener claro es lo que deja mal el otro terminal.
Lo que si hago para que desde otro terminal no se esté agregando registros al mismo ficheroes la de establecer un semaforo con un fichero excluisvo para que dos terminales no puedan estar intentando agregar un registro en el mismo dbf en el mismo momento

Code: Select all

FUNCTION BloquearAltaRegistro(cAlias)
Memvar oEntorno
Local cSmf, nMani, nIntentos
cSmf := cPathDBF + cAlias + "_NWR.SMF"
nIntentos := 5

Do WHILE nIntentos > 0
   nMani := FCREATE( cSmf, 0 )
   If nMani != -1
      RETURN nMani
   EndIf
   nIntentos--
ENDDO
RETURN nMani
//------------------------------------------------------------------------//
FUNCTION DesBloquearAltaRegistro(nMani, cAlias)
Memvar oEntorno
Local cSmf
fclose(nMani)
cSmf := oEntorno:cPathSmf + cAlias + "_NWR.SMF"
ferase(cSmf)
RETURN NIL
 

Code: Select all

nSmf := BloquearAltaRegistro(cAlias)
If nSmf == NIL
   return .F.
EndIf
lSalida := AgregaRegistro(cAlias, lUnlock, nVeces)
DesBloquearAltaRegistro(nSmf, cAlias)
Un saludo

Re: Colgado al agregar un registro

Posted: Thu Oct 01, 2020 9:03 pm
by karinha
Vacios, cuando? podrias poner ejemplo simples?

No me gusta esa lógica que presenta tú. Desculpas, se la escrita no está correcta... és portunhol. jajajaja.

Saludos.

Re: Colgado al agregar un registro

Posted: Sat Oct 03, 2020 6:16 pm
by artu01
miarcod wrote:Karinha, gracias por contestar

Lo que me propones es lo mismo que hago yo, pero como en ocasiones se generaban registros vacios le agrege el movimiento del puntero en el area de trabajo y ahora en determinadas ocasiones (no se exactamento cual el la situación) se queda colgado en la orden (dbgoto)

Tengo verirficado que el sistema se queda colgado en esa instrucción. Supongo que desde otro terminal se hizo algo pero no acabo de tener claro es lo que deja mal el otro terminal.
Hola intenta ponerle commit antes del dbgoto()
miarcod wrote:Karinha, gracias por contestar

Lo que si hago para que desde otro terminal no se esté agregando registros al mismo ficheroes la de establecer un semaforo con un fichero excluisvo para que dos terminales no puedan estar intentando agregar un registro en el mismo dbf en el mismo momento
te refieres a que la clave indice no se repita? entonces antes de adicionar un new registro deberias hacerle un seek a la clave indice de tu dbf

Re: Colgado al agregar un registro

Posted: Thu Oct 08, 2020 6:11 am
by miarcod
Buenos dias,

El programa se queda colgado, no siempre, solo en algunas ocasiones cuando se ejecuta la funcion dboto

Code: Select all

  (cAlias)->(dbAppend(lUnLock))
   If !NetErr() // Si no hay error
      (cAlias)->(dbgoto( (cAlias)->(RECNO())))
      sysrefresh()
      RETURN .t.
   EndIf
 
Esto sucede aleatoriamente en cualquier fichero. El efecto es que en algunos terminales de red se quedan colgados, si embargo otros pueden seguir trabajando.
Los registros vacios se producen porque sospecho que el dbappend se ejecuta pero al quedarse colgado el proceso no se completa pues no se llega a ejecutar los correspondientes replaces

Sigo investigando.

Un saludo

Re: Colgado al agregar un registro

Posted: Thu Oct 08, 2020 11:34 am
by JESUS MARIN
Buenas

Recuerdo que me pasaba lo mismo (hace muchos años), en entorno de red (REDES NOVELL).

Creo recordar que el problema es que no das tiempo a que se grabe fisicamente el registro. Debes darle un instante y forzar el grabado con el DBCOMMIT(), antes de refrescar.

Code: Select all

  (cAlias)->(dbAppend(lUnLock))
   If !NetErr() // Si no hay error
     (cAlias)->DBCommit()                            // fuerza la escritura en el disco duro
     (cAlias)->dbGoTop()                             // Va al último registro
      sysrefresh()
      RETURN .t.
   EndIf
 

Re: Colgado al agregar un registro

Posted: Thu Oct 08, 2020 5:00 pm
by artu01
miarcod wrote:Hola a todos

Para agregar un registro en un ambiente de red a un fichero dbf/cdx venía utilizando el codigo:

Code: Select all

nIntentos := 5
cAlias    := "ALIAS"
lUnLock   := .F.

DO WHILE .T.
   (cAlias)->(dbAppend(lUnLock))
   If !NetErr() // Si no hay error
      RETURN .t.
   EndIf
   If nIntentos <=0
      EXIT
   EndIf
   Depura("Esperando 1/2 segundo para agregar un registro")
   syswait(0.5)
   nIntentos ++
ENDDO
Depura("finAgregaRegistrocon error")
 
Debido a que en algunas ocasiones me aparecían registros vacios modifique el codigo haciendo que despues de agregar el registro se mueva el puntero al registro que se acaba de añadir.

Code: Select all

   (cAlias)->(dbAppend(lUnLock))
   If !NetErr() // Si no hay error
      (cAlias)->(dbgoto( (cAlias)->(RECNO())))
      sysrefresh()
      RETURN .t.
   EndIf
 
Ahora en algunas ocasiones el programa se queda colgado cuando ejecuto la línea en la que se mueve el puntero

¿Alguna idea de que puede estar pasando?
Te sugiero que pruebes quitandole el neterror y la funcion depura(), a veces menos es mas, pruebalo asi haber si desaperece los registros vacios, yo he trabajado con dbf en red años y no he tenido ese problema solo usaba los comandos basicos: rlock() para bloquear registros, unlock() para desbloquear el registro, append() para añadir nuevo registros

Otra opcion podrias probar con DATABASE aqui en el foro hay bastantes ejemplos