Formulario de acceso por usuario

Tengo una tabal T_TRABAJO con los campos Id, IdTrabajador e IdObra y en otra tabla T_FACTURAS que contiene un campo IdObra y me gustaría saber si es posible que desde un formulario F_ACCESO yo pudiese elegir de una lista desplegable un trabajador y que me abra un formulario F_FACTURAS y me muestre todas las facturas que tenga el IdObra que coincida con todas las obras que ese trabajador tiene en la tabla T_TRABAJO, es posible

2 Respuestas

Respuesta
1

Doy por supuesto que las tablas T_Trabajo y T_Facturas están relacionadas, quizás exista otra tabla (no mencionada) que tendrá la relación de trabajadores (en base a la existencia de un IdTrabajador).

El desplegable tendría la relación de trabajadores y dos campos, el ID del trabajador (normalmente oculto) y el nombre o datos del trabajador.

Una consulta con las tablas T_Trabajo + T_Facturas correctamente relacionadas (la relación debería aparecer por defecto si existe) sería el origen de datos del formulario F_Acceso.

Se seleccionan los campos que se desean visualizar y si se crea el desplegable (se asume que es un Combo Box) el propio asistente de Access permite relacionar el Combo (su columna ID) con el campo IdTrabajador del formulario.

De forma 'automática', al seleccionar un elemento del combo (mediante la relación antes creada) se aplica un filtro al formulario para que solo muestre los registros implicados en la relación.

Es sencillo:

.- Se crea el origen de datos (la consulta) y se le asigna al formulario
.- Se crea (con el asistente) el combo con los trabajadores y se les relaciona (el combo mejor en la sección encabezado del formulario).

No se precisa nada más, si acaso sumar datos o contar obras o ... el diseño que mejor satisfaga bien al usuario bien al programador.

¡Gracias! por su respuesta

Gracias Enrique por dedicarme tu tiempo, la cuestión es que tengo las siguientes tablas con sus relaciones

  y un  formulario F_Facturas con basado en la tabla T_Facturas y varios filtros,

me gustaría que en un formulario de inicio tenga un cuadro combinado donde al elegir a un trabajador me abra el formulario F_Facturas solo con las obras que tenga adjudicadas en la tabla T_Trabajo, pero respetando todos los filtros y campos del Formulario F_Facturas, gracias.

Perdona Enrique, el problema que encuentro es que en tu cita "Una consulta con las tablas T_Trabajo + T_Facturas correctamente relacionadas (la relación debería aparecer por defecto si existe) sería el origen de datos del formulario F_Acceso." al intervenir 2 tablas,se convierte en  una consulta de datos sin la posibilidad de modificar ningún dato del formulario

Pregunta:

Si no se le aplicase una condición a los datos que muestra el formulario facturas ¿se podrían hacer modificaciones en sus datos?

Si se utiliza el formulario de entrada para seleccionar un operario para obtener una lista con las obras en las que intervino y en base a esa lista filtrar la tabla facturas, la tabla facturas mostraría un subconjunto de sus datos con exactamente los mismos condicionantes que si no se le aplica el filtro.

Respuesta
1

Le complemento la idea que le dan con el siguiente ejemplo:

Tablas y relaciones

FORMULARIO F_UCCESO

EVENTO DESPUES DE ACTUALIZAR DEL CUADRO COMBINADO TRABAJADDOR

Private Sub cboTrabajador_AfterUpdate()
  DoCmd.OpenForm "F_FACTURAS", , , , , , Val(Me.cboTrabajador)
End Sub

FORMULARIO F_FACTURAS

EVENTO AL CARGAR DE ESTE FORMULARIO

