PROBLEMAS CON UPDATE Y CURSORLOCATION EN ADODB
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
"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
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
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
