Mensaje de aviso en formulario condicionado a datos de una tabla

Soy relativamente nueva en access y al intentar mejorar un formulario para que me avise cuando se escoge un dato determinado me he quedado bloqueada.

Tengo una tabla para sustancias 'tblSUST', con varios campos, dos de ellos son 'SUST' (tipo texto) y 'CAND' (tipo Sí/No).

Por otro lado tengo un formulario de productos 'frmPROD' con origen en la tabla 'tblPROD', pero con un cuadro combinado 'cboSUSTenPROD' en el que se pueden escoger uno o varios de los registros de la tabla 'tblSUST' (una o varias sustancias por producto) a través de una consulta:

SELECT qrySUST.SUST, qrySUST.CAND

FROM qrySUST

WHERE (((qrySUST.CodTP)=[Form]![CodTP].[value]))

ORDER BY qrySUST.SUST;

Hasta aquí va todo perfecto.

Lo que me gustaría es que si alguna de esas sustancias que se van a escoger en el formulario tienen el campo 'CAND' como “Sí” o True, aparezca un mensaje de aviso: “La sustancia xxx es candidata”. Y al ser posible que se indentifique en el mensaje el nombre de la(s) sustancia(s) que ha(n) provocado el mensaje de aviso.

2 Respuestas

Respuesta
2

Luisa: En mi opinión el mejor evento para sondearlo es el GotFocus del propio Combo, ya que se te adelantará y podrás elegir alguna de de las sustancias sugeridas.

Private Sub CboSUSTenPROD_GotFocus()
Dim Rst As DAO.Recordset
Dim CadenaCand As String
CadenaCand = ""
Set Rst = CurrentDb.OpenRecordset(Me.CboSUSTenPROD.RowSource, dbOpenSnapshot)
Rst.MoveLast
Rst.MoveFirst
Do While Not Rst.EOF
        If Rst!CAND = -1 Then
                CadenaCand = CadenaCand & Rst!SUST & " ; "
        End If
        Rst.MoveNext
Loop
'Le quito a la cadena final los 3 espacios sobrantes
CadenaCand = Left(CadenaCand, Len(CadenaCand) - 3)
MsgBox "En las Sustancias de éste Combo hay la(s) siguiente(s) Candidata(s):  " & CadenaCand
End Sub

En el Mensaje te saldrán las sustancias Candidatas, dentro de todas las que haya en el Combo.

Mis saludos >> Jacinto

Hola Jacinto,

Muchas gracias por tu respuesta.

He hecho lo que me has dicho, pero cuando pongo el cursor en el control de las sustancias en el formulario me salta un error de Visual Basic "Se ha producido el error '3061' en tiempo de ejecución: Pocos parámetros. Se esperaba 1."

Y cuando hago clik en depurar me resalta la fila:

Set Rst = CurrentDb.OpenRecordset(Me.cboSUSTenPROD.RowSource, dbOpenSnapshot)

No tengo ni idea de cómo arreglarlo, ¿sabes por qué puede ser?

Saludos

Luisa: Es posible que cuando pones el cursor en el Combo, el CodTP no tenga aún valor, por alguna razón. Asegura de que lo tenga, e introduce una línea de código inmediatamente después de

Private Sub CboSUSTenPROD_GotFocus()

Me. CboSUSTenPROD. Requery

No obstante lo anterior, y dado que tengo delante la respuesta de Sveinbjorn, yo no descartaría el aplicarla. Si aún sigues con dificultades me comentas. Normalmente no pruebo el código que envío, pero en ésta ocasión lo hice y funcionó adecuadamente. Mis saludos >> Jacinto

Respuesta
3

Una sugerencia: si solo quieres elegir las sustancias candidatas (según entiendo yo) ¿Por qué no mostrar únicamente las que son candidatas para ese producto? Simplemente tendrías que añadirle una condición más a tu consulta origen de datos del cuadro combinado:

SELECT qrySUST.SUST, qrySUST.CAND

FROM qrySUST

WHERE (((qrySUST.CodTP)=[Form]![CodTP].[value])) AND qrySUST.CAND=-1

ORDER BY qrySUST.SUST;

Y para que se te actualice en cada registro, en el evento "Al entrar" o "Al recibir el enfoque" del cuadro combinado le pones el siguiente código: Me. CboSUSTenPROD. Requery

Para hacer lo que pides (el mensaje), sería una cosa así, suponiendo que tu cuadro combinado sea multivalor, como se desprende del enunciado:

En el evento "Después de actualizar" o "al perder el enfoque" o "al salir" de tu cuadro combinado, le pones este código (que tendrás que adaptar a los nombres que tu tengas):

Private Sub cboSUSTenPROD()
Dim miSQL As String
Dim rst As DAO.Recordset
Dim rstSust As DAO.Recordset2
Dim listaSust() As String
Dim i As Integer
Dim mensaje As String
Dim cuenta As Integer
If Not IsNull(Me.cboSUSTenPROD) Then
    DoCmd.RunCommand acCmdSaveRecord
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM tblProductos WHERE TP=" & Me.TP)
    Set rstSust = rst("Sust").Value
    i = 1
    'Coges todos los valores seleccionados y los pasas a una matriz
    rstSust.MoveFirst
    Do Until rstSust.EOF
        ReDim Preserve listaSust(i)
        listaSust(i) = rstSust!Value
        i = i + 1
        rstSust.MoveNext
    Loop
    'Miras si cada sustancia es candidata o no
    For i = 1 To UBound(listaSust())
        'Si es candidata, las vas encadenando, separando con comas, y cuentas las que son candidatas
        If DLookup("CAND", "tblSUST", "SUST='" & listaSust(i) & "'") = True Then
            mensaje = mensaje & listaSust(i) & ","
            cuenta = cuenta + 1
        End If
    Next
    'Terminas de construir el mensaje, si hubo candidatas
    If Len(mensaje) > 0 Then
        If cuenta = 1 Then
            mensaje = "La sustancia " & Left(mensaje, Len(mensaje) - 1) & " es candidata"
        Else
            mensaje = "Las sustancias " & Left(mensaje, Len(mensaje) - 1) & " son candidatas"
        End If
        MsgBox mensaje
    End If
    rst.Close
    Set rst = Nothing
    Set rstSust = Nothing
End If
End Sub

Para que lo veas en acción, te adjunto un mini-ejemplo: http://www.filebig.net/files/ZuZsQ5RgUy 

Un saludo


¡Muchas gracias, Sveinbjorn! Me ha costado copiarlo en mi base, pero porque quise simplificar los nombres de los campos y tablas en la pregunta, y como al final todo era 'sust' casi me vuelvo loca al cambiarlos porque no controlo mucho VB. Pero al final lo he conseguido! Me ha ayudado mucho que me mandases el archivo. :)

Mil gracias,

Un saludo

Sveinbjorn,

tengo un problemilla. Me he dado cuenta de que las sustancias del mensaje no se actualizan adecuadamente.

Por ejemplo, si el primer producto que escojo con el TP '1' no tiene sustancias candidatas, no me aparece el mensaje en ninguno de los siguientes productos con el mismo TP. Y si tiene una sustancia candidata, esta es la que aparece en los siguientes mensajes para los productos con el mismo TP.

Probé con el código que me dijiste (Me. CboSUSTenPROD. Requery), pero nada.

Seguro que es una tontería, pero no sé dónde puede estar el fallo.

Te adjunto una copia del archivo para que veas dónde puedo haber metido la pata. http://www.filebig.net/files/LeUgCAzwQa

Gracias

Saludos

Ya vi el problema: hay un error con los nombres de los campos a usar en la SQL que abre el recordset. En el ejemplo que te mandé, por simplificar y por desconocimiento de tus tablas, usé en la tabla productos el TP como clave principal y a su vez como indicador del tipo de producto en la taba sustancias.

En tu caso no es así, pues tienes un IdProducto y el campo TP, que se relaciona con otra tabla.

Para solucionarlo, cambia el campo del where en la linea Set rst=... por este:

Set rst = CurrentDb.OpenRecordset("SELECT * FROM tblPRODUCTOS WHERE IdProducto=" & Me.IdProducto)

Lo he comprobado y funciona. Ya me dirás si es lo que buscabas.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas