SOLVED

Establecer valor por defecto Combo Box desde una SQL query

Brass Contributor

Hola a todos!

 

Me estoy realizando una BBDD y tengo un problema con un formulario. En uno de los ComboBox que utilizo, me gustaría poner como valor por defecto el resultado de una query SQL, el problema es que no me funciona dado que no lo detecta como función.

 

Hay alguna otra función que permita esto? es posible hacerlo mediante VBA?

 

Gracias de antemano a todos!

16 Replies

¡Hola!

 

DLookUp("ColumnaDeConsulta"; "NombreDeConsulta")

 

Servus
Karl
************
Access News (March edition)
Access DevCon (April 28+29)

Muchas gracias @Karl Donaubauer, pero, me gustaría mediante VBA realizar una consulta SQL (Select) que devuelve solamente un valor y que este valor sea el valor por defecto de un Cuadro combinado.

 

Ya he localizado la forma de establecer un valor por defecto en un cuadro combinado mediante VBA, pero no se como realizar una consulta SELECT a una tabla de este mismo fichero Access, como se hace?

 

Gracias de antemano.

best response confirmed by markarel (Brass Contributor)
Solution

¡Hola!

 

Con un evento adecuado (abrir el formulario o algo así) puedes utilizar un código como éste:

 

Dim rs As DAO.Recordset
Dim strSQL As String

 

strSQL = "SELECT Campo1 " & _
    " FROM Tabla " & _
    " WHERE Id=42"

Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

 

If Not rs.BOF Then
    Forms!Formulario1!Combo1.DefaultValue = rs!Campo1
End If

 

Servus
Karl
************
Access News (March edition)
Access DevCon (April 28+29)

 

Hola @Karl Donaubauer 

 

Una vez mas, muchas gracias por tu respuesta, he tomado tu ejemplo como plantilla y he desarrollado lo siguiente, pero no funciona, no me da ningún error, pero la casilla sigue vacía.

 

markarel_0-1648121728830.png

 

Que puede ser?

 

¡Hola!

 

¿Has comprobado si tu texto SQL devuelve un valor? P.e. establece un punto de interrupción y comprueba el valor de Campo1 o antes del If Not...

 

Debug.Print rs!Campo1

o

MsgBox rs!Campo1

 

o después de asignar el valor por defecto:

 

Debug.Print Me!nombre_caja.DefaultValue

 

para verlo en la ventana directa.

 

Servus
Karl
************
Access News (March edition)
Access DevCon (April 28+29)

 

@Karl Donaubauer 

 

Hola, he establecido varios puntos de control pero ninguno devuelve nada, cuando abro el formulario no me aparece ningún Message Box ni ningún print en pantalla.

He probado a poner directamente un nombre se usuario y quitar la función fncUsurio pero sigue sin devolver nada. Que puede ser?

 

 

markarel_0-1648123592429.png

 

markarel_1-1648123792292.png

 

 

¡Hola!

 

Parece que tu Sub usario_defecto no se ejecuta. ¿Dónde y cómo se llama? En mi primera respuesta de hoy, mencioné que necesitas un evento adecuado que active el código.

 

Servus
Karl
************
Access News (March edition)
Access DevCon (April 28+29)

Hola @Karl Donaubauer,

 

Soy nuevo programando en VBA, tengo el código aquí, por lo que entiendo se ejecuta cuando se abre el formulario, no?

 

markarel_0-1648129664981.png

 

Gracias!

 

¡Hola!

 

No, si quieres que el código se ejecute al abrir el formulario, entonces ve a las propiedades del formulario y busca la propiedad "Al abrir" (al menos creo que así se llama en el Access español). Haz clic ahí y luego en el botón del editor (con los 3 puntos) que está a la derecha.

 

A continuación, se crea un procedimiento Form_Open (https://docs.microsoft.com/es-es/office/vba/api/access.form.open), en el que copias tu código para que sea llamado cuando se abra el formulario.

 

Otro método es que no copies el código en el nuevo procedimiento Form_Open, sino que en el procedimiento Form_Open llames a tu procedimiento existente. Esto puede hacerse simplemente con su nombre:

 

usario_defecto

 

Sin embargo, esto sólo tiene sentido si llamas al procedimiento en varios puntos.

 

Servus
Karl
************
Access News (March edition)
Access DevCon (April 28+29)

@Karl Donaubauer 

 

Oh, ¡muchas gracias!

 

Ahora si que ejecuta la función, pero, da un error.

 

markarel_0-1648131733932.png

 

 

Muchas gracias por la ayuda que me esta brindando, me esta siendo de mucha ayuda aprendiendo VBA ;)

 

¡Hola!

 

Falta la referencia a la biblioteca DAO. En el editor VBA, selecciona la opción de menú Herramientas - Referencias (si es que se llama así en el Access español ;) y busca allí en la lista:

 

Microsoft Office x.0 Access Database Engine Object Library

 

Donde x depende de tu versión de Access. En las versiones más recientes x=16. Marca esta casilla y el código DAO debería funcionar.

 

Servus
Karl
Access News (new March episode)
Access DevCon (April 28+29)

@Karl Donaubauer 

 

Hola, muchas gracias una vez mas, siento hacer tantas preguntas, pero es que no termina de funcionar correctamente, pero parece que poco a poco vamos avanzando.

 

Una vez mas, no se que falla exactamente...:

 

markarel_0-1648133773684.png

 

¡Hola!

 

No es de extrañar que no haya nombres de campo. Vuelve a mirar mi ejemplo en el que había utilizado "Campo1" para ello. Contigo debería decirse:

 

rs!nombre


Servus
Karl
Access News (new March episode)
Access DevCon (April 28+29)

@Karl Donaubauer 

 

Hola Karl, muchas gracias por la ayuda, ahora parece que falla otra instrucción:

 

markarel_0-1648140517424.png

markarel_1-1648140541636.png

 

Muchísimas gracias.

 

¡Hola!

 

Tu fncUsuario devuelve un texto. Por eso faltan las comillas:

 

strSQL = "SELECT nombre FROM fichaje WHERE usuario_registrado = '" & fncUsuario & "'"


Servus
Karl
Access News (new March episode)
Access DevCon (April 28+29)

Muchísimas gracias @Karl Donaubauer, ya funciona todo a la perfección. Mil gracias!!!!! :)

1 best response

Accepted Solutions
best response confirmed by markarel (Brass Contributor)
Solution

¡Hola!

 

Con un evento adecuado (abrir el formulario o algo así) puedes utilizar un código como éste:

 

Dim rs As DAO.Recordset
Dim strSQL As String

 

strSQL = "SELECT Campo1 " & _
    " FROM Tabla " & _
    " WHERE Id=42"

Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)

 

If Not rs.BOF Then
    Forms!Formulario1!Combo1.DefaultValue = rs!Campo1
End If

 

Servus
Karl
************
Access News (March edition)
Access DevCon (April 28+29)

 

View solution in original post