Иногда бывает необходимо загрузить содержимое рекордсета в массив для того, чтобы более эффективно его использовать. Способ, который первым приходит в голову. Создаешь динамический массив (тип Variant, ведь в рекордсете могут быть разных типов). Создаешь рекордсет. Определяешь количество записей в рекордсете. Определяешь размер динамического массива. Делаешь перебор по записям, присваивая элементам массива значение полей рекордсета. После окончания перебора закрываешь и удаляешь рекордсет. Массив для работы готов. Всё просто. Но разработчики библиотек DAO и ADO решили облегчить нашу жизнь. Они добавили в коллекцию рекордсета действие GetRows, которое как раз и обеспечивает запись рекордсета в массив одной строкой, без организации перебора по записям.
Смотрим, как это реализовано в DAO ' описываем переменные Dim db As Database Dim varArray() As Variant Dim rstData As DAO.Recordset Dim strSQL As String Dim eData As Integer Dim intFields As Integer, i As Integer Dim strSotrudniki As String Set db = CurrentDb ' задаем текст запроса strSQL = "SELECT tblSotrudniki.IdRec, tblSotrudniki.Name, " _ & "tblSotrudniki.DateR, tblSotrudniki.Familie, " _ & "tblSotrudniki.Childer, tblSotrudniki.Dolgnost, " _ & "tblSotrudniki.Zarplata " _ & "FROM tblSotrudniki;" ' открываем рекордсет Set rstData = db.OpenRecordset(strSQL) ' проверяем наличие записей If rstData.RecordCount = 0 Then rstData.Close MsgBox "Таблица пустая!" _ , 64, "Содержимое таблицы" Exit Sub End If ' число полей в запросе intFields = rstData.Fields.Count ' определяем количество записей в рекордсете rstData.MoveLast ' перемещение в конец рекордсета rstData.MoveFirst ' перемещение в начало рекордсета eData = rstData.RecordCount ' количество записей в рекордсете ReDim varArray(intFields, eData) ' устанавливаем размер динамического массива ' первый параметр - число столбцов в массиве (полей в запросе) ' второй параметр - число строк в массиве (число записей в запросе) ' сброс данных из рекордсета в массив varArray = rstData.GetRows(eData) rstData.Close Set rstData = Nothing Аналогично и для ADO ' описываем переменные Dim varArray() As Variant Dim rstData As ADODB.Recordset Dim strSQL As String Dim eData As Integer Dim intFields As Integer, i As Integer Dim strSotrudniki As String On Error GoTo btnRMADO_Click_Error ' задаем текст запроса strSQL = "SELECT tblSotrudniki.IdRec, tblSotrudniki.Name, " _ & "tblSotrudniki.DateR, tblSotrudniki.Familie, " _ & "tblSotrudniki.Childer, tblSotrudniki.Dolgnost, " _ & "tblSotrudniki.Zarplata " _ & "FROM tblSotrudniki;" ' число полей в запросе intFields = rstData.Fields.Count ' открываем рекордсет Set rstData = New ADODB.Recordset rstData.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic ' проверяем наличие записей If rstData.RecordCount = 0 Then rstData.Close MsgBox "Таблица пустая!" _ , 64, "Содержимое таблицы" Exit Sub End If ' число полей в запросе intFields = rstData.Fields.Count ' определяем количество записей в рекордсете eData = rstData.RecordCount ' количество записей в рекордсете ReDim varArray(intFields, eData) ' устанавливаем размер динамического массива ' первый параметр - число столбцов в массиве (полей в запросе) ' второй параметр - число строк в массиве (число записей в запросе) ' сброс данных из рекордсета в массив varArray = rstData.GetRows(eData) rstData.Close Set rstData = Nothing ВНИМАНИЕ! Индекс элементов массива в VB/VBA начинается не с 1, а с 0. Использование оператора Option Base, который устанавливает заданную по умолчанию нижнюю границу для массива (0 или 1) Option Base 1 или прямое задание нижней границы в операторе ReDim не влияет на нижнюю границу массива. Она всегда оказывается равно 0. ReDim varArray( 1 To intFields, 1 To eData) Так что первый элемент массива имеет индексы varArray(0, 0). Проверить значение нижней границы можно использовать функцию LBound, как это сделано в прилагаемом примере. Примечание. Когда-то об этом писал GardenStone. http://hiprog.com/index.php?option=com_content&task=view&id=101 Но его сообщение затерялось где-то в глубинах форума, вот я и решил освежить сведения. Просмотров: 6412
Ваш коментарий будет первым | | |