Private Sub Form_Load()
 Dim strSQl As String
 Dim lnTrab As Long
 DoCmd.MoveSize , 2 * 1440, , 5.5 * 1440
 lnTrab = Me.OpenArgs
  strSQl = "SELECT T_TRABAJO.idTrabajador" & vbCrLf
  strSQl = strSQl & "           , T_TRABAJADORES.trabajador" & vbCrLf
  strSQl = strSQl & "           , T_FACTURAS.factura" & vbCrLf
  strSQl = strSQl & "           , T_OBRAS.obra" & vbCrLf
  strSQl = strSQl & "           , T_FACTURAS.valor" & vbCrLf
  strSQl = strSQl & "        FROM T_TRABAJADORES " & vbCrLf
  strSQl = strSQl & "  INNER JOIN ((T_OBRAS " & vbCrLf
  strSQl = strSQl & "  INNER JOIN T_FACTURAS " & vbCrLf
  strSQl = strSQl & "          ON T_OBRAS.idObra = T_FACTURAS.idObra) " & vbCrLf
  strSQl = strSQl & "  INNER JOIN T_TRABAJO " & vbCrLf
  strSQl = strSQl & "          ON T_OBRAS.idObra = T_TRABAJO.idObra) " & vbCrLf
  strSQl = strSQl & "          ON T_TRABAJADORES.idTrabajador" & vbCrLf
  strSQl = strSQl & "           = T_TRABAJO.idTrabajador" & vbCrLf
  strSQl = strSQl & "       WHERE T_TRABAJO.idTrabajador=" & Me.OpenArgs & ";"
  Me.RecordSource = strSQl
  If Me.RecordsetClone.RecordCount = 0 Then
     MsgBox "El trabajador no tiene obras", vbInformation, "Le cuento"
     DoCm

Si quiere el ejemplo lo puede solicitar a [email protected]. Favor en el asunto anotar la consulta.

Disculpe me faltó parte de código

Private Sub Form_Load()
 Dim strSQl As String
 Dim lnTrab As Long
 DoCmd.MoveSize , 2 * 1440, , 5.5 * 1440
 lnTrab = Me.OpenArgs
  strSQl = "SELECT T_TRABAJO.idTrabajador" & vbCrLf
  strSQl = strSQl & "           , T_TRABAJADORES.trabajador" & vbCrLf
  strSQl = strSQl & "           , T_FACTURAS.factura" & vbCrLf
  strSQl = strSQl & "           , T_OBRAS.obra" & vbCrLf
  strSQl = strSQl & "           , T_FACTURAS.valor" & vbCrLf
  strSQl = strSQl & "        FROM T_TRABAJADORES " & vbCrLf
  strSQl = strSQl & "  INNER JOIN ((T_OBRAS " & vbCrLf
  strSQl = strSQl & "  INNER JOIN T_FACTURAS " & vbCrLf
  strSQl = strSQl & "          ON T_OBRAS.idObra = T_FACTURAS.idObra) " & vbCrLf
  strSQl = strSQl & "  INNER JOIN T_TRABAJO " & vbCrLf
  strSQl = strSQl & "          ON T_OBRAS.idObra = T_TRABAJO.idObra) " & vbCrLf
  strSQl = strSQl & "          ON T_TRABAJADORES.idTrabajador" & vbCrLf
  strSQl = strSQl & "           = T_TRABAJO.idTrabajador" & vbCrLf
  strSQl = strSQl & "       WHERE T_TRABAJO.idTrabajador=" & Me.OpenArgs & ";"
  Me.RecordSource = strSQl
  If Me.RecordsetClone.RecordCount = 0 Then
     MsgBox "El trabajador no tiene obras", vbInformation, "Le cuento"
     DoCmd.Close acForm, Me.Name
  End If
End Sub

Eduardo, veo en el ejemplo que en el evento especifica los 3 campos de la tabla facturas, pero si yo tengo ya hecho el formulario F_Facturas con muchos más campos debo detallarlos en el evento

 strSQl = strSQl & "           , T_FACTURAS.factura" & vbCrLf
 strSQl = strSQl & "           , T_FACTURAS.valor" & vbCrLf

Si debe adicionarlos en seguida de las líneas que usted comenta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas