Colgado al agregar un registro

Post Reply
miarcod
Posts: 172
Joined: Tue Oct 11, 2005 2:17 pm

Colgado al agregar un registro

Post 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?
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Colgado al agregar un registro

Post 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 )
 
João Santos - São Paulo - Brasil
miarcod
Posts: 172
Joined: Tue Oct 11, 2005 2:17 pm

Re: Colgado al agregar un registro

Post 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
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Colgado al agregar un registro

Post 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.
João Santos - São Paulo - Brasil
artu01
Posts: 306
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Colgado al agregar un registro

Post 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
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
miarcod
Posts: 172
Joined: Tue Oct 11, 2005 2:17 pm

Re: Colgado al agregar un registro

Post 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
JESUS MARIN
Posts: 91
Joined: Wed Jan 02, 2019 8:36 am

Re: Colgado al agregar un registro

Post 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
 
artu01
Posts: 306
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Colgado al agregar un registro

Post 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
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
Post Reply