Edición de Datos con Recordset Access

Bueno mi consulta es tal vez muy sencilla, quiero crear un recordser para que me actualice máximos de mi inventario mensual. He creado una consulta que suma y agrupa los ítems vendidos, estos resultados debe compararlos con los máximos registrados anteriormente en otra tabla y modificarlos si son nuevos máximos.

1 Respuesta

Respuesta
2

Si bien se puede hacer, y luego te diré cómo, en mi opinión es más rápido y sencillo que actualices por medio de una consulta de actualización.

Si lo haces por recordsets necesitas crear un recordset sobre la tabla y otro sobre la consulta, ir recorriendo todos los registros del recordset de la consulta, e ir buscando el registro correspondiente en el recordset de la tabla. Una vez localizado, comparar el valor para saber si actualizar o no. Sería algo así, en general:

Dim rstTabla as DAO.Recordset
Dim rstConsulta as DAO.Recordset
Set rstTabla=CurrentDb.OpenRecordset("Tabla")
Set rstConsulta=CurrentDb.OpenRecordset("Consulta")
rstConsulta.MoveFirst
DoUntil rstConsulta.EOF
rstTabla.FindFirst "ID=" & rstConsulta("ID")
if rstTabla("Maximo")<>rstConsulta("Maximo") Then 
rstTabla.Edit
rstTabla("Maximo")=rstConsulta("Maximo")
rstTabla.Update
rstConsulta.MoveNext
Loop
rstTabla.Close
rstConsulta.Close
Set rstTabla=Nothing
Set rstConsulta=Nothing

Si lo haces mediante una SQL de actualización, sería simplemente:

CurrentDb.Execute "UPDATE Tabla,Consulta SET Tabla.Maximo=Consulta.Maximo WHERE Tabla.ID=Consulta.ID"

Tabla lo debes cambiar por el nombre de tu tabla, Consulta por el de tu consulta, Maximo por el nombre del campo e ID por el identificador único del registro.

Un saludo.


Muchas gracias de antemano, dos consultas,  primero

"UPDATE tbl_farmaciasstockp1,cst_MaxP1 SET tbl_farmaciasstockp1.StockMaximo=cst_MaxP1.CantidadT WHERE tbl_farmaciasstockp1.ID=cst_MaxP1.ID"

esa es mi consulta de actualización, quiero preguntarte... dentro de mi tabla consulta tengo campos que extraen el mes y año, ya que se debe actualizar por mes.  Cómo sería la consulta para filtrar dentro de la consulta el mes y el año??

Por otro lado, aprovecho tu grandísima ayuda para consultarte, cuál es la diferencia entre CurrentDb.Execute y docmd que se usa para sentencias SQL y a tu criterio cuál es mejor???

mmm, me da un error:

Se ha producido el error '3061' en tiempo de ejecución:
Pocos parámetros. Se esperaba 1

Por favor estoy tratando con el recordset y tengo el siguiente error: 

Se ha producido el error '3070' en tiempo de ejecución:

El motor de base de datos de Microsoft Access no reconoce 'A0202' como un nombre de campo o expresión válidos.

En esta línea: RstTabla.FindFirst "Id =" & RstConsulta("IdMedicamento")

Como podrá apreciar son datos de texto, será por eso???

Intentaré responderte a todas tus dudas sin dejarme ninguna:

1º/ Filtrar por mes y año:

A tu SQL tendrás que añadirle esas condiciones en la parte del WHERE. Lo que no tengo claro es cómo debes hacerlo, porque no sé cómo son tu tabla y consulta ni cómo quieres aplicar el filtro. Usa posibilidad sería:

WHERE tbl_farmaciasstockp1.ID=cst_MaxP1.ID AND tbl_farmaciasstockp1.Mes=cst_MaxP1.Mes AND tbl_farmaciasstockp1.Año=cst_MaxP1.Año

2º/ CurrentDb. Execute y DoCmd. RunSQL hacen lo mismo, pero yo prefiero usar la primera simplemente porque no lanza los mensajes de advertencia de ejecutar consultas de acción y así no me obliga a escribir código para desactivar los avisos y volverlos a activar.

3º/ El error 3061 no te puedo decir de dónde viene sin analizar el archivo.

4º/ El error 307 te indica que uno de los campos que usas (o bien Id o bien IdMedicamento) no se encuentran en el recordset, o al menos no con ese nombre.

Id e IdMedicamento en principio yo entiendo que son numéricos (un ID único siempre debería ser autonumérico). Pero si son de texto, la linea sería:

RstTabla.FindFirst "Id ='" & RstConsulta("IdMedicamento") & "'"

Muchas gracias, como metí el recordset lo hice con eso, ya sabes por el apuro, luego intentaré con la otra opción.

Miles y miles de gracias!!!

No hay de qué. A ver si te sale, y cualquier cosa, por aquí andaré o en el foro http://nksvaccessolutions.com/Foro/

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas