VBA Access - função DLookup - DLookup Function


Inline image 1
Você pode utilizar a função DLookup para obter o valor de um determinado campo de um conjunto especificado de registros (um domínio). Utilize a função DLookup em um módulo do VBA, uma macro, uma expressão de consulta ou um controle calculado de um formulário ou relatório.


É possível utilizar a função DLookup para exibir o valor de um campo que não esteja na origem de registro do seu formulário ou relatório. Por exemplo, suponhamos que tenha um formulário baseado em uma tabela Order Details. O formulário exibe os campos OrderID, ProductID, UnitPrice, Quantity e Discount. No entanto, o campo ProductName está em outra tabela. Você poderia utilizar a função DLookup em um controle calculado para exibir oProductName no mesmo formulário.

Sintaxe: DLookup (exprdomínio [, critérios] )



expr

Este parâmetro é obrigatório. Uma expressão que identifica o campo numérico cujos valores deseja retornar. Pode ser uma expressão em seqüência que identifica um campo em uma tabela ou consulta, ou pode ser uma expressão que realiza um cálculo de dados daquele campo. Em expr, você pode incluir o nome de um campo em uma tabela, um controle em um formulário, uma constante ou uma função. Se expr incluir uma função, ela poderá ser interna ou definida pelo usuário, mas não pode ser outra função de agregação de domínio ou de agregação SQL.

domínio
Também obrigatório. Uma expressão em seqüência que identifica o conjunto de registros que constitui o domínio. Pode ser um nome de tabela ou de consulta para uma consulta que não requer um parâmetro.

critérios
Este é opcional. Uma expressão em seqüência que limita o intervalo de dados em que a função DLookup é executada. Por exemplo, geralmente, critérios é equivalente à cláusula WHERE de uma expressão SQL, sem a palavra WHERE. Se critérios for omitido, a função DLookup avaliará expr em relação a todo o domínio. Qualquer campo que seja incluído em critérios deverá também ser um campo em domínio; caso contrário, a função DLookup retornará um Null.


Dicas
Embora você possa utilizar a função DLookup para exibir um valor em um campo de uma tabela externa, pode ser mais eficiente criar uma consulta que contenha os campos necessários em ambas as tabelas e basear seu formulário ou relatório nessa consulta.

Também é possível usar o Assistente de Pesquisa para localizar valores em uma tabela externa.

As alterações feitas em registros de domínio e que não foram salvas não serão incluídas quando essa função for usada. Para que a função DLookup seja baseada nos valores alterados, primeiramente, é preciso salvar as alterações clicando em Salvar Registro, em Registros, na guia Dados, movendo o foco para outro registro ou utilizando o método Update.

Talvez possa usar esse código pronto que poderá lhe auxiliar, desenvolvido pelo Allen Browne.

 Às vezes quando vemos um comando, funcionalidade sendo utilizado de outra maneira, acabamos compreendendo-o melhor.


Public Function ELookup(Expr As String, Domain As String, Optional Criteria As Variant, _
    Optional OrderClause As Variant) As Variant

On Error GoTo Err_ELookup

    'Purpose:   Faster and more flexible replacement for DLookup()
    'Arguments: Same as DLookup, with additional Order By option.
    'Return:    Value of the Expr if found, else Null.
    '           Delimited list for multi-value field.
    'Author:    Allen Browne. allen@allenbrowne.com
    'Updated:   December 2006, to handle multi-value fields (Access 2007 and later.)
    'Examples:
    '           1. To find the last value, include DESC in the OrderClause, e.g.:
    '               ELookup("[Surname] & [FirstName]", "tblClient", , "ClientID DESC")
    '           2. To find the lowest non-null value of a field, use the Criteria, e.g.:
    '               ELookup("ClientID", "tblClient", "Surname Is Not Null" , "Surname")
    'Note:      Requires a reference to the DAO library.
    Dim db As DAO.Database          'This database.
    Dim rs As DAO.Recordset         'To retrieve the value to find.
    Dim rsMVF As DAO.Recordset      'Child recordset to use for multi-value fields.
    Dim varResult As Variant        'Return value for function.
    Dim strSql As String            'SQL statement.
    Dim strOut As String            'Output string to build up (multi-value field.)
    Dim lngLen As Long              'Length of string.
    Const strcSep = ","             'Separator between items in multi-value list.

    'Initialize to null.
    varResult = Null

    'Build the SQL string.
    strSql = "SELECT TOP 1 " & Expr & " FROM " & Domain
    If Not IsMissing(Criteria) Then
        strSql = strSql & " WHERE " & Criteria
    End If
    If Not IsMissing(OrderClause) Then
        strSql = strSql & " ORDER BY " & OrderClause
    End If
    strSql = strSql & ";"

    'Lookup the value.
    Set db = DBEngine(0)(0)
    Set rs = db.OpenRecordset(strSql, dbOpenForwardOnly)
    If rs.RecordCount > 0 Then
        'Will be an object if multi-value field.
        If VarType(rs(0)) = vbObject Then
            Set rsMVF = rs(0).Value
            Do While Not rsMVF.EOF
                If rs(0).Type = 101 Then        'dbAttachment
                    strOut = strOut & rsMVF!FileName & strcSep
                Else
                    strOut = strOut & rsMVF![Value].Value & strcSep
                End If
                rsMVF.MoveNext
            Loop
            'Remove trailing separator.
            lngLen = Len(strOut) - Len(strcSep)
            If lngLen > 0& Then
                varResult = Left(strOut, lngLen)
            End If
            Set rsMVF = Nothing
        Else
            'Not a multi-value field: just return the value.
            varResult = rs(0)
        End If
    End If
    rs.Close

    'Assign the return value.
    ELookup = varResult

Exit_ELookup:
    Set rs = Nothing
    Set db = Nothing
    Exit Function

Err_ELookup:
    MsgBox Err.Description, vbExclamation, "ELookup Error " & Err.number
    Resume Exit_ELookup
End Function



Mas é também verdade que se eu fosse compara o Dlookup vs Recordset Eficiente, escolheria o segundo. Sim, os Recordset podem beneficiar-se de campos previamente indexados, o que em bases de dados grandes, pode fazer a diferença.


Tags: VBA, Access, DLook, recordset




Nenhum comentário:

Postar um comentário

diHITT - Notícias