No actualiza todos los campos del subformulario

Tengo un problemilla con un código que no se donde esta el fallo, yo tengo un formulario y un subformulario, y quiero que me asigne el valor del cuadrofactu que esta en el formulario principal a todos los registros del subformulario.

Cuando pongo este código me dice fallo 3020 en tiempo de ejecución, update o cancelupdate sin addnew o edit, y solo me cambia el valor del primer campo.

Puse un msgbox para ver si recorre todos los registros del subformulario y si lo hace pero no me cambia los valores y me muestra el fallo de arriba.

Necesitaría vuestra ayuda, gracias de antemano.

Private Sub Form_Current()
Me.cuadrofactu.Requery
Me.cuadrofactu = cuadrofactu.ItemData(0)
With Me.SubFactu.Form.RecordsetClone
.MoveFirst
Do Until .EOF
  .Edit
   Forms![agenciasfactu1]![SubFactu]!NFactura = Me.cuadrofactu
  .MoveNext
  .Update
  Loop
End With
End Sub

1 Respuesta

Respuesta
3

Normal que no te actualice: si trabajas con una copia del recordset (el recordsetclone) no lo estás haciendo con los datos que quieres actualizar (el recordset origen de tu subformulario, que será una tabla de tu BD).

Es como si tienes un word, lo copias a un pen, sobre esa copia haces modificaciones, y al guardarla en el pen, ves que el original de tu PC no se modificó (como es lógico...)

Una forma más sencilla sería recurrir a una SQL de actualización, algo así:

CurrentDb.Execute "UPDATE NombreTabla SET NFactura =" & Me.cuadrofactu.ItemData(0)

Me.SubFactu.Form.Requery

Cambia lo que está en negrita por el nombre de la tabla/consulta que recoge los datos del subformulario.

Un saludo.


http://nksvaccessolutions.com/academy/ 

Muy buenas estoy dándole vueltas a lo que me dices y tengo unas dudas, la primera de ellas sería si hago lo de la consulta normal tendría que filtrar los datos que quiero actualizar con lo que tendría que generar variables para recoger datos del subformulario o del formulario principal no es así?

Pero la duda mas grande me surge de lo siguiente, entiendo lo que dices de la copia eso esta claro pero si fuese así no me actualizaría ningún registro y ahora me actualiza el registro del subformulario pero solo uno.

No se si estoy cegado de las vueltas que le estoy dando y la solución es mucho mas fácil , pero ahora la verdad es que estoy negado con el tema.

Ya esta resuelto,  quite el .update y con eso se me actualizan todos los campos.

Muchas gracias por tu ayuda.

Sí, claro que tendrías que filtrar los datos de la tabla si la SQL la haces sobre la tabla directamente. Si el origen de tu subformulario es una consulta ya filtrada, no te haría falta ponerle filtros a la SQL.

Sería así, en el caso de tener que filtrar:

CurrentDb.Execute "UPDATE NombreTabla SET NFactura =" & Me.cuadrofactu.ItemData(0) & " WHERE CampoTabla=" & Me.CampoFormulario.

Lo de que te actualice solo un registro del subformulario tiene fácil explicación (y antes no me dí cuenta): fíjate que en tu código realmente no actualizas el recordset, pues usas la linea Forms![agenciasfactu1]![SubFactu]!NFactura = Me.cuadrofactu, que actualiza el registro actual del subformulario, cuando lo correcto sería haber usadosimplemente: !NFactura = Me.cuadrofactu.

Prueba, de todos modos si este código te funciona, aún trabajando con el clon del recordset:

Private Sub Form_Current()

Dimrst AS DAO.Recordset
Me.cuadrofactu.Requery
Me.cuadrofactu = cuadrofactu.ItemData(0)
Set rst= Me.SubFactu.Form.RecordsetClone
rst.MoveFirst
Do Until rst.EOF
  rst.Edit
   rst("NFactura") = Me.cuadrofactu
  rst.MoveNext
  rst.Update
  Loop
End Sub

Eres un crack, no me dio tiempo para probar lo que dices ya que tenia trabajo atrasado pero conforme pueda lo pruebo y te digo y muchas gracias enserio.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas