Colgado al agregar un registro

Colgado al agregar un registro

Postby miarcod » Thu Oct 01, 2020 4:19 pm

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  Expand view  RUN
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  Expand view  RUN
  (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?
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: Colgado al agregar un registro

Postby karinha » Thu Oct 01, 2020 5:01 pm

Code: Select all  Expand view  RUN

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 - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7872
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Colgado al agregar un registro

Postby miarcod » Thu Oct 01, 2020 5:54 pm

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  Expand view  RUN

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  Expand view  RUN
nSmf := BloquearAltaRegistro(cAlias)
If nSmf == NIL
   return .F.
EndIf
lSalida := AgregaRegistro(cAlias, lUnlock, nVeces)
DesBloquearAltaRegistro(nSmf, cAlias)


Un saludo
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: Colgado al agregar un registro

Postby karinha » Thu Oct 01, 2020 9:03 pm

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 - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7872
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Colgado al agregar un registro

Postby artu01 » Sat Oct 03, 2020 6:16 pm

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

Re: Colgado al agregar un registro

Postby miarcod » Thu Oct 08, 2020 6:11 am

Buenos dias,

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

Code: Select all  Expand view  RUN

  (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
miarcod
 
Posts: 199
Joined: Tue Oct 11, 2005 2:17 pm

Re: Colgado al agregar un registro

Postby JESUS MARIN » Thu Oct 08, 2020 11:34 am

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  Expand view  RUN

  (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
 
Jesús Marín
JESUS MARIN
 
Posts: 176
Joined: Wed Jan 02, 2019 8:36 am

Re: Colgado al agregar un registro

Postby artu01 » Thu Oct 08, 2020 5:00 pm

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  Expand view  RUN
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  Expand view  RUN
  (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
artu01
 
Posts: 400
Joined: Fri May 11, 2007 8:20 pm
Location: Lima


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 110 guests