FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Colgado al agregar un registro
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Colgado al agregar un registro
Posted: Thu Oct 01, 2020 04: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 (fw): Select all Collapse
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 (fw): Select all Collapse
   (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?
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Colgado al agregar un registro
Posted: Thu Oct 01, 2020 05:01 PM
Code (fw): Select all Collapse
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
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Colgado al agregar un registro
Posted: Thu Oct 01, 2020 05: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 (fw): Select all Collapse
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 (fw): Select all Collapse
nSmf := BloquearAltaRegistro(cAlias)
If nSmf == NIL
   return .F.
EndIf
lSalida := AgregaRegistro(cAlias, lUnlock, nVeces)
DesBloquearAltaRegistro(nSmf, cAlias)


Un saludo
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: Colgado al agregar un registro
Posted: Thu Oct 01, 2020 09: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
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: Colgado al agregar un registro
Posted: Sat Oct 03, 2020 06: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
Posts: 203
Joined: Tue Oct 11, 2005 02:17 PM
Re: Colgado al agregar un registro
Posted: Thu Oct 08, 2020 06:11 AM
Buenos dias,

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

Code (fw): Select all Collapse
  (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
Posts: 199
Joined: Wed Jan 02, 2019 08:36 AM
Re: Colgado al agregar un registro
Posted: 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 (fw): Select all Collapse
  (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
deumare@gmail.com
Posts: 400
Joined: Fri May 11, 2007 08:20 PM
Re: Colgado al agregar un registro
Posted: Thu Oct 08, 2020 05: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 (fw): Select all Collapse
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 (fw): Select all Collapse
   (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

Continue the discussion