Dónde y Cómo utilizar la Función de Dominio DLookup

Te voy a enseñar como utilizar una de las funciones mas útiles de Access. DlookUp se llama función de dominio y es prima hermana de DSum y DCount, pero centrémonos en DlookUp. ¿Qué es, Para qué Sirve, como y donde la uso?.

Voy a intentar explicarlo:

¿Que es?

DlookUp es una Función predefinida de Access, como una fórmula a la que se le pasan ciertos datos y ella se encarga de hacer los cálculos necesarios y devolvernos el resultado ahorrándonos de esta manera un montón de pasos. Vale, te ha quedado muy Geek la explicación pero ¿Para que sirve esto?.

¿Para que sirve?

En un contexto sencillo sería como decirle “Búscame el campo X en la tabla Z que coincida con el criterio Y”, te sabe a poco ¿no?, Que tal con un ejemplo sencillo:

Tengo una tabla de artículos con tres campos “Codigo, Descripcion e Importe” y en alguna parte de nuestra base de datos queremos buscar el precio de un artículo concreto cuyo código es el 002568. ¿Ves, a que ahora es mas sencillo de entender? Pero aún queda por saber como y donde lo usamos, pues sigamos.

¿Como y Donde la uso?

El como, lo explicamos fácilmente, tomando el ejemplo anterior sería así: DlookUp (“Importe”, “T_Articulos”, “Codigo= 002568”) y ya está, la función es así de sencilla. Sobre como se debe de pasar el último dato del criterio a la función da para otro artículo mas extenso por tanto me lo reservo para un próximo post.

Vale, pero yo soy ateo, si no lo veo no me lo creo así que quiero verlo funcionar y ya que estamos me dices donde puedo usarla. Vale, pues como buena función de dominio que es, la podemos usar en varios apartados de nuestra base de datos como en un cuadro de texto calculado, una consulta, o con código VBA y como hoy estoy inspirado te voy a mostrar los tres ejemplos, así soy yo.

En un formulario

Antes de colocar nuestro campo calculado matizaremos un pequeño detalle que he obviado hasta este punto. La forma de llamar a la función es en Inglés “DlookUp”, sin embargo, esta forma solo se usa desde el editor de código VBA al igual que los separadores entre los datos “Parámetro” que le pasamos a la función van separados por comas “,” ahora bien, si utilizamos la función en un formulario, aunque la escribamos como te la he enseñado “DlookUp” el la convertirá automáticamente al español “Dbúsq” y las “,” deberás sustituirlas por “;” esto último a mano porque no lo hace en automático.

Pues a lo que iba, tenemos un formulario en blanco, en mi caso sin orígenes de datos con dos campos de texto, uno para poner el código y el otro para que lo calcule con nuestro DlookUp, aquí tienes la vista diseño del mismo

Nota del autor: Se puede observar que el último parámetro «Codigo= ‘» & [txtCodigo] & «‘» que actúa de filtro de la función utiliza para construirlo comillas simples y el símbolo & y no he explicado el motivo de ambos pero como la construcción de filtros da para una entrada nueva me la reservo para la misma que estoy redactando. En breve la tendréis disponible. Estad atentos.

Como ves el último dato “parámetro” del criterio lo que hace es leer lo que aparece en el primer cuadro de texto. Aunque el ejemplo es muy simple, si cambiamos el código del primer cuadro de texto no buscará automáticamente su importe, en este caso he añadido, a su evento “Después de actualizar”, la siguiente línea mediante VBA “Me.Recalc” para que vuelva a recalcular los cambios:

Curso-Access-Basico

En una consulta

Definir ahora mismo un ejemplo práctico en una consulta con la única tabla que tengo de ejemplo me parece complicado pues una consulta en si ya será capaz de realizar el cálculo que necesitamos sin mayor complicación, no obstante pondré el ejemplo, aunque hora mismo carezca de sentido y verás como tarde o temprano le encuentras utilidad.

He realizado una consulta con origen de datos la tabla “T_Articulos” y he añadido un campo calculado “Precio”, insisto en que este ejemplo carece de sentido, lo que importa es que veas que en una consulta también se pueden utilizar las funciones de dominio:

Esto daría, en mi caso, el siguiente resultado:

Pues ala, ya hemos terminado el tutorial.

Huy, tenías que haber visto la cara que se te acaba de quedar, veeeenga que no se ha acabado el tutorial sigo con el último ejemplo.

Por Código VBA

Voy a usar el formulario del primer ejemplo pero en vez de hacer el cálculo directamente en el cuadro de texto, mediante código VBA voy a recoger el código del artículo del primer cuadro de texto, a continuación voy a buscar su importe mediante DlookUp y por último lo voy a copiar en el segundo cuadro de texto de mi formulario.

Vamos allá:

En el evento “Después de actualizar” del  primer cuadro de texto, al que le he puesto de nombre “txtCodigo” pongo este código:

Private Sub txtCodigo_AfterUpdate()

' Primero creo una variable donde capturar el código
' del primer cuadro de texto.
Dim sCodigo As String
sCodigo = Me.txtCodigo

' Busco dicho código en la tabla T_Articulos
' y lo asigno directamente al segundo cuadro de texto
Me.txtImporte = DLookup("Importe", "T_Articulos", "Codigo='" & sCodigo &"'")

End Sub

Nótese que ahora, por código, se mantiene la sintaxis en Inglés (DlookUp) y se utiliza como separador de parámetros la «,».

Con esto y  un bizcocho, hasta mañana a las ocho.

10 comentarios

  1. Eso es falso ya que si al campo txt importe le pones que es igual a «DLookup(«importe…») y el campo txtimporte tiene un valor NULO te saldra un error diciendo que el campo txtprecio no es igual a dlookup(…) ya que seria igual a txtimporte=Nulo
    aparte access no acepta el caracter «;» sino el de «,»

    1. Obviamente si le das a buscar, en este caso, el importe de un artículo que está vacío, como no lo encuentra devolverá un error. Pero sobre la gestión de errores no he hablado en este post que pretende resumir el uso de la función. No obstante, tomo nota de tu comentario y lo dejo pendiente, bien para ampliar este artículo o bien hacer uno nuevo exclusivamente para la gestión de errores.

      Respecto al uso del carácter «,» o «;» supongo que te referías a la última línea de mi post donde cometí un error tipográfico ya corregido. Como había matizado en formularios, consultas e informes, se utiliza como separador el «;», sin embargo cuando escribimos las funciones en el editor de código VBA hay que utilizar la «,»

      Gracias por las correcciones.

  2. Muchas gracias por la explicacion, me ha ayudado a darme una idea practica para poder indicar si una factura esta duplica, porque tengo dos combos y no sabia como hacerle..

    saludos

  3. Hola
    Tengo el siguiente problema: Se ha producido el error ‘3464’ en tiempo de ejecución No coinciden los tipos de datos en la expresión de criterios.

    Agradezco si me orienta de como resolver el problema:
    If (IsNull(DLookup(«[Id_Detalle]», «[123456]», «[Id_Detalle]='» & Me.txt_Id_Detalle.Value & «‘»))) Then

    Tabla: Id_Detalle => Autonumeración => Entero Largo
    Formulario txt_Id_Detalle => Número general

  4. Cuál sería la expresión para utilizar como criterio una columna de la consulta donde se usa la función dbusq y busque en una tabla definida.

  5. hola, una duda con este codigo si yo quisiera buscar el importe pero que se cumplan dos criterios, o sea en una tabla de articulos buscar un importe por codigo y año como se podria realizar? Desde ya muchas gracias.-

  6. Hola necesito ayuda con respecto a un codigo necesito buscar por una caja de texto el usuario. Tengo una tabla se llama Datos contiene estos campos: Codigo, Usuario, Nombre, Apellido, Departamento y Sucursal. Mi caja de textos es: Texto124 Estoy usando DLookup pero me sale error de sintaxis este es mi codigo:

    Private Sub Comando232_Click()

    If Texto124 «» Then ‘ si no está vacio nuestro cuadro de texto

    DLookup («Codigo», «Usuario», «Nombre», «Apellido», «Departamento», «Sucursal», «Datos», «Usuario = ‘» & Me.Texto124 & «‘»)

    End If

    If IsNull(Texto124) Then ‘ si esta vacio el cuadro de texto

    MsgBox «DEBE INGRESAR UN TEXTO PARA INICIAR LA BÚSQUEDA», vbOKOnly, «ATENCION»

    Texto124.SetFocus ‘ devuelve el enfoque al cuadro de texto

    End If

    If Me.RecordsetClone.RecordCount = 0 Then ‘ si no encuentra nada

    MsgBox «NO SE ENCONTRÓ EL TEXTO BUSCADO», vbOKOnly, «AVISO»

    End If

    Exit Sub

    End Sub

  7. Buen día, agradezco me informe si saben como hacer para que Access halle el segundo valor mas pequeño de una lista (no el mínimo, ni el primero, ni el último, ni máximo).

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.