Page 1 of 1

Rutina para asegurarse que agrega un registro

Posted: Wed Jun 11, 2008 12:34 am
by fleal
¿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

Posted: Wed Jun 11, 2008 2:17 am
by cmsoft
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

Re: Rutina para asegurarse que agrega un registro

Posted: Wed Jun 11, 2008 3:34 am
by joseluisysturiz
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:

Posted: Wed Jun 11, 2008 3:50 am
by quique
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.

Posted: Sat Jun 14, 2008 1:19 am
by nazariosn
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