PROBLEMAS CON UPDATE Y CURSORLOCATION EN ADODB

bety_gs
10 de Mayo del 2004
Tenemos un problemon con el update. Resulta que cuando no se ha modificado ningun dato y ejecutamos update nos marca un error dice:

"Error '-2147217864 (80040e38)' en tiempo de ejecución No se pudo encontrar la fila especificada para su actualización: algunos valores han cambiado desde la última vez que se leyó".

El punto es este: Si utilizo como cursorlocation aduseserver y adopendynamic, o cualquier adopen, no hay problema con este error, pero no me deja agregar registros, cuando le pongo addnew lo que hace es encimarme el nuevo registro en el último que consulte. Si utilizo como cursorlocation aduseclient no hay problema con la inserción de nuevos registros, pero es cuando sucede el error con el update.

El error se soluciona verificando que realmente haya cambiado alguno de los datos, pero como sabran esto es demasiado entretenido pues la base de datos es muy grande y perderiamos mucho tiempo en la programación en estar verificando todos los campos para ver si alguno cambio. Y el mismo error sucede de un derrepente en algunos registros, que aun cuando cambio algun dato y le doy guardar me marca error, y hago exactamente lo mismo con otro registro de la misma tabla en el mismo formulario y no me marca nada.

La verdad es un gran problema que nos tiene retrasados y ya he buscado en internet pero no encuentro nada parecido a esto. Espero me puedan ayudar a encontrar la solución.

Muchas gracias.

Aqui esta un pedacito del código. (el bookmark esta correcto ya lo revisamos)

Sub AbrirBD(BD As ADODB.Connection)
Set BD = New ADODB.Connection
With BD ' con esta declaracion si reconoce cualquier Base de datos
.Provider = "MYSQLPROV"
If jl.AllTrim(cRuta) = "" Then
.ConnectionString = "Data Source=" & "PUNTOZERO" & ";"
Else
.ConnectionString = "Data Source=" & "PUNTOZERO" & ";" & _
"Password = '';" & _
"User ID = 'root';" & _
"Location = " + cRuta + ";"
&n bsp; End If
End With
BD.Open
End Sub



Sub AbrirTabla(Tbl As ADODB.Recordset, BD As ADODB.Connection, Consulta As String)
Set Tbl = New ADODB.Recordset
Tbl.CursorLocation = adUseClient
Tbl.Open "SELECT * FROM " & Consulta, BD, adOpenStatic, adLockOptimistic
End Sub





Private Sub Graba()
Dim strCampo As String
Screen.MousePointer = 11

If Nuevo Then
TblProducto.AddNew
TblProducto!Clave = dcboProducto.Text
TblProducto!FechaRegistro = Date
TblProducto!CostoProm = jl.jlVal(Costo.Text)
TblProducto!Porvender = "0"
TblProducto!Porcomprar = "0"
Else
TblProducto.Bookmark = vReg
End If

If Cambios Or Nuevo Then
TblProducto!Descrip = Descripcion.Text & ""
TblProducto!Lin ea = dcboLinea.Text & ""
TblProducto!Existencia = jl.jlVal(Existencia.Text)
TblProducto!ExistMin = jl.jlVal(ExistMin.Text)
TblProducto!ExistMax = jl.jlVal(ExistMax.Text)
TblProducto!Costo = jl.jlVal(Costo.Text)
TblProducto!SUBLINEA = dcboSublinea.Text & ""

TblProducto!pesoprom = jl.jlVal(txtPeso.Text)
TblProducto!IVA = jl.jlVal(txtIVA.Text)
TblProducto!DESCUENTO = jl.jlVal(txtDescuento)
TblProducto!Servicio = chkServicio.Value & ""
TblProducto!ENLISTA = chkEnlista.V alue & ""
TblProducto!UnidadMedida = dcboUnidad.Text & ""
TblProducto!MARCA = dcboMarca.Text & ""
TblProducto!descripcorta = txtDescripCorta.Text & ""
TblProducto!REORDEN = jl.jlVal(txtAlerta.Text)
TblProducto!IMPUESTOAD = jl.jlVal(txtImpuesto.Text)

For i = 0 To NPRECIOS - 1
strCampo = "Precio" & Format(i + 1)
TblProducto.Fields(strCampo) = jl.jlVal(txtPrecio(i).Text)
If UTILIDAD Then
&nb sp; strCampo = "Ganancia" & Format(i + 1)
TblProducto.Fields(strCampo) = jl.jlVal(txtGan(i).Text)
End If
If RANGO Then
strCampo = "Rango" & Format(i + 1)
TblProducto.Fields(strCampo) = jl.jlVal(txtRango(i).Text)
End If
Next

If txtRuta <> "" Then TblProducto!ImagenArchivo = Replace(txtRuta.Text, "", " \")

TblProducto!FechaCambios = Date

TblProducto.Update
TblProducto.Requery
End If

If Nuevo Or CambiosText Then
Call GrabaTexto(dcboProducto.Text, "ART", BDProducto, Observaciones)
CambiosText = False
Nuevo = False
End If

Screen.MousePointer = 0
End Sub



rafa
10 de Mayo del 2004
Hola.
Según lo que entiendo, tu tienes los datos de un registro en pantalla, realizas alguna modificacion y la grabas, y en ese momento (en ciertos registros te da el error).
Me parece que te fallaria en los registros que teniendolos tu en pantalla han sufrido alguna modificacion posterior a la carga de tu recordset, y cuando tu intentas actualizar ese registro, en la bbdd ya no corresponde a lo que tenia tu recordset cargado.
Lo que yo te aconsejo es que para evitar estos cruces, cuando consultes un registro lo bloquees para que otro no pueda hacer ninguna modificacion en el (ademas de los complicados bloqueos de los recordset o de la bbdd, simplemente puedes crearte un campo en ese registro que identifique que esta en uso, o cargar su clave en una tabla).
Espero que esto te sirva
Rafa