Access - Evitar duplicacion valores en relacion N a N

 
Vista:

Evitar duplicacion valores en relacion N a N

Publicado por Roberto (14 intervenciones) el 02/05/2006 14:27:16
Hola! Os agradecería que me echaseis una mano con esto... que me trae loco.

Por un lado tengo la tabla EMPRESAS, con el ID, nombre, etc.

Por otro lado tengo la tabla SERVICIOS, con un ID que consiste en 3 letras (ej. AAA) y el nombre del servicio.

Cada empresa puede prestar varios servicios, y cada servicio puede ser prestado por varias empresas. Por eso he creado la tabla PRESTACIÓN, mediante la cual relaciono EMPRESAS con SERVICIO. Además en esta tabla de relación también hay otro campo en el que indico si ese servicio tiene carácter PRINCIPAL o SECUNDARIO

Para entrar la información he diseñado un formulario de EMPRESAS, en el que he incrustado un subformulario de PRESTACION.

La cuestión es la siguiente (son 2):

1.- ¿Cómo puedo hacer para que a la hora de insertar los servicios para una determinada empresa el usuario no pueda entrar 2 veces el mismo SERVICIO? (Los servicios se muestran mediante un cuadro desplegable) -- (Supongo que sería comprobar si en la tabla de relación, para el ID de la empresa, ya existe una relación con el ID del servicio)-- pero es que no domino la programación. :-(

2.- Además, para cada servicio asignado a la empresa, debo especificar si éste es PRINCIPAL o SECUNDARIO, en ese mismo subformulario... y aquí la segunda pregunta se subdivide:

2.1.- sólo puede haber un ervicio PRINCIPAL!!! Cómo lo limito? (Supongo que es una adaptación de la respuesta anterior)

2.2.- cómo fuerzo a que haya 1 Principal necesariamente, no me vale que todos sean secundarios. (Que dé un mensaje de ERROR "NO hay servicio principal" si intento salir del subformulario)

Muchísimas gracias, espero haberme explicado bien. Si no, no dudéis en escribirme. GRACIAS!!!

Roberto
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Gestión de servicios y relaciones en formularios de empresas

Publicado por Alejandro (4142 intervenciones) el 18/07/2023 18:37:44
Solución para la pregunta 1:

Para evitar que el usuario pueda seleccionar dos veces el mismo servicio al insertarlos para una determinada empresa, puedes utilizar una validación en el evento "BeforeUpdate" del subformulario de PRESTACION. Aquí tienes un ejemplo de cómo puedes hacerlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim rs As Recordset
    Dim servicioID As String
 
    servicioID = Me.cboServicio.Value ' Obtener el ID del servicio seleccionado
 
    ' Verificar si el servicio ya está asociado a la empresa
    Set rs = Me.RecordsetClone
    rs.FindFirst "IDServicio = '" & servicioID & "'"
 
    If Not rs.NoMatch Then
        MsgBox "El servicio seleccionado ya está asociado a esta empresa.", vbExclamation, "Duplicación de servicio"
        Cancel = True ' Cancelar la actualización del registro
    End If
 
    rs.Close
    Set rs = Nothing
End Sub

Asegúrate de ajustar el nombre del control de cuadro desplegable (en este caso, "cboServicio") y los nombres de los campos y tablas según la estructura de tu base de datos.

Esta solución verifica si el servicio seleccionado ya está asociado a la empresa actual en la tabla de PRESTACIÓN. Si encuentra una coincidencia, muestra un mensaje de error y cancela la actualización del registro.

Solución para la pregunta 2:

2.1. Para limitar que solo haya un servicio principal, puedes agregar una validación adicional en el evento "BeforeUpdate" del subformulario de PRESTACION. Aquí tienes un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim rs As Recordset
 
    ' Verificar si ya hay un servicio principal asociado a la empresa
    Set rs = Me.RecordsetClone
    rs.FindFirst "Caracter = 'PRINCIPAL'"
 
    If Not rs.NoMatch Then
        MsgBox "Ya hay un servicio principal asignado a esta empresa.", vbExclamation, "Servicio principal duplicado"
        Cancel = True ' Cancelar la actualización del registro
    End If
 
    rs.Close
    Set rs = Nothing
End Sub

Esta solución verifica si ya existe un servicio principal en los registros de PRESTACIÓN asociados a la empresa actual. Si encuentra una coincidencia, muestra un mensaje de error y cancela la actualización del registro.

2.2. Para garantizar que haya al menos un servicio principal, puedes utilizar el evento "Form_BeforeUpdate" del formulario principal de EMPRESAS. Aquí tienes un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim rs As Recordset
 
    ' Verificar si al menos hay un servicio principal asignado a esta empresa
    Set rs = Me.SubformularioPrestacion.Form.RecordsetClone
    rs.FindFirst "Caracter = 'PRINCIPAL'"
 
    If rs.NoMatch Then
        MsgBox "Debe haber al menos un servicio principal asignado a esta empresa.", vbExclamation, "Servicio principal faltante"
        Cancel = True ' Cancelar la actualización del registro principal
    End If
 
    rs.Close
    Set rs = Nothing
End Sub

Asegúrate de ajustar el nombre del subformulario (en este caso, "SubformularioPrestacion") y los nombres de los campos y tablas según la estructura de tu base de datos.

Esta solución verifica si al menos hay un registro con el valor "PRINCIPAL" en el campo "Caracter" en el subformulario de PRESTACIÓN. Si no se encuentra un servicio principal, muestra un mensaje de error y cancela la actualización del registro principal de EMPRESAS.

Espero que estas soluciones te ayuden a resolver tus problemas de gestión de servicios y relaciones en tus formularios de empresas en Access. ¡Buena suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar