А.Ю. Гончаров Access 2003 (960524), страница 39
Текст из файла (страница 39)
У нас переменных две:Otvet- номер кнопки, нажатой в окне диалога;MyTtme - число секунд.Системная переменная (или, если хотите, функция) Timer хранит число секунд,прошедших с начала текущих суток.Цикл While условие ... Wend довольно часто используется в VB. Он работает, покавыполняется условие.Оператор If условие Then ... Endlf позволяет выводить окно диалога, только когдаразница между текущим временем и временем, зафиксированным в переменнойMyTime, превысит 60 секунд,Для создания окна диалога используется функция MsgBox() с тремя аргументами: текстом сообщения в окне, системной константой для выбора вида кнопоки текстом для заголовка окна. Константа vbOKCancel указывает на то, что в окнедолжны быть две кнопки: ОК и Cancel. Такая конструкция очень удобна, когданадо организовать диалог с пользователем и позволить ему что-нибудь отменить.Кнопки в окне диалога нумеруются, начиная с единицы, и, когда пользователь нажимает кнопку, функция возвращает ее порядковый номер.У таких программ есть свои особенности.
Во-первых, во время их выполнениядля пользователя включается режим ожидания - указатель мыши приобретаетвид песочных часов и доступ к Access блокируется. Во-вторых, такая программадолжна быть оформлена именно как функция (Function), а не как подпрограмма(Sub). При этом функция не обязана возвращать какое-либо значение.Если требуется обеспечить возможность работы с Access и другими приложениями, пока выполняется программа на VB, в ее цикл необходимо вставитьинструкцию DoEvents. Попробуйте поместить ее после строки с оператором Whileи проверьте, как изменится работа макроса.MBОбозначение Sub является сокращением английского слова subroutine подпрограмма. Когда говорят о функциях и подпрограммах Visual Basic, часто используют общее название «процедура» (procedure).Глава 10224Подведем итоги. Программу, написанную на VB, можно запустить несколькими способами.
Во-первых, разрешается использовать ее как обработчик событий.Когда событие происходит, программа выполняется. Этот способ обсуждался настраницах книги. Во-вторых, программу можно запустить через макрос, а точнее,с помощью макрокоманды ЗапускПрограммы. В качестве ее аргумента используется имя функции Visual Basic.
А сам макрос запускается кнопкой на вкладкеМакросы или командой из главного меню Сервис =х> Макрос =^> Выполнитьмакрос. В-третьих, программы можно запускать в окне редактора Visual Basic.10.4. Пример программы и формыЕсли требуется определить размер самой длинной строки в текстовом поле(чтобы правильно выбрать размер поля), можно создать в базе данных инструмент, состоящий из формы и связанной с ней программы. В форме надо создатьтри поля для задания имени таблицы, имени поля и вывода номера обрабатываемой записи. Назовем их Tablica, Pole и Zapis соответственно.Еще надо создать кнопку (рис. 10.4) для запуска программы.
В моем примереона получила имя Кнопка/.„шальная Длина:Таблица;товарыМаркоРис. 10.4. Форма для определения максимальной длины строки в полеС кнопкой надо связать следующую программу:Private Sub Кнопка7_СПс!<()Максимальная длина поляOn Error GoTo Err_KHpnKa7_ClickDim Tabl As Recordset ' выбранная таблицаDim Imya As String ' выбранное полеDim Stroka As String ' строковая переменнаяПрограммирование225Dim Dlina As Long ' максимальная длинаDim Zap As Long ' запись, где длина строки максимальнаDim TekZap As Long ' текущая записьIf Triin(Me.Tablica) = "" Then Exit SubIf Trim(Me.Pole) = "" Then Exit SubDl'ina = 0Zap - 0TekZap = 0Imya = Trim(Me,Pole)Stroka = ""Set Tab! - CurrentDb.OpenRecordset(Me.Tablica)With TablВстряхнем таблицу.MoveLast.MoveFirstЦикл по всем записямDo Until .EOFTekZap = TekZap + 1Me.Zapis = TekZapStroka = Trim(Tabl.Fields(Imya))If Len(Stroka) > Dlina ThenDlina = Len(Stroka)Zap = TekZapEnd If.MoveNext ' следующая записьLoop.CloseEnd WithMsgBox "Максимальная длина строки " & Dlina & " Запись номер " & ZapExit_KHonKa7_Click:Exit SubErr_KHoni<a7_Click:MsgBox Err.DescriptionResume Exit_KHonKa7_ClickEnd SubНесколько замечаний к данному коду.
Если мы хотим работать с таблицей илизапросом, то должны создать объектную переменную типа Recordset. У нас этопеременная ТаЫ. Когда потребуется открыть таблицу, надо применить к текущейбазе данных (CurrentDb) метод OpenRecordset с соответствующим аргументом226Глава 10В нашем примере исходные параметры считываются из формы. Если не всепараметры заданы, работу программы надо прервать (инструкцией Exit Sub). Анализируя значения полей Tablica и Pole, надо отбросить возможные пробелы с помощью функции Trinn().Цикл Do Until .EOF ...
Loop позволяет перебрать все записи таблицы. Внутри цикла необходимо применять метод MoveNext (переход к следующей записи), иначецикл никогда не закончится.Команда Me.Zapis = TekZap позволяет выводить в текущей форме (Me) номеробрабатываемой записи. Это не влияет на работу программы, но дает возможность пользователю видеть, что программа работает.Функция Len() позвляет определить длину строки.Конструкция With ...
End With используется только для удобства написания кода.Она позволяет не использовать имя часто встречающегося объекта. Например кодWith Tab!.MoveLast.MoveFirstEnd W i t hэквивалентен коду:Tabl.MoveLastTabl.MoveFirstПрименять этот прием можно только в тех случаях, когда строка кода будет начинаться с точки. В остальных случаях надо использовать имя объекта явным образом.После того как таблица обработана, ее надо закрыть с помощью метода Close.Если надо вывести окно с сообщением и не требуется анализировать, какуюкнопку нажмет пользователь, можно воспользоваться инструкцией MsgBox. Здесьв качестве аргумента используется строковое выражение. Символ & позволяет соединять несколько текстовых значений.
В большинстве случаев позволяется использовать и числовые переменные, значения которых автоматически преобразуются в текст (рис. 10.5).Microsoft Office AccessМаксимальная дпина строки 32 Запись нсотер 19. кРис. 10.5. Окно, сформированное инструкцией MsgBoxПрограммирование._227Изучите по встроенному справочнику свойства и методы объектаRecordset и все, что с ним связано. Скопируйте в текстовый документвстреченные примеры программ. Вся эта информация постояннотребуется разработчику баз данных.Visual Basic для MS Office обладает интересной особенностью. Этот язык построен по принципу «заклинаний».
Он включает большое количество объектов,каждый из которых имеет ограниченное число свойств и методов (это называется«объектной моделью»). Догадаться, что к чему относится, практически невозможно, так же как писать код, не имея под рукой подробного справочника. Попытка наугад (точнее, из соображений здравого смысла) комбинировать объектыи методы кончается крахом: в большинстве случаев программа сообщает, что«объект не поддерживает данное свойство или метод». Поэтому все разработчикипрограмм на VB действуют одинаково: копируют из встроенного справочника работающие примеры (которые я называю «заклинаниями») и приспосабливают ихдля своих задач.10.5.
Пример функции (вычисление «суммыпрописью»)В формах и отчетах с коммерческими данными часто требуется вывести «сумму прописью». Для этого необходима специальная функция, Создадим новый модуль (Module2) и запишем в него приведенные ниже тексты функций (кромеосновной функции используются еще вспомогательные):Public Function CVM_nPO{chislo)'Функция для заполнения строки "сумма прописью"Dim tekst As StringDim surnpro As StringDim Psurnpro As StringDim tprom As StringDim nprom As IntegerDim nkop As Integersumpro =tekst = Trim(Str(Fix(chislo)})If Len(tekst) > 0 Then1Единицы, десятки, сотниIf Len(tekst) = 1 Then228Глава 10tprom = "О" + tekstElsetprom = Right(tekst, 2)End Ifnprom - Val(tprom)If nprom >= 10 And nprom <= 19 Thensumpro = N10t$(riprom) + " рублей"ElseSelect Case Val(Right(tprom, 1))Case 0sumpro = "рублей"Case 1sumpro = "рубль"Case 2, 3, 4sumpro - "рубля"Case 5 To 9sumpro - "рублей"End Selectsumpro = N1T$(Val(Right(tprom, 1))) + " " + sumproIf nprom >= 20 Thensumpro = LTnni(N20T$(Val(Left(tprom, 1))} + " " + sumpro)End IfEnd IfIf Len(tekst) >= 3 Thensumpro = LTrim(N100T$(Val(Left(Right{tekst, 3), 1))) + " " + sumpro)End IfТысячиIf Len(tekst) > 3 ThenSelect Case Len(tekst)Case Is >= 6tprom = Left(Right(tekst, 6), 3)Case 5tprom = "0" + Left(tekst, 2)Case 4tprom = "00" + Left(tekst, 1)End SelectIf Val(tprom) > 0 Thennprom = Val(Right(tprom, 2))If nprom >= 10 And nprom < 20 ThenPsumpro = N10T$(nprom) + " тысяч"ПрограммированиеElseSelect Case V a l ( R i g h t ( t p r o m , 1))Case 0Psurnpro - "тысяч"Case 1Psumpro = "одна тысяча"Сазе 2Psumpro = "две тысячи"Case 3Psumpro = "три тысячи"Case 4Psumpro - "четыре тысячи"Case 5Psurnpro - "пять тысяч"Case 6Psumpro = "шесть тысяч"Case 7Psumpro - "семь тысяч"Case 8Psumpro - "восемь тысяч"Case 9Psunipro = "девять тысяч"End SelectIf nprom >= 20 ThenPsumpro = LTrim(N2QT$(Val(Mid(tprom, 2, 1))) + " " + Psumpro)End If ,End IfIf Val(Left(tprom, 1}) > 0 ThenPsumpro = N1uQT$(Val(Left(tprom, 1))) + " " + PsumproEnd Ifsumpro - Psurnpro + " " + sumproEnd IfEnd If'МиллионыIf Len(tekst) > 6 ThenSelect Case Len(tekst)Case Is >= 9tprom = Left(Right(tekst, 9), 3)Case 8 'tprom = "0" + Leftftekst, 2)229230Глава 10Case 7tprom = "00" + Left(tekst, 1)End SelectIf Val(tprom) > 0 Thennprom - Val(Right(tprom, 2))If nprom >= 10 And nprom < 20 ThenPsumpro = N10T$(nprom) + " миллионов"ElseSelect Case Val(Right(tproni, 1))Case 0Psumpro - "миллионов"Case 1Psumpro = "миллион"Case 2, 3, 4Psumpro - "миллиона"Case 5 To 9Psumpro = "миллионов"End SelectPsumpro = N1T$(Val(Right(tprom, 1))) + " " + PsumproIf nprom >= 20 ThenPsumpro = LTrim(N20T$(Val(Mid(tprom, 2, 1))) + " " + Psumpro)End IfEnd IfIf Val(Left(tprom, 1)) > 0 ThenPsumpro = N100T$(Val(Left(tprom, 1))) + " " + LTrim(Psumpro)End Ifsumpro = Psumpro + " " +End IfEnd IfМиллиардыIf Len(tekst) > 9 ThenSelect Case Len(tekst)Case Is >= 12tprom = Left(Right(tekst, 12), 3)Case 11tprom = "0" + Leftftekst, 2)Case 10tprom = "00" + Left(tekst, 1)End SelectIf Val(tprom) > 0 ThenПрограммированиеnprom - Val(Right(tprom.