вторник, 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 осуществляет переход к следующей записи. Ну а внутри второго цикла, собственно, идёт банальная проверка условий и преобразования с текстом. Фух, вроде ничего не упустила.

понедельник, 5 сентября 2011 г.

Отчёт о написании программки.

Задание: Написать программу, удаляющую лишние символы (префиксы) в таблице Access опредленном столбце. Имеются столбцы с номером и производитетем (запчастей), наименованием, наличием и пр. Существенны - производитель и номер.
Примеры: Если производитель Febi и номер начинается с "Fe", то префикс "Fe" нужно удалить. Если производитель Ajusa и номер начинается на "Aj", удалить "aj". В зависимости от формата номеров в конкретной базе префиксы могут немного различаться, поэтому иногдя я оговариваю, что номер должен начинаться на определенный префикс, иногда - нет.
Для доступа к таблице и её редактирования потребовался динамичный массив Recordset, а так же библиотекa DAO (с некоторых пор включает в себя и необходимую JET) для доступа к данным (таблице). Собственно, долго и подробно про технологии доступа к данным тут. Не скажу, что я всё поняла оттуда, но кое-что пригодилось. Итак, код в студию. Код тут, ибо в html в удобочитаемом виде не получилось.

понедельник, 29 августа 2011 г.

Продолжая VBA. Строковые функции

■ Asc() — эта функция позволяет вернуть числовой код для переданного символа. Например, Asc("D") вернет 68. Эту функцию удобно использовать для того, чтобы определить следующую или предыдущую букву. Обычно она используется вместе с функцией Chr(), которая производит обратную операцию — возвращает символ по переданному его числовому коду. Например, такой код в Excel позволяет написать в ячейки с A1 по A20 последовательно буквы русского алфавита от A до У:
Dim n, nCharCode As Integer
n = 1
nCharCode = Asc("А")
Do While n <= 20
ActiveWorkbook.ActiveSheet.Range("A" & n).Value = Chr(nCharCode)
n = n + 1
nCharCode = nCharCode + 1
Loop
Варианты этой функции — AscB() и AscW(). AscB() возвращает только первый байт числового кода для символа, а AscW() возвращает код для символа в кодировке Unicode.
■ Chr() — возвращает символ по его числовому коду. Помимо того, что используется паре с функцией Asc() (см. предыдущий пример), без нее не обойтись еще в одной ситуации: когда нужно вывести служебный символ. Например, нам нужно напечатать в Word значение "Газпром" (в кавычках). Кавычка — это служебный символ, и попытка использовать строку вида:
Selection.Text = ""Газпром""
приведет к синтаксической ошибке. А вот так все будет в порядке:
Selection.Text = Chr(34) & "Газпром" & Chr(34)
Есть варианты этой функции — ChrB() и ChrW(). Работают аналогично та-ким же вариантам для функции Asc().
■ InStr() и InStrRev() — одни из самых популярных функций. Позволяют обнаружить в теле строковой переменной последовательность символов и вернуть ее позицию. Если последовательность не обнаружена, то возвращается 0. Функция InStr() ищет с начала строки, а InStrRev() — с конца.
■ Left(), Right(), Mid() — позволяют взять указанное вами количество символов из существующей строковой переменной слева, справа или из середины соответственно.
■ Len() — возвращает число символов в строке (длину строки). Часто используется с циклами, операциями замены и т. п.
■ LCase() и UCase() — переводят строку в нижний и верхний регистры соответственно. Часто используются для подготовки значения к сравнению, когда регистр не важен (фамилии, названия фирм, городов и т. п.).
■ LSet() и RSet() — заполняют одну переменную символами другой без изменения ее длины (соответственно слева и справа). Лишние символы обрезаются, на место недостающих подставляются пробелы.
■ LTrim(), RTrim(), Trim() — убирают пробелы соответственно слева, справа или и слева, и справа.
■ Replace() — заменяет в строке одну последовательность символов на другую.
■ Space() и String() — возвращают строку из указанного вами количества пробелов или символов соответственно. Обычно используются для форматирования вывода совместно с функцией Len(). Еще одна похожая функция — Spc(), которая используется для форматирования вывода на консоль. Она размножает пробелы с учетом ширины командной строки.
■ StrComp() — сравнивает две строки.
■ StrConv() — преобразует строку (в Unicode и обратно, в верхний и ниж-ний регистры, первую букву слов заглавной и т. п.).
■ StrReverse() — "переворачивает" строку, разместив ее символы в обратном порядке.
■ Tab() — еще одна функция, которая используется для форматирования вывода на консоль. Размножает символы табуляции в том количестве, в котором вы укажете. Если никакое количество не указано, просто вставляет символ табуляции. Для вставки символа табуляции в строковое значе-ние можно также использовать константу vbTab.

понедельник, 15 августа 2011 г.

VBA next. Операторы и циклы.

Повторение - мать учения.
Операторы условного и безусловного перехода.
If... Then
Конструкция такая:
If Условие Then
Команды1
[ElseIf УсловиеN Then
КомандыN]
[Else
Команды2]
End If
При этом:
■ Условие — выражение, которое проверяется на истинность. Если оно истинно, то выполняются Команды1, если ложно — Команды2;
■ УсловияN — дополнительные условия, которые также можно проверить. В случае, если они выполняются (выражение УсловияN истинно), то выполняются КомандыN.

Select... Case
Select Case Выражение
Case Условие1
Команды1
[Case УсловиеN
КомандыN]
[Case Else
Команды2]
End Select

И оператор GoTo, безусловного перехода, метка.

Теперь о циклах. C предусловием:
For...Next:
For iCounter = 1 to 10
MsgBox "Счетчик: " & iCounter
Next

Если нужно пройтись по всем элементам:
For Each...Next:
For Each oWbk in Workbooks
MsgBox oWbk.Name
Next

С постусловием:
До тех пор, пока утвержденеи истинно:
Do While...Loop
Do While MyVar < 10 MyVar = MyVar + 1 MsgBox "MyVar = " & MyVar Loop До тех пор, пока утверждение ложно (не станет истинным): Do Until...Loop
Do Until MyVar >= 10
MyVar = MyVar + 1
MsgBox "MyVar = " & MyVar
Loop

While...Wend
While My Var < 10
MyVar = MyVar + 1
WScript.Echo "MyVar = " & MyVar
Wend

воскресенье, 14 августа 2011 г.

Отступление от Тамре. VBA

Мне тут понадобилось накалякать программку - ибо вручную делать это раз за разом нет больше сил, и заодно ознакомится с языком. Так вот - читаю учебник. Конспектирование правильного обзывания переменных:
Чаще всего используется так называемое венгерское согла-шение (в честь одного из программистов Microsoft, Charles Simonyi, венгра по национальности):
■ имя переменной должно начинаться с префикса, записанного строчными буквами. Префикс указывает, что именно будет храниться в этой пере- менной:
• str (или s) — String, символьное значение;
• fn (или f) — функция;
• sub — процедура;
• c (или все буквы имени заглавные) — константа;
• b — Boolean, логическое значение (True или False);
• d — дата;
• obj (или o) — ссылка на объект;
• n — числовое значение;
■ имена функций, методов и каждое слово в составном слове должно начи-наться с заглавной буквы:
MsgBox objMyDocument.Name
Sub CheckDateSub()

понедельник, 8 августа 2011 г.

Тестирование объектно-ориентированного ПО

Тут всего пара слов - в суть я особо вникнуть не могу, т.к. не владею предметом, но ньюанс и важный - все же вынесла. При тестировании ООПО нужно учитывать, что всегда остается вопрос - будут ли работать методы, заданные в родительском классе, если их вызовет дочерний (который хоть и наследует род-е функции, но сам имеет и свои). "Протестировать каждый метод в контексте всех классов, которые могут получить к ним доступ".