Краткое содержание 29 Об этих стрелках 30 о сочетаниях клавиш 32 о щелчках кнопкой мыши 33 Примеры 33
Скачать 19.64 Mb.
|
Практические занятия для опытных пользователей. Применение пользовательских функций в запросах После того как вы создали функцию, ее можно использовать в вашей БД для построения запросов или условий на значения. Единственное требование — ваша функция должна находиться в пользовательском модуле, который вы добавили (не в модуле формы) и в ее объявлении не должно быть слова Private. Если ваша функция соответствует указанным требованиям, вы можете вызывать ее так же легко, как любую встроенную функцию программы Access. Можно создать, например, такой запрос с вычисляемым полем (при условии, что в него включены два поля, названные LengthOfRoom (длина комнаты) и WidthOfRoom (ширина комнаты) соответственно): RoomArea: Area (LengthOfRoom, WidthOfRoom) Или можно создать следующее условие на значение для таблицы: Area(LengthOfRoom * WidthOfRoom) < 10000 См. в главе 7 дополнительные соображения по поводу применения функций в вычисляемых полях и в главе 4 дополнительную информацию об условиях на значения или правилах верификации. Если же вы хотите увидеть этот конкретный пример в действии, обратитесь к БД MyHouse, которая включена в примеры к данной главе. Подытожим: функция для проверки кредитных карт Теперь, когда вы познакомились с языком Visual Basic, самое время подвести итог с помощью примера, демонстрирующего все, что вы узнали о VB (и даже немного больше). В данном примере рассматривается пользовательская функция ValidateCard (допустимая карта), которая проверяет номер кредитной карты. Функция ValidateCard возвращает одно из двух значений: True (что означает допустимый номер карты) и False (что означает неверный номер). Важно понимать, что допустимый номер кредитной карты — это просто номер, соответствующий несекретным правилам нумерации кредитных карт (см. дополнительную информацию в следующем примечании). Этот номер может соответствовать реальной кредитной карте или нет. Функция ValidateCard достаточно сообразительна для вылавливания случайных ошибок и не слишком умелых хакеров. По-настоящему злонамеренные пользователи могут найти программы, позволяющие генерировать потенциально допустимые номера кредитных карт. На профессиональном уровне. Алгоритм Луна (Luhn Algorithm) В функции ValidateCard применяется алгоритм, названный алгоритмом Луна, который разработал специалист компании IBM в 1960 гг. Алгоритм Луна действует, т. к. компании, выпускающие кредитные карты, следуют его правилам. Другими словами, они выпускают только такие номера, которые считаются допустимыми с точки зрения алгоритма Луна. Полное объяснение алгоритма Луна можно найти на Web-странице http://en.wikipedia.org/wiki/Luhn_algorithm. Далее приведено описание его принципа действия в версии журнала "Reader's Digest".
Алгоритм Луна проверяет, может ли предоставленный вами номер быть номером реальной кредитной карты. Но он делает только то, что делает. Этот алгоритм не может обнаружить номер кредитной карты, технически приемлемый, но на самом деле не присвоенный никакому банковскому счету (и ясно, что не может определить финансовое положение владельца счета и наличие на счету требуемого для покупки лимита). Далее приведен полный программный код функции ValidateCard. Все строки кода пронумерованы, поэтому вы можете разбить его на элементарные порции (построчные объяснения даются после кода): 1 Function ValidateCard(CardNumber As String) ' Это промежуточный итог (создаваемый с помощью алгоритма Луна)
' Эта переменная определяет, в какой вы находитесь позиции, ' нечетной или четной. ' Вы начинаете с нечетной позиции (1)
2 В этом случае четные от начала номера, применяемого в качестве примера. — Пер. 6 Dim i 7 For i = Len(CardNumber) To 1 Step -1 8 Dim CurrentNumber 9 CurrentNumber = Mid(CardNumber, i, 1) 10 If OddNumbered = False Then ' Цифра удваивается 11 CurrentNumber = CurrentNumber * 2 12 If CurrentNumber >= 10 Then ' ' Если результат состоит из двух цифр, они складываются. ' Это странная часть, поскольку нужно использовать ' функции преобразования строк 13 Dim NumText As String 14 NumText = CurrentNumber 15 CurrentNumber = Val(Left(NumText, 1)) + 16 Val(Right(NumText, 1)) 17 End If 18 End If ' К промежуточному итогу добавляется полученное число 19 " SumOfDigits = SumOfDigits + CurrentNumber ‘Переход из нечетной позиции в четную или наоборот. ' Эта строка кода изменяет значение True на False или ' False на True
' Если сумма кратна 10, номер допустимый 22 If SumOfDigits Mod 10 = 0 Then 23 ValidateCard = True 24 Else 25 ValidateCard = False 26 End If 27 End Function Функция работает следующим образом.
Примечание В цикле применен еще один прием — нижнее граничное значение задается с помощью функции Len, которая возвращает длину текстового фрагмента. Другими словами, если номер кредитной карты состоит из 11 цифр, этот код выполняется 11 раз (один раз для каждой цифры).
Может потребоваться некоторое время для того, чтобы разобраться в работе функции от начала до конца и выяснить точно, что происходит, но в конце концов все это относится к основным элементам языка VB, таким как условия, циклы и переменные. Если вы действительно хотите изучить данный пример, его можно посмотреть в действии с помощью средств отладки. После завершения создания функции, подобной ValidateCard, ее можно вызвать для проверки соответствия номера кредитной карты. Далее приведен пример, реагирующий на ввод данных кредитной карты в текстовое поле, названное CardNumber: Private Sub CardNumber_BeforeUpdate(Cancel As Integer) If ValidateCard(CardNuraber) Then MsgBox "Your card is valid," Else. MsgBox "Your card is invalid. " & _ "Did you forget a number, or are you trying to cheat us?" Cancel = True End If End Sub Для проверки выполните приведенный код и введите один из номеров ваших кредитных карт в поле CardNumber, как показано на рис. 17.3. Рис. 17.3. Эта форма демонстрирует работу функции Validate Card в форме AddCreditCard (вставка кредитной карты) из БД Boutique Fudge . Когда бы ни менялось поле CardNumber, процедура проверяет его допустимость и отменяет изменения, если значение не приемлемо Обработка сбойных ситуаций Было бы хорошо сделать вид, что программа Access всегда успешно справляется с вашим программным кодом без малейшей заминки. Но следует признать, что ошибки все же возникают и случается это часто. Этот факт не должен пугать вас. В конце концов, одна из причин применения кода на языке Visual Basic вместо обычных макросов состоит в том, что вы можете с изяществом выявлять ошибки и реагировать на них. Вы столкнетесь с двумя типами ошибок в вашем коде.
Ваша задача, как добросовестного программиста, исправить все ошибки и обработать непредвиденные ограничения наилучшим образом. Для выхода из затруднений Visual Basic предлагает два средства. Можно использовать отладку для диагностики и устранения необычных проблем и код обработки ошибок для выявления неожиданных проблем и оповещения о них других пользователей. Отладка Отладка — это отличное средство, позволяющее пройтись по вашему коду, понаблюдать за его работой и заметить ошибки. Отладка программного кода аналогична отладке макроса в том смысле, что позволяет выполнить ваш алгоритм пошагово, оператор за оператором. Но у кода более мощное средство отладки, которое позволяет проверять сложные процедуры, циклы и условные операторы. Оно даже может показать, что в данный момент хранится в ваших переменных. Подсказка Настоящее преимущество отладки заключается в том, что она позволяет вам проверить ваши предположения. У каждого программиста есть собственные предположения о том, как работает фрагмент кода. Однако если код делает именно то, чего вы ждали, у вас, вероятнее всего, нет ошибок. С помощью отладки можно точно найти место, где код делает что-то неожиданное — когда вычисление дает странный результат, условный оператор отправляет неверным путем, цикл повторяется лишний раз и т. д. Затем можно исправить ошибку. Самый легкий способ отладки — установка точек прерывания или останова, специального маркера, сообщающего программе Access о том, где вы хотите начать отладку. Когда Access достигает строки кода с точкой останова, программа приостанавливает выполнение кода. Затем она позволяет вам выполнять код с заданной вами скоростью, поочередно одну строку кода за другой. Точки останова применяют следующим образом. 1. Найдите первую строку кода, которую хотите отладить. Если нужно проверить подпрограмму целиком, начните с оператора Sub или Function. Если вы хотите проверить конкретную часть кода, перейдите к ней. 2. Щелкните слева кнопкой мыши для установки точки останова в этой строке (рис. 17.4). Каждая точка останова — это сигнал программе Access о месте начала отладки. В некоторых строках кода нельзя поместить точки останова. Эти строки не содержат выполняемого кода, строки с пробелами, комментарии и объявления переменных. Все остальные строки — поле для игры по правилам. Рис. 17.4. Все точки останова выглядят как кружки красного цвета. Удалить точку останова можно, щелкнув ее кнопкой мыши. В данном примере точка останова (обведена) помещается вначале функции ValidateCard Примечание Когда вы закроете вашу БД и откроете ее позже, все точки останова исчезнут. 3. Запустите ваш код. Вы можете начать выполнять код обычным образом. Если вы отлаживаете обработчик события для нажатия кнопки, откройте соответствующую форму и затем щелкните кнопку мышью. Когда программа Access достигнет точки останова, она приостановит выполнение и переключится в режим прерывания (break mode). Все в вашем приложении замрет. В режиме прерывания у вас есть несколько вариантов. Можно выполнять код пошагово. Это означает, что вы выполняете по одному оператору, останавливаясь после каждого из них. Для опробования нажмите клавишу продолжать, сколько захотите, нажимая клавишу Подсказка Пошаговая отладка позволяет следить за работой кода. Если применить ее к функции ValidateCard, описанной ранее, вы увидите, как программа Access выполняет цикл несколько раз и как она переходит к разным секциям условного блока в зависимости от того, обрабатывается цифра в нечетной или четной позициях. Р ис. 17.5. В данном примере точка останова останавливает выполнение кода в начале функции ValidationCard. Затем пользователь, проводящий отладку, нажимает несколько раз клавишу Можно прекратить выполнение кода. Нажмите кнопку Stop (остановить) (она выглядит как квадрат) на панели инструментов редактора Visual Basic для завершения выполнения вашего кода. Можно внести изменения. Если вы нашли ошибку, можно исправить ваш код и затем продолжить выполнение с внесенными изменениями. Конечно, существуют определенные типы корректировок, которые заставляют программу Access остановить отладку. Если вы внесли именно такое изменение, то увидите окно сообщения, предупреждающее о том, что "This action will reset your project" ("Это действие сбрасывает ваш проект"). Если щелкнуть мышью кнопку ОК, программа Access остановит выполнение вашего кода, как будто вы щелкнули мышью кнопку Stop (остановить) на панели инструментов редактора Visual Basic.
Р ис. 17.6. Проведя указателем мыши поверх имени переменной CurrentNumber, можно увидеть, что в данный момент она хранит число 4. Можно провести указателем мыши поверх имен переменных в любой строке кода, кроме текущей строки. Если применяется клавиша ■ Можно возобновить выполнение в нормальном режиме. Если вы обнаружили источник проблемы и не хотите продолжать отладку, просто нажмите клавишу Подсказка Вы можете выполнить ловкий трюк с желтой стрелкой. Ее можно использовать для выполнения строк, расположенных в другом месте кода. Просто перетащите стрелку с нажатой кнопкой мыши к строке, которую хотите выполнить следующей, и затем нажмите клавишу У редактора Visual Basic есть множество других средств отладки. Однако точек останова вполне достаточно для начала исследования того, что делается под капотом, когда выполняется ваш код. |