DLookup и DFirst

DmtP
Дата: 06.09.2005 11:43:16
Если кто знает разницу между оными функциями просветите плиз.
Allll
Дата: 06.09.2005 12:40:21
Почитал справку, попробовал и разницы не заметил.

Возможно, DFirst сделали потому-что есть DLast :) , т.е. если есть функция, которая показывает последнюю запись, то должна быть и функция, которая покажет первую запись. Вроде логично :)

А из-за чего возник этот вопрос?
SAS!
Дата: 06.09.2005 13:00:21
Из Хелпа:

"Функции DFirst и DLast можно использовать для возврата случайной записи из определенного поля таблицы или запроса, когда необходимо получить любое значение из этого поля." Первый аргумент определяет "... поле, из которого нужно взять первое или последнее значение."

"Функция DLookup используется, чтобы получить значение определенного поля в указанном наборе записей"

Хотя в работе не проверял, может вы и правы...
Владимир Саныч
Дата: 06.09.2005 13:20:07
Про случайную - это ошибка в хелпе.
/topic/45103&pg=-1#309473
CMA
Дата: 06.09.2005 13:36:33
DMin и DMax рулят ))
Fat Lamer
Дата: 07.09.2005 12:10:12
От себя вношу чужие 5 копеек, может кому и пригодится:

Function ELookup(Expr As String, Domain As String, Optional Criteria, Optional OrderClause)
On Error GoTo Err_ELookup
    'Purpose: Faster and more flexible replacement for DLookup()
    'Arguments: Same as DLookup, with additional Order By option.
    'Author: Allen Browne. allen@allenbrowne.com
    '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
    Dim rs As DAO.Recordset
    Dim strSql As String

    '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
        ELookup = Null
    Else
        ELookup = rs(0)
    End If
    rs.Close

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
АлексейК
Дата: 07.09.2005 12:15:46
 Public Function SqlLookUp(sql)  
 Dim ar  
 On Error Resume Next  
 ar = CurrentProject.connection.Execute(sql).GetRows  
 SqlLookUp = ar(0, 0)  
 End Function  

Вызов функции из вычисляемого поля:
= SqlLookUp(" select a + b + c from mytable where id=" & [formID] )
АлексейЕ
Дата: 07.09.2005 12:53:15
Есть разница между DLookup и DFirst
Создайте запрос и поставьте сортировку в конструкторе запросов по какому либо полю.
Далее примените DLookup и DFirst к этому запросу и почуствуйте разницу.
Allll
Дата: 07.09.2005 13:23:36
Попробовал: DFirst игнорирует сортировку, а DLookup - нет.

Видимо фраза из справки:
Функции DFirst и DLast используют для возвращения значений из случайно выбранных записей определенного поля в таблице или запросе.

говорит именно об этом.
Allll
Дата: 07.09.2005 13:38:52
Видимо неспроста написали эту фразу в справке про DFirst, DLast:
Если требуется возвратить первую или последнюю запись из набора (подмножества) записей, необходимо создать запрос с сортировкой либо по возрастанию, либо по убыванию и указать для свойства Набор значений (TopValues) значение 1.

Если в запросе поставить TOP (с любым числом), то DFirst начинает учитывать сортировку и работает так же, как DLookup.