Modificar un campo de tabla donde de acuerdo al numero de cuadro combinado(asignado) sea el numero de registro a modificar.

Tengo una bd. En Access, tengo una tabla habitaciones con un campo texto llamado Estado (3 posibles estados para cada una libre, por asignar, sin autorizar). Las cuales se dan de alta con la habitación (libre por default). Tengo un formulario con un botónes de comando que simulan graficamente cada numero de habitación de un hotel. Cada Habitación necesito que tenga un cuadro combinado que muestre los 3 posibles estados dados de alta en otra tabla llamada estados adjunto imagen de ejemplo.

Lo que necesito es que al modificar el cuadro combinado de la habitación 1 se actualice el campo estado de la tabla habitaciones donde el numero de habitación sea el 1. Al seleccionar/modificar el estado del cuadro combinado de la habitación 2 se actualice automáticamente el campo estado de la tabla habitaciones habitación 2 y así sucesivamente. Espero darme a entender y Me ayuden con esta solicitud.

2 respuestas

Respuesta
2

Si bien lo que te dice Antonio es muy correcto, me permitiría añadir que todo depende de como tengas hecha la tabla. Me explico, si sólo tienes una tabla con las habitaciones y estado y quisieras hacer un "histórico" de habitaciones ocupadas en un plazo de tiempo, o en un mes, porcentajes de ocupación en 1 mes, etc, no podrías. Por otro lado, el campo Estado como tal te sobra. Puedes poner el campo Habitación1 como combinado y en Tipo Origen de la fila poner Lista de valores y en Origen de la fila poner simplemente los tres valores que pueden tener, y así, al depender el formulario de la tabla Habitaciones no necesitarías actualizar nada. En cuanto lo cambiaras en el combinado, automáticamente te cambia el valor en la tabla. Por ejemplo, supongamos que tengo la tabla Habitaciones

Y el formulario

Si ahora elijo Sin Autorizar

En la tabla

Pero como te decía, sólo con esa construcción no podrías saber que el día x del mes Y, la habitación Z estaba Por asignar

Respuesta
1

Tienes que hacer un update.

En el evento después de actualizar de tu cuadro combinado.

Por ejemplo:

Private Sub combo_AfterUpdate()
    CurrentDb.Execute "UPDATE miTabla SET MiCampo = " & Me.combo & " WHERE miHabitacion = 1", dbFailOnError
End Sub

Excelente Antonio ya funciono muchas gracias maestro de maestros!!.sino es mucha molestia podrás ahora ayudarme para que cuando abra el formulario en el cuadro combinado se carguen los valores "Estado" que se quedaron guardados por cada habitación?  saludos

Lo puedes recuperar de 2 maneras.

1. Con un recordset.

En el evento al abrir de tu formulario llamas una función que recupere los datos de tu tabla por ejemplo:

Private Sub Form_Open(Cancel As Integer)
 call recuperaDatos()
End Sub
Private Sub recuperaDatos()
Dim miRs As DAO.Recordset
Dim Consulta As String
On Error GoTo ManipulaError
  Consulta = "SELECT * FROM miTabla"
  Set miRs = CurrentDb.OpenRecordset(Consulta, dbOpenForwardOnly)
     With miRs
         Me.combo1 = !Campo1  <--- nombre de los campos  de tu tabla
         Me.combo2 = !Campo2
         ...
         ..
     End With
     miRs.Close: Set miRs = Nothing
Salir:
    Exit Sub
ManipulaError:
    If Not miRs Is Nothing Then miRs.Close: Set miRs = Nothing
    MsgBox Err.Description, vbCritical, "Atencion"
    Resume Salir
End Sub

2. Lo puedes hacer como te plantea Icue Gonzalez en la respuesta de abajo.

En lo personal a mi me gusta más el código, ya que el código es más manipulable y tu base de datos es más eficaz.

Te adjunto mi canal de YouTube en el subo ejercicios de Access desarrollados mediante código. Los ejercicios lo puedes descargar, el link se encuentra en la descripción de cada vídeo.

Gracias Antonio pero no me carga ningún dato el código que me hiciste favor de proporcionarme, Como controlas que para que en el combo1 te muestre el valor del campo estado de la habitacion1?recorra la tabla y que para el combo 2 busque la habitación 2 y muestre el valor estado de la tabla habitaciones y asi sucesivamente. O será  que en el select que me pasas se agregue un where nohabitacion =1 y el código se agregue a cada combo? agradezco mucho tu respuesta 

Por favor es lo ultimo que te pido así quedo el código

En todos los combos asocio el dato estado porque es el dato que quiero mostrar es correcto?

Muéstrame una captura de tu tabla.

El código esta basado en este ejercicio.

https://www.youtube.com/watch?v=VG0Km9qBwVQ&t=15s 

esta relacionada como se muestra en las primeras preguntas

Entiendo tienes que ir recorriendo tu recordset

La idea es la siguiente

Private Sub Form_Open(Cancel As Integer)
 call recuperaDatos()
End Sub
Private Sub recuperaDatos()
Dim miRs As DAO.Recordset
Dim Consulta As String, i As integer
On Error GoTo ManipulaError
  i = 1
  Consulta = "SELECT estado FROM habitaciones"
  Set miRs = CurrentDb.OpenRecordset(Consulta, dbOpenForwardOnly)
     With miRs
         While Not .EOF
           Me.combo & i = !estado  
          .MoveNext
          i = i + 1
         Wend
     End With
     miRs.Close: Set miRs = Nothing
Salir:
    Exit Sub
ManipulaError:
    If Not miRs Is Nothing Then miRs.Close: Set miRs = Nothing
    MsgBox Err.Description, vbCritical, "Atencion"
    Resume Salir
End Sub

Ojo aqui la idea seria cambiar el nombre tus combo box

A combo1, combo2, etc.. <---- esto correcpondera al numero de habitacion

Para ir recorriendo cada 1 y pasarle su información

Pues revisando tu video y haciendo cambios  y jugando con los datos así es como me funciono sabes si hay problemas si ocupo un recordset  para cada consulta? con eso me posiciono en el registro que quiero y muestro el valor en el combo que necesito checale:

Private Sub Form_Open(Cancel As Integer)

Dim miRs0 As DAO.Recordset

Dim miRs As DAO.Recordset

Dim consulta0 As String

Dim Consulta As String

 On Error GoTo ManipulaError

consulta0 = "SELECT * FROM habitaciones where nohabitacion = 1"

Consulta = "SELECT * FROM habitaciones where nohabitacion = 2"

 Set miRs0 = CurrentDb.OpenRecordset(consulta0, dbOpenForwardOnly)

Set miRs = CurrentDb.OpenRecordset(Consulta, dbOpenForwardOnly)

    With miRs0

     Forms![principal2]![Cuadro_combinado18] = !estado

   End With

      With miRs

     Forms![principal2]![Cuadro_combinado5] = !estado

   End With

    miRs0.Close: Set miRs0 = Nothing

   miRs.Close: Set miRs = Nothing

  Salir:

   Exit Sub

  ManipulaError:

If Not miRs0 Is Nothing Then miRs0.Close: Set miRs0 = Nothing

MsgBox Err.Description, vbCritical, "Atencion"

If Not miRs Is Nothing Then miRs.Close: Set miRs = Nothing

MsgBox Err.Description, vbCritical, "Atencion"

Resume Salir

End Sub

NO hay problema si ocupas un recordset para cada habiatacion.

El detalle es que entre mas proceso mas lento.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas