Rutina para asegurarse que agrega un registro

Rutina para asegurarse que agrega un registro

Postby fleal » Wed Jun 11, 2008 12:34 am

¿Qué está mal en este código?
Me reportan que a veces sale el msgalert y no guarda el registro nuevo con la información.


¿Alguien tiene una función para asegurarse de que se ha agregado o bloqueado para actualizar el registro ?

Gracias.


La llamo de esta manera

Seguro( ( EMPLEADO ), "A" )
..............


Function Seguro( cAlias, cTipo) // B - Rlock A - Append Blank
local nSegundos := 1

Do Case
Case cTipo == "A"

( cAlias )->( dbappend() )
If !NetErr()
Return TRUE
Endif

Do While TRUE
nSegundos++
Inkey(1)

( cAlias )->( dbappend() )
If !Neterr()
Return TRUE
Endif

If nSegundos >= 5
MsgAlert("No se puede actualizar el registro"+Chr(13)+;
"Reintentar nuevamente")
nSegundos := 1
Endif

EndDo

EndCase

Return FALSE
fleal
 
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

Postby cmsoft » Wed Jun 11, 2008 2:17 am

Por lo que veo, en caso de tener un problema, se queda en un loop infinito, nunca sale del bucle DO WHILE si hay un NetErr() verdadero y puede que tu cliente cancele el programa creyendo que se colgo el sistema.
El otro problema que podes tener es que envies mal el parametro, que en lugar de enviar "A" envies otra cosa y por eso no entra en el DO CASE y no da ningun mensaje y se va.
Eso es lo unico que veo.
Espero que te sirva
User avatar
cmsoft
 
Posts: 1293
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Rutina para asegurarse que agrega un registro

Postby joseluisysturiz » Wed Jun 11, 2008 3:34 am

fleal wrote:¿Qué está mal en este código?
Me reportan que a veces sale el msgalert y no guarda el registro nuevo con la información.


¿Alguien tiene una función para asegurarse de que se ha agregado o bloqueado para actualizar el registro ?

Gracias.


La llamo de esta manera

Seguro( ( EMPLEADO ), "A" )
..............


Function Seguro( cAlias, cTipo) // B - Rlock A - Append Blank
local nSegundos := 1

Do Case
Case cTipo == "A"

( cAlias )->( dbappend() )
If !NetErr()
Return TRUE
Endif

Do While TRUE
nSegundos++
Inkey(1)

( cAlias )->( dbappend() )
If !Neterr()
Return TRUE
Endif

If nSegundos >= 5
MsgAlert("No se puede actualizar el registro"+Chr(13)+;
"Reintentar nuevamente")
nSegundos := 1
Endif

EndDo

EndCase

Return FALSE


REVISA LOS TIPS DE LAS LINEAS:

Function Seguro( cAlias, cTipo) // B - Rlock A - Append Blank
local nSegundos := 1

Do Case
Case cTipo == "A"

( cAlias )->( dbappend() ) // DEBERIAS ABRIR SOLO DENTRO DEL DO WHILE...
If !NetErr() // ACA SI NO CONSIGUE ERROR SE DEVUELVE Y NO ENTRA EN EL DO WHILE...ASI NO ENTRA A GRABAR...
Return TRUE
Endif

Do While TRUE
nSegundos++
Inkey(1)

( cAlias )->( dbappend() )
If !Neterr() // ACA SI NO CONSIGUE ERROR SE DEVUELVE Y NO ENTRA EN EL DO WHILE...ASI NO ENTRA A GRABAR...
Return TRUE
Endif

If nSegundos >= 5 // COMO DICE EL COLEGA, LO ESTAS DEJANDO EN UN CICLO INDEFINIDO POR QUE NO HAY SALIDA EL WHILE
MsgAlert("No se puede actualizar el registro"+Chr(13)+;
"Reintentar nuevamente")
nSegundos := 1
Endif

EndDo

EndCase

Return FALSE

Te recomiendo uses la clase TDATABASE, puedes controlar mejor el grabado de registro...si te interesa te mando un ejemplo a tu privado...cualquier duda no dudes en preguntar, aca nos ayudamos. :wink:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Postby quique » Wed Jun 11, 2008 3:50 am

Un comentario que me pasó hace años con clipper, no se si (x)harbour tenga el mismo efecto, cuando haces un dbAppend() y no has guardado el registro marca error al querer hacer otro dbAppend()

por ejemplo

append blank
( proceso )
replace ....
commit

Si alguien intenta hacer un un dbAppend() mientras otro usuario está en el bloque de ( proceso ) le marca error.
Saludos
Quique
User avatar
quique
 
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am

Postby nazariosn » Sat Jun 14, 2008 1:19 am

A ver si te sirve..

Static Function GuardaXX()
Local nRegistro:=Recno()
IF lGuarda
IF lEsAlta
NewRecord()
ENDIF
IF !recordLock()
XX->XX:=oGets[1]
XX->YY:=oGets[2]
End
dbUnlock()
IniXX()
lGuarda:= .F.
lEsAlta:=.F.
lEsModi:=.F.
dbgoto(nRegistro)
ENDIF

Return .T.


function NewRecord
DBAPPEND()
if NetErr()
MsgInfo("Error: No puede crear un Nuevo registro","Confirma")
return .F.
endif

return .T.

Saludos
User avatar
nazariosn
 
Posts: 15
Joined: Sat Nov 26, 2005 1:06 am
Location: Mexico


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 99 guests