вторник, 10 января 2012 г.

Метод Recordset

В программе я использовала метод Recordset для доступа к данным. Освоение этого метода и его применение оказалось самым сложным в написании программы, ведь ничего необычного в том, чтобы вырезать ненужную часть в тексте нет. Я думаю, по книгам я бы вряд ли смогла его освоить - у меня был модуль от бывшей сотрудницы. От этого я отталкивалась. Возможно, я невнимательна, но нигде в литературе я не нашла (а может просто теорию не удалось конкретизировать) как его применять. Типы курсоров, объекты, коллекции - всё это не давало мне представления как же мне показать программе какую таблицу подключить, а, главное, как. Тут я хочу сделать очередные "заметки на полях". И да, нигде не нашла упоминания о библиотеках. Выложат кусок модуля - закинешь его в Access, запустишь - и о боже! - убей их всех. Не хватает библиотеки. Какой? Из тысячи как её выбрать? Наугад? Опять же - слава предшественнице, надоумила. Обычно пользуются DAO или ADO, смотря каким методом вы организуете доступ к данным (проще говоря - какую ткнете). Иногда не хватает Jet and Replication, хотя я читала, что с некоторых пор она входит в DAO. Итак, как указать модулю нужную таблицу и какие дополнительные параметры нам понадобятся, если мы хотим редактировать записи. Что есть вообще Recordset? Как я понимаю, это некая промежуточная таблица, копия той, с которой вы работаете, записанная в оперативную память и потом замещающая (если не забудете указать) рабочую. То есть - взяли слепок ("набор записей на основе таблицы", как ещё пишут) с таблицы, с ним сделали все действия и заменили им таблицу. А если это новая таблица, значит её нужно описать в переменных. Итак:
Dim [имя "слепка"] As Recordset
Превосходно. Мы сказали модулю, что у него будет табличка-слепок (полученная методом Recordset) с именем... Пусть будет банальное rst
Dim rst as Recordset
Пока она девственно пуста, но нам нужно наполнить её нашей рабочей. А наша рабочая таблица находится в базе данных (в конкретном случае - в той же, что и модуль, в противном случае нужны другие параметры). Из этого следует, что нам нужно ещё и базу данных описать. Главное, не описаться :)
Dim [имя базы] as Database
Пусть её тоже зовут стандартно, dbs
Dim dbs as Database (кстаит сказать, иногда на эту строку у меня отладчик ругается и я её просто убираю - видимо, подхватывается на автомате)
Теперь "скажем" модулю, что наша dbs - текущая база данных:
Set dbs = CurrentDb
И вот теперь мы можем наконец заполнить нашу промежуточную табличку рабочей:
Set rst = dbs.OpenRecordset("имя рабочей таблицы", dbOpenDynaset)
OpenRecordset открывает табличку. А константа dbOpenDynaset позволяет производить изменения (есть константы, к примеру, только для чтения) и допускает соединение нескольких таблиц. Вообще говоря, мне кажется что и более узкая dbOpenDynamic будет работать как нужно, но я взяла пошире, как с типом переменной - чтоб не промахнуться.
После этого наша промежуточная таблица готова к редактированию, а доступ к полям осуществляется оператором ! с указанием имени поля. К примеру:
!proizv = Trim (!proizv)
Итак, мы хотим произвести в таблице некоторые изменения. По умолчанию курсор стоит в начале записей. Если честно, с другими вариантами, когда его нужно поставить на определённую запись, не сталкивалась. Курсор будет двигаться строго по порядку - от начальной позиции к следующей и так, пока не будет достигнут конец записей. Логично, что для внесения изменений, придется иметь дело с циклом, и не одним. Будут два вложенных. Первый - как раз на это движение от первой позиции к последней и проверки каждой записи на условия и второй - на редактирование (изменение) и обновление данных в таблице.
While not rst.EOF
...
Wend
Или цикл Do Until ... Loop
Do Until rst.EOF
...
Loop
.EOF - End of file.
Второй же цикл - на внесение изменений при выполнении условий.
With rst
.Edit
...
.Update
.MoveNext
End With
.Update - метод, который позволяет вносить изменения в нашу исходную таблицу, а .MoveNext осуществляет переход к следующей записи. Ну а внутри второго цикла, собственно, идёт банальная проверка условий и преобразования с текстом. Фух, вроде ничего не упустила.