понедельник, 10 декабря 2012 г.

VBA программирование


Как обратиться  к данным таблицы с помощью объекта Recordset
В своей практике  VBA программирование в Access мне приходилось использовать впервые. В этом деле для меня непривычным стало обращение к данным существующих таблиц или запросов. Объект Connection, Recordset, синтаксис. Я потратил достаточно времени, чтобы разобраться в этом вопросе самостоятельно, так как готовые коды на различных форумах - практически не понятны для новичка. Книг в сети тоже не так много, которые бы доступно описывали, то что обычно необходимо на практике.
И так, моя формула:



Исходные данные берем из таблицы
n - количество оцененных звонков (для примера на рис выше n=3), а - начисленный результат за звонок (для примера на рис выше a0=0.4 , a1=0.4, а2=1)

Следующая функция MakeConection, в которой реализована формула, будет вызываться в запросе для каждой строки отдельно

1 Public Function MakeConection(n As Integer, karta As Long) As Double
2 If (n >= 1) Then
3 Dim i As Integer
4 Dim s As Double
5 ReDim mass(0 To n - 1) As Double
6    Dim rst As ADODB.Recordset
7    Set rst = New ADODB.Recordset
8    rst.Open "SELECT [Исходящие звонки].Kode, [Исходящие звонки].Звонок, [Исходящие
9 звонки].[Результат]" & _
10 "FROM [Исходящие звонки]" & _
11 "WHERE ((([Исходящие звонки].Kode) = " & karta & " ) And (([Исходящие звонки].[Результат]) 12 Is Not Null))" & _
13 "ORDER BY [Исходящие звонки].Звонок;", CurrentProject.Connection
14   s = 0
15  i = 0
16    rst.MoveFirst
17   Do Until rst.EOF
18      mass(i) = rst(2)
19       s = s + mass(i) / (n - i)
20       rst.MoveNext
21      i = i + 1
22    Loop
23    rst.Close
24    Set rst = Nothing
25    MakeConection = s
26   Else: MakeConection = 99
27    End If
28 End Function 

Данный код и алгоритм просто, но для тех кто использует VBA программирование впервые некоторые моменты могут доставить массу сложностей и вопросов, ответы на которые явно не описываются. Построчно я укажу, с чем же возникали трудности у меня.
Функция вызывается в каждой строчке запроса, каждая строка содержит уникальный номер карты клиента karta (значение=klient_new.kode) и колличество оцененных звонков N (значение Count-Результат), взятое из запроса, в котором подсчитываются оцененные звонки клиенту
1 Собственно,Имя функции и  входящие данные из строки запроса( N количество оцененных звонков, karta - номер карты)
2 Условие
3, 4 Объявление переменных
5 Redim объявление массива, в которых границы могут изменяться( в моем запросе в каждой строке верхнее значение отличное)
6 Объявляем объект набора записей Recordset с помощью ключевого слова Dim. С помощью объекта Recordset извлекаются данные. Мы будем извлекать данные из запроса и помещать в него данные. Даем имя объекту rst
7 Создаем экземпляр объекта Recordset
8-13 Наполняем набор записей методом Open: Имя_объекта.Open
Будем использовать выражение SELECT языка SQL. Именно эта формулировка в пособиях и вводит в заблуждение. В данном случае источником данным выступает запрос. Все что находится в кавычках после Open является строкой подключения, поэтому если какая-то часть этой строки, которая по сути является копией SQL запроса, в самом запросе и может быть переменной, носит характер переменой, то её нужно вводить отдельно в таком виде  " & переменная & "- ТАК МЫ СДЕЛАЛИ НАШУ СТРОКУ ПОДКЛЮЧЕНИЯ ДИНАМИЧНОЙ.
14, 15 Присваиваем нашим переменным значение 0
16 Перемещаем курсор к первой записи в наборе
17 EOF принимает значение true, когда курсор перемещается в позицию после последней записи. В данном случае оператор Do Until проверяет истинность свойства EOF, и как только оно станет истинным прерывает цикл.
18 Заполняем массив, где rst(2) - это значение из третьего столба, текущей записи
19 Расчет
20 Перемещаемся к следующей записи(строке)
21 Увеличиваем счетчик(индекс)
22 Окончание тела цикла
23 Закрываем набор записей
24 Экземпляру объекта Recordset присваивается значение "пусто"
25 Присваиваем нашей функции результат
26 Если условие в строке 2 не выполняется, то сразу присваиваем значение нашей функции
27 Закрываем оператор If
28 Закрываем функцию

Думаю, что данный пример, может быть полезным новичкам в освоении VBA программирование, а именно в разделе подключения к таблицам и запросам с помощью таких объектов, как Recordset и Сonnection. VBA программирование значительно ускорит Вашу работу и автоматизирует базу данных.

Комментариев нет:

Отправить комментарий