Se blanquean campos en BD en VFP7

Hola experto, buen día! Ojala puedas ayudarme...

Tengo funcionando un sistema desarrollado en VFP7 y con BD en el mismo lenguaje...

Resulta que a veces los usuarios me reportan que los valores "se cambian solos", a veces por valores anteriores y a veces se cambian a 0.

Es posible que esto se deba a alguna falta de mantenimiento, corrupción o problema con la base de datos? O debo estar segura de que es mala operación de los usuarios?

Ojalá puedas sacarme de mi duda...

Gracias!! Saludos...

1 Respuesta

Respuesta
1

Normalmente cuando esto sucede son problemas de programación, de no utilizar un adecuado bloqueo de registro en ambiente multiusario con Rlock() y el tableUpdate() si estas trabajando con tablas en buffer. Verifica bien los Update o Replace que tenga en tu aplicativo y usa adecuadamente el Rlock y el Flock.

Hola! ante nada muchísimas gracias por contestarme tan rápido...

Quisiera plantearte una duda que me surgió: La verdad es que no empleo el rlock() ni algún otro comando que bloquee los registros pues en primera instancia mi sistema era monousuario y fue creciendo tan lentamente que no tome en cuenta eso...

Pero en el caso particular de estos registros que me están dando problemas ahora, son registros modificados por un solo usuario, ya que están bloqueados para el resto de los usuarios...

Tiene que ver con lo mismo, o podrá haber otra razón para lo que me sucede?

De hecho voy a implementar el bloqueo de registros en la red pues ya es la hora de hacerlo...

Muchas gracias! Feliz noche....

El solo hecho que otros usuario accese la tabla que esta siendo usada por otra persona puede causar conflictos de actualización, otro método que puedes emplear a nivel de la tabla es una validación NOT EMPTY(), es decir que el campo no acepte vacíos, e implementar una rutina ON ERROR que te capture ese error y puedas verificar cuando es que sucede dicho evento.

Disculpa que no había venido a revisar, no me llegó el correo avisándome de tu nueva respuesta :(

Si no es mucho molestarte, podrías hacerme un breve ejemplo de como usar el RLOCK() si estoy utilizando clausulas SQL para actualizar las tablas?

Te dejo un pedacito de mi código en donde se presenta el problema...

SELECT psh_inventario
LOCATE FOR ALLTRIM(inv_codigo) == ALLTRIM(.text7.VALUE)
IF FOUND()
UPDATE psh_inventario SET inv_descripc = descr, inv_distribuid = prov, ;
inv_precbsf = ultprec, inv_adquisic = ultcomp, ;
inv_cantidad = cant, inv_observac = observac, ;
inv_pminbsf = pmin, inv_pmaxbsf = pmax, inv_stockmin = stockmin, ;
inv_stockmax = stockmax, inv_medmat = medmat, inv_iva = apiva, ;
inv_pganancia = gcia, inv_prango = rgo, inv_fechav = fechav ;
WHERE ALLTRIM(inv_codigo) == ALLTRIM(cod) ;

ELSE
INSERT INTO psh_inventario (inv_tipo, inv_codigo, inv_descripc, inv_distribuid, inv_precbsf, ;
inv_adquisic, inv_cantidad, inv_observac, inv_pminbsf, inv_pmaxbsf, ;
inv_stockmin, inv_stockmax, inv_medmat, inv_iva, inv_pganancia, inv_prango, inv_fechav) ;
VALUES ('MM', cod, descr, prov, ultprec, ultcomp, cant, observac, pmin, pmax, stockmin, stockmax, medmat, apiva, gcia, rgo, fechav)
ENDIF

IF pModif = 1
SELECT psh_tratamient
REPLACE trat_itempbsf WITH pmax, trat_ittotbsf WITH pmax * trat_itemcant ALL FOR ALLTRIM(SUBSTR(trat_itemdesc,1,30)) == ALLTRIM(SUBSTR(descr,1,30))
ENDIF

Yo lo haría de la siguiente forma:

Select psh_inventario

Set order to inv_codigo

mCodigo=Alltrim(.text7.VALUE)

Seek mCodigo

If Found()

If Rlock()

Replace psh_inventario.inv_descripc With descr

Replace inv_distribuid With Prov

Else

Retry

Endif

Else

If Rlock()

Appen Blank

Replace inv_tipo With "MM"

Replace inv_codigo With cod

Else

Retry

Endif

Para utilizar el seek y acelerar el proceso de búsqueda, debes indexar tu tabla por el código.

Yo lo haría de la siguiente forma:
Select psh_inventario
Set order to inv_codigo
mCodigo=Alltrim(.text7.VALUE)
Seek mCodigo
If Found()
If Rlock()
Replace psh_inventario.inv_descripc With descr
Replace inv_distribuid With Prov
Unlock

Else
Retry
Endif
Else
If Rlock()
Appen Blank
Replace inv_tipo With "MM"
Replace inv_codigo With cod

Unlock

Else
Retry
Endif

Endif

Para utilizar el seek y acelerar el proceso de búsqueda, debes indexar tu tabla por el código.

Wao experto! tu eres increíble! normalmente paso diiiias esperando una ayudita :) este ejemplo que me das es loo que me faltaba para entender bien y arrancar a hacer el trabajo :)
GRAAACIASSSS

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas