Часто используются запросы, включающие значения полей форм. Обычно их включают в условия отбора. Однако, если Вы попробуете открыть Recordset на основе такого запроса, то Access даст сообщение об ошибке: "Указаны не все параметры ...". Эти параметры как раз поля из форм. Ниже приводится простейшая функция, подставляющая значения параметров (полей форм) в запрос.
'Открытие Recordset на базе запроса с параметрами 'в виде полей форм Public Function OpenRQ(NameQuery As String) As Recordset Dim Q As QueryDef, par As Parameter Dim S As String, i As Integer, j As Integer
Set Q = CurrentDb.QueryDefs(NameQuery)
For Each par In Q.Parameters S=par.Name i = InStr(S, "!") j = InStr(i + 1, S, "!") Par = _ Forms(Mid(S, i + 1, j - i - 1))(Mid(S, j + 1)) Next par
Set OpenRQ = Q.OpenRecordset
End Function
Следующая функция немного сложнее, но она делает тоже самое не только с запросами, записанными в базу (QueryDefs), но и запросами, заданными прямым текстом SQL. Конечно, SQL-текст может содержать ссылки на другие запросы.
Public Function rpOpenRQ(NameQuery_Or_SQL As String) _ As Recordset Dim Q As QueryDef, par As Parameter
'В тексте SQL обязательно есть FROM c пробелами If NameQuery_Or_SQL Like "* FROM *" Then 'текст SQL - создаем временный запрос Set Q = _ CurrentDb.CreateQueryDef("", NameQuery_Or_SQL)
Else 'имя запроса Set Q = CurrentDb.QueryDefs(NameQuery_Or_SQL)
End If
For Each par In Q.Parameters par = rpGetVal(par.Name) Next
Set rpOpenRQ = Q.OpenRecordset End Function
Здесь используется функция rpGetVal. Она выдает значение поля формы, заданное текстом: "[Forms]![FormName]![FieldName]". (Квадратные скобки могут отсутствовать.) Кроме того, она выдает числовое значение, заданное в виде "=2", и текст без преобразования. Эти возможности нужны для восстановления значений полей форм, заданных по умолчанию. Например, FieldName.DefaultValue="=Forms!A!B" или FieldName.DefaultValue="=5". Для восстановления начального значения поля достаточно написать:
FieldName=rpGetVal(FieldName.DefaultValue)
Прямое присвоение: FieldName=FieldName.DefaultValue обычно не проходит.
Public Function rpGetVal(Expression) Dim S As String, i As Long, j As Long, d As Double
'Возвращаем Null при пустых значениях Expression. If IsNull(Expression) Then Exit Function S = Expression If S = "" Then Exit Function
'Убираем знак "=" - он может быть в DefaultValue. If Left(S, 1) = "=" Then S = Mid(S, 2)
'Разбор значения S On Error GoTo EndFun 'Если ошибка при разборе, то выход = Null i = InStr(S, "!") If i > 0 Then 'Это поле формы j = InStr(i + 1, S, "!") rpGetVal = _ Forms(Mid(S, i + 1, j - i - 1))(Mid(S, j + 1)) Else 'Может это число? If IsNumeric(S) Then 'Это число. Дробное? d = CDbl(S) i = CLng(S) If d = i Then rpGetVal = i 'целое Else rpGetVal = d 'дробное End If Else 'Это какой-то текст rpGetVal = S End If End If Exit Function