Actualizar datos de un determinado campo

Con un formulario con una serie de campos, voy creando una serie de filtros, y en el subformulario me aparecen los resultados de los filtros aplicados. El Subformulario esta creado por medio de una consulta que contienen datos de dos tablas.

Entre ellos está un campo para indicar si se ha remitido un email a ese registro, y también lleva un campo para incluir la feche del envío.

Mi problema es que con la siguiente sentencia, si que me actualiza el valor del campo fecha, pero me crea un nuevo registro, y la idea es que lo cree en los registros del filtro.

'Dim enviar As String
'Dim sqlInsertar As String

'enviar = "SI"

'sqlInsertar = "INSERT INTO protocolo (enviado)" & "values ('" & enviar & "')"
'DoCmd.RunSQL sqlInsertar

El valor del filtro está guardado en la variable Me. CtlConsulta, pero no se como hacer para que lo haga a los registros de ese filtro creado.

3 respuestas

Respuesta
1

Jesús, si no he entendido mal, lo que quieres es que actualice un(os) campo(s). Si ese es el caso deberías usar la instrucción Update. Por ejemplo

Docmd.runsql"update protocolo set enviado='" & me.enviar & "' where...."

Le pongo lo de where porque si no te actualizaría todos. Por ejemplo

Docmd.runsql"update protocolo set enviado='" & me.enviar & "' where pais=""España"" and ...."

Lo mismos filtros que utilizas.

Respuesta
1

He utilizado esta sentencia:

enviar="SI"

UPDATE Protocolo SET enviado=enviar   where ID = '" & Form_SubfInvitados!ID & "'"

Solo he probado actualizar un campo "enviado".

No es correcta la variable no puede evaluarse si esta 'dentro' de la SQL y (sinceramente) me parece un desperdicio utilizar una variable como una constante.

Por otra parte, el ID (si esta en el subformulario invitados) la ruta absoluta a la referencia seria algo como:

Forms.[nombre del principal].[SubfInvitados].FORM.[ID]

La referencia relativa (si se ejecuta desde el principal) seria asi:
Me.[SubfInvitados].FORM.[ID]

Finalmente si se ejecuta desde el propio subformulario basta con la referencia:
Me.[ID]

Propongo esta opción:

CurrentDb.Execute "Update Protocolo SET enviado= 'SI' Where ID ='" & aqui la referencia & "'"

Si el ID es un numero:

CurrentDb.Execute "Update Protocolo SET enviado= 'SI' where ID =" & aqui la referencia

Lo importante es que la referencia de como resultado un registro concreto (o todos aquellos que tengan el mismo ID) en la tabla 'Protocolo'.

Respuesta
1

Otra alternativa es clonar el subformulario e incluir este código

Private Sub btnActualiza_Click()
  On Error GoTo hay_error
  Dim miRS As Recordset
  Dim lnCuenta As Integer
  Set miRS = Me.RecordsetClone
  'Nota: si el botón de actualizar esta en el formulario principal
  ' Comente la instrucción anterior y cámbiela por:
  '
  ' Set miRS=ME.nombresubformulario.Form.RecordsetClone
  '
   MiRS. MoveLast
   MiRS. MoveFirst
  Do Until miRS.EOF
    If miRS!enviar = "SI" Then
       miRS.Edit
       miRS!Fecha = Date
       miRS.Update
       lnCuenta = lnCuenta + 1
      End If
    End If
    miRS.MoveNext
  Loop
   Me.Requery
 If Err.Number = 0 Then
    MsgBox "Se actualizaron " & lnCuenta & " registros satisfactorialmente", vbInformation, "Actualizando registros"
 End If
hay_error_exit:
   Exit Sub
hay_error:
     MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
     Resume hay_error_exit
     

No obstante, es más practico con la sentencia UPDATE y la cláusula WHERE.

Corrijo sobre un IF

Private Sub btnActualiza_Click()
  On Error GoTo hay_error
  Dim miRS As Recordset
  Dim lnCuenta As Integer
  Set miRS = Me.RecordsetClone
  'Nota: si el botón de actualizar esta en el formulario principal
 ' comente la instrucción anterior y cámbiela por:
  '
  ' Set miRS=ME.nombresubformulario.Form.RecordsetClone
  '
   MiRS. MoveLast
   MiRS. MoveFirst
  Do Until miRS.EOF
    If miRS!enviar = "SI" Then
       miRS.Edit
       miRS!Fecha = Date
       miRS.Update
       lnCuenta = lnCuenta + 1
    End If
      miRS.MoveNext
  Loop
   Me.Requery
 If Err.Number = 0 Then
    MsgBox "Se actualizaron " & lnCuenta & " registros satisfactorialmente", vbInformation, "Actualizando registros"
 End If
hay_error_exit:
   Exit Sub
hay_error:
     MsgBox "Ocurrió el error " & Err.Number & vbCrLf & Err.Description, vbCritical, "Error..."
     Resume hay_error_exit
End Sub

Pruebo el código ahora mismo, y te comento.

Muchas gracias.

Perdón y muchas gracias a los dos.

Creo que no me explicado bien, y mi VBA es muy básico.

El subformulario contiene el campo que quiero actualizar, pero al ser una consulta en la que hay dos tablas implicadas, no puedo hacer directamente hay la actualización.

Una de las tablas es la principal, de clientes, y la otra es la que contiene los campos enviado y fecha, que son los que quiero actualizar cuando les he remitido un mensaje.

Si que están relacionadas las tablas por un campo, y cuando he realizado el filtro solo aparecen algunos, que son los que les envío el mensaje, que serían los que debo actualizar.

He utilizado esta sentencia:

enviar="SI"

UPDATE Protocolo SET enviado=enviar   where ID = '" & Form_SubfInvitados!ID & "'"

Solo he probado actualizar un campo "enviado".

No lo hace.

El campo esta en el Subformulario SubfInvitados, y el campo relacionado es el ID.

Eduardo, lo intento como comenta Julián con lo que he puesto.

Suerte y logré su objetivo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas