Rutina para asegurarse que agrega un registro

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

Rutina para asegurarse que agrega un registro

Post 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
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Post 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
User avatar
joseluisysturiz
Posts: 2024
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela
Contact:

Re: Rutina para asegurarse que agrega un registro

Post 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:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Post 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.
Saludos
Quique
User avatar
nazariosn
Posts: 15
Joined: Sat Nov 26, 2005 1:06 am
Location: Mexico

Post 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
Post Reply