Retraso con el metodo AddNew y mala recuperacion de datos. Porque?

Iniciado por NemeSys, 14 Noviembre 2006, 10:04 AM

0 Miembros y 1 Visitante están viendo este tema.

NemeSys

Hola a todos,

estoy desarrollando un programa en VB que utiliza una BD en Access linkada con el motor jet 4.0.

Los accesos los hago a través de Recordset abiertos con la instruccion SQL que toca.

Pero si cuando uso el metodo Addnew, y despues del update,
recupero los datos de toda la tabla o parte de ella, los datos recien añadidos no se me recuperan, con lo que no puedo refrescar los controles que deberian refrescarse con los datos nuevos.

Para paliar esto estoy usando, como chapuza, la funcion API sleep, pero a medida que la tabla crece esta solucion deja de ser efectiva a menos que no ponga un sleep bastante grande. Cosa que hace que los updateos a la BD sean bastante mas lentos de lo que deberian.

Cuando debugo esto casi no sucede, pero si ejecuto, si. Supongo que es porque a la base de datos no le da tiempo a updatearse antes de ejecutar la select que viene a continuacion al updateo.

En resumen:

VB -> addnew -> BD (dato nuevo)
VB -> query -> BD (datos viejos)

Tal vez, seria mejor hacer un insert a pelo con SQL, al hacer open en el recordset?

Saludos y Gracias.

Ironhorse

Proba usando la misma conexión (sin cerrarla y volverla a abrir) para actualizar y recuperar despues los datos.

Saludos
Pégense una vuelta por Cracton :)

CeLaYa

recuerda que cuando usas una tabla estas trabajando sobre los datos que se cargaron en memoria, lo que tienes que hacer es actualizar la tabla antes de poder sacarle datos, es decir despues del Addnew, el registro nuevo se agrego en la tabla que esta cargada en memora aplica un Update para que grabe el registro fisicamente y luego ya podras hacerle lo que quieras

dim tb as recordset

' Agregas el registro
tb.AddNew
tb!Campo1 = X
tb!Campo2 = y
'Actualizas la tabla
tb.Update


yo lo he usado asi y funciona muy bien

la otra manera de agregar registros es haciendolo por medio de la consulta SQL "INSERT INTO"

dim Db as Database

Db.Execute "INSERT INTO Tabla " & _
                       "(campo1, Campo2) VALUES " & _
                       "('" & Valor1 & "', '" & Valor2 & "');", dbFailOnError
If Err Then fError Err.Number, Err.Description

"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.

NemeSys

Gracias por las respuestas,

Ironhorse,

El problema es que la conexión a la BD no la cierro hasta el final del proceso.

En cambio el Recordset debo cerrarlo porque primero ejecuto una instrucción add, y luego debo cerrarla para poder refrescar el Recordset con un open cuyo source es una instrucción SQL.

Si despues de hacer update reabro el recordset con una SQL me da error 3005. Accion no permitida si el objeto esta abierto.

CeLaYa,

el algoritmo que propones, ya lo utilizo, invoco el addnew, inserto los campos e invoco el update.

Luego lo reabro con el Open haciendo un Select * from tabla; y es entonces cuando recupera los registros de la tabla excepto el ultimo insertado.

La BD tiene pocos registros y ya me pasa esto, pensaba al principio que pudiese ser problema de performance debido al tamaño, pero el caso es que en BD's de menos de diez registros por tabla ya me pasa.

Auque lo que propones del insert, lo prové en un programa anterior (de hace mucho tiempo y creo que este problema no lo tuve). Gracias por recordarmelo :)

Provaré con el insert SQL a pelo a ver que pasa.

Saludos

Hans el Topo

esto me ocurrió ayer xD

aplicaba un filtro  luego añadia y no me refrescaba los datos,
lo tienes que hacer manual

'despues del update
rs.refresh    'si has usado la propiedad/método filter para el filtro éste se resetea
'si el filtro es una consulta no hay problemas, tu nuevo registro se encontrará correcto
 

ranslsad

#5
Hola, me q equivocado, porfavor borren el post...

Salu2

Ranslsad

Ironhorse

CitarSi despues de hacer update reabro el recordset con una SQL me da error 3005. Accion no permitida si el objeto esta abierto.


si queres hacer otra consulta con el mismo recordset tenes que cerrarlo primero:

rs.close
Pégense una vuelta por Cracton :)