VBA Excel con Access evitar registros duplicados llave de dos campos

Tengo 2 formularios que he empezado a programar con ayuda de este sitio, pero definitivamente este es el más complejo, por que necesita validaciones que no sé hacer

1.- Agenda visitas por ejemplo indica que hace una visita a cierta instalación entre hoy y elijo hora de inicio en un textbox y la hora de termino en otro textbox,

Mi problema es que debo impedir que se ingrese una nueva visita a la misma instalación, ya que ahora lo permite:

Visita 1 a Bodega fecha 18/02/2019 inicio 8:00 am termino a las 1:00 PM

Visita 2 Bodega fecha 18/02/2019 inicio 11:00 am termino a las 1:00 PM

No puedo bloquear por llave de Fecha y bodega, porque eventualmente podría ir en AM y PM en mismo día.

Las visitas se graban en una tabla de access, el access le agrega un ID de visita al insertar los datos.

¿Cómo podría hacer esta validación en el código de vba?

2.- El otro de gestión graba lo que hice, entonces me carga una lista de personas desde un excel al listbox de mi formulario, yo las escojo y les agregó una dato, ese dato me lleva toda la linea del listbox a un access, pero me permite agregar múltiples registros a la misma persona, los campos que me harían una llave, son código de persona y código de calendario. ¿Cómo podría hacer esta validación en el código de vba?

2 Respuestas

Respuesta
2

No sé si te servirá, porque en Access es muy sencillo. Si tengo el formulario

Cuando escribo 11:00 y pulso enter

El código del evento Antes de actualizar del cuadro de texto HoraInicio es

Private Sub HoraInicio_BeforeUpdate(Cancel As Integer)
If Fecha = DLast("fecha", "visitas") And HoraInicio >= DLast("horainicio", "visitas") And HoraInicio <= DLast("horafin", "visitas") Then
MsgBox " Va ser que no, no ves que la están visitando", vbOKOnly + vbCritical, "Va a haber saturación"
End If
End Sub

Voy a probarlo, y ver cómo es posible adaptarlo pues los usuarios no usan access, por eso el Userform en Excel,  pero tu código tiene una lógica bien útil.

Ahora que no está Dante, pero sí esta Elsa (saludos y perdóname lo que voy a decir)te diría que Excel es una herramienta magnífica pero fué concebida como una hoja de cálculo( la copiaron de una manera descarada de Lotus 1-2-3) y personalmente pienso que cada cosa es para lo que es. Access(que lo copiaron de manera descarada del DBase III) es un gran gestor de base de datos.

Por cierto Word es una copia descarada de Word Perfect.

Respuesta
1

[Hola

Se me ocurre concatenar los dos campos de Access en tu cadena SQL obteniendo un solo valor, luego concatenar tus dos TextBox de Excel y comparar el valor obtenido del SQL con el de Excel; obvio habría que recorrer todo el recordset:

SQL = "Select Campo1+Campo2 As Camponuevo From Tabla"

Valor = TextBox1  & TextBox2

Y luego

Rst.moveFirst
Do

If Valor = rst.Fields!CAmpoNuevo Then

'aquí lo que corresponda

End IF

rst.MoveNext
Loop Until rst.EOF

Eso se me ocurre.

Abraham Valencia

PD: Lo he hecho de memoria, debería resultar pero afinando de ser necesario

Abraham gracias, pero en mi desconocimiento donde lo hago?

Los campos son en la base de datos Id_Calendario & RUT_Ejecutivo y en el formulario TB_NumeroID.Value & Me.ListBox1.List(Me.ListBox1.ListIndex, 0)

tengo dos código, uno que hace la conexión

Sub cargaPlanificacion()
    Set cnn = New ADODB.Connection
    With cnn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "data source= \\database.accdb"
    .Open
    End With
    Set rst = New ADODB.Recordset
    Sql = "select * from Visitas"
    With rst
        .CursorLocation = adUseClient
        .CursorType = adOpenKeyset
        .LockType = adLockOptimistic
        .Open Sql, cnn, , , adCmdText
    End With
End Sub

otro que agrega los registros

Private Sub CBAgregarPlanificacion_Click()
        cargaPlanificacion
        rst.AddNew
        rst.Fields!Id_Calendario = TB_NumeroID.Value
        rst.Fields!RUT_Ejecutivo = Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
        rst.Update
        MsgBox "Datos ingresados exitosamente", vbInformation, "Felicitaciones"
   Me.TBRUTEjecutivo = ""
   Me.CbMinutosPlanificados = ""
     Range("A11").Select
End Sub

En "cargaPlanificacion" cambia la línea respectiva así:

Sql = "select Id_Calendario+RUT_Ejecutivo As CampoNuevo From Visitas"

Y en el botón:

Private Sub CBAgregarPlanificacion_Click()
       cargaPlanificacion
Valor = TB_NumeroID.Value  & Me.ListBox1.List(Me.ListBox1.ListIndex, 0)
Rst.moveFirst
Do
If Valor = rst.Fields!CampoNuevo Then
    Msgbox "Valor repetido"
    Exit sub
End IF
rst.MoveNext
Loop Until rst.EOF

Abraham Valencia

Gracias! Con el campo RUT que es número almacenado como texto en el access (así siempre se le ha tratado en el las bases) no hubo caso, así que me cambios a ID calendario y nombre, No existen dos personas que el mimo nombre (nombres y ambos apellidos) en cada Id calendario, así que cumple el objetivo.

[Hola nuevamente

Como no conozco ni has mostrado tu tipo de datos, obviamente te propuse la que se veías (desde este lado de la pantalla) como la alternativa viable, pero en todo caso lo bueno es que pudiste adaptar el ejemplo a tu necesidad.

Hasta la próxima

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas