- •Базы данных
- •Введение
- •Часть 1. Проектирование баз данных
- •1.1. Некоторые понятия и определения
- •1. 2. Модели данных
- •1.2.1. Иерархическая модель данных
- •1.2.2. Сетевая модель данных
- •1.2.3. Реляционная модель данных Основные определения
- •Типы связей между отношениями
- •1.3. Классификация баз данных
- •1.4. Цели проектирования баз данных
- •1.5. Проектирование баз данных с использованием универсального отношения
- •1.5.1. Универсальное отношение
- •1.5.2. Проблемы, вызываемые использованием универсального отношения
- •Проблема вставки
- •Проблемы обновления
- •Проблемы удаления
- •1.5.3. Нормальная форма Бойса -Кодда
- •Функциональные зависимости
- •Возможный ключ и детерминант
- •Общий подход к декомпозиции
- •Анализ исходных аномалий
- •1.5.4. Возможные потери фз при декомпозиции
- •1.5.5. Избыточные функциональные зависимости
- •Приемы удаления избыточных фз
- •Минимальное покрытие
- •Модернизированный алгоритм проектирования бд
- •1.6. Метод er - проектирования
- •1.6.1. Сущности и связи
- •1.6.2. Степень связи
- •1.6.3. Переход от диаграмм er – типа к отношениям
- •Предварительные отношения для бинарных связей степени 1:1
- •Предварительные отношения для бинарных связей степени 1:n.
- •Предварительные отношения для бинарных связей степени n:m
- •1.6.4. Дополнительные конструкции, используемые в er - методе
- •Необходимость связей более высокого порядка
- •Предварительные отношения для трехсторонних связей
- •Использование ролей
- •1.6.5. Последовательность проектирования бд при использовании er- метода
- •1.6.6. Проверка отношений на завершающейся фазе проектирования
- •1.7. Другие нормальные формы
- •1.8. Контрольные вопросы
- •Часть 2. Специальные аспекты работы с базами данных
- •2.1. Защита данных в базе
- •2.2.1. Общие вопросы защиты данных
- •2.2.2. Реализация защиты данных в различных системах
- •Управление доступом в sql
- •Реализация системы защиты в ms sql Server
- •2.2. Обеспечение целостности данных
- •2.3. Организация параллельных процессов обработки данных
- •2.4. Восстановление бд
- •2.4.1. Уровни восстановления.
- •2.4.2. Восстановление и логический элемент работы
- •Требования к лэр
- •2.4.3. Промежуточное восстановление
- •2.4.4. Длительное восстановление
- •2.5. Математический аппарат, используемый при работе с реляционной базой данных
- •2.5.1. Теоретико-множественные операции реляционной алгебры
- •2.5.2. Специальные операции реляционной алгебры
- •2.6. Контрольные вопросы
- •Часть 3. Разработка приложений для работы с базами данных
- •3.1. Краткий обзор субд
- •3.2. Субд Access
- •3.2.1. Вводные замечания
- •3.2.2. Создание базы данных
- •3.2.3. Создание и работа с таблицами
- •3.2.4. Работа с запросами
- •3.2.5. Создание форм
- •3.2.6. Отчеты в Access
- •3.2.7. Макросы в Access
- •Преобразование макросов в программы на Visual Basic
- •3.2.8. Работа с внешними данными
- •3.3. Программирование в Access
- •3.3.1. Вводные замечания
- •3.3.2. Объявление переменных
- •3.3.3. Константы
- •3.3.4. Тип данных Variant
- •3.3.5. Пользовательские типы данных
- •3.3.5.Операторы, команды и выражения в vba
- •3.3.7. Процедуры vba
- •3.3.8. Управляющие структуры в vba
- •Работа с управляющими структурами
- •3.3.9. Объекты в Access
- •3.3.10. Классы в Access
- •3.3.11. Работа с ошибками в vba
- •3.4.Работа в ms sql –Server
- •3.4.1. Основные количественные показатели системы sql-сервер
- •3.4.2. Создание баз данных
- •3.4.3. Создание таблицы
- •3.4.4. Извлечение данных
- •3.4.5. Добавление данных
- •3.4.6. Изменение данных
- •3.4.7. Удаление данных
- •3.5. Контрольные вопросы
- •Цитированная литература
- •Оглавление
- •Часть 1. Проектирование баз данных 3
- •Часть 2. Специальные аспекты работы с базами данных 71
- •Часть 3. Разработка приложений для работы с базами данных 114
3.3.8. Управляющие структуры в vba
Одним из удобств написания пользовательских процедур на языке Visual Basic для приложений является то, что в нем можно создавать процедуры, которые способны либо принимать решения в зависимости от некоторых условий, либо многократно циклически выполнять последовательность инструкций. Такие управляющие структуры позволяют управлять потоком выполнения программы.
Структуры принятия решений. Интеллектуальная процедура Visual Basic вначале тестирует программную среду и затем, основываясь на результатах тестирования, решает, что делать дальше. Предположим, что создается процедура Function, которая использует один из своих параметров в качестве делителя в формуле. Перед тем как использовать этот параметр в формуле, его следует протестировать, чтобы убедиться, что он не равен нулю (во избежание ошибки деления на 0). В случае, если он оказывается равным нулю, можно выдать сообщение, предупреждающее пользователя об ошибочном значении. Структуры принятия решений, которые поддерживает Visual Basic, включают:
If...Then, If...Then...Else, Select Case
If...Then. Структура If...Then используется для условного выполнения одной или больше инструкций. Можно использовать либо однострочный, либо блочный синтаксис инструкции:
If условие Then инструкция
If условие Then
Инструкции
End If
Условие — обычно сравнение, но это может быть любое выражение, которое оценивается как числовое значение. Visual Basic интерпретирует это значение как True или False; нулевое числовое значение является False, а любое числовое значение, отличное от нуля, рассматривается как True. Если условие — True, Visual Basic выполняет все инструкции, следующие за ключевым словом Then. Для условного выполнения единственной инструкции можно использовать оба синтаксиса структуры. Так следующие два примера эквивалентны:
If anyDate < Now Then anyDate = Now
If anyDate < Now Then
anyDate = Now
End If
Обратите внимание, что в однострочном синтаксисе If...Then не используется инструкция End If. Если требуется выполнить более одной строки кода, когда условие — True, необходимо применять блочный синтаксис If...Then...End If.
If anyDate < Now Then
anyDate = Now
Timer1.Enabled = False ' Деактивировать элемент ‘управления таймер
End If
Можно несколько увеличить эффективность использования инструкции If... Then, используя тот факт, что при оценке условия нулевое значение эквивалентно значению False, в то время как любое другое значение эквивалентно логическому значению True. Это значит, что не обязательно явно тестировать переменную или выражение, чтобы увидеть, равно ли оно нулю. Вместо этого можно использовать такую форму записи:
If Total Then
Summa = Summa + Total
End If
С другой стороны, многие программисты ощущают, что непосредственное включение тестирования ненулевого значения (Total <> 0) делает процедуру более интуитивной и удобной для восприятия. Поскольку в данном случае преимущество неявного тестирования весьма невелико, возможно, стоит поступать обычным способом
If...Then...Else. Использование инструкции If... Then для принятия решений представляет собой мощное орудие в арсенале языковых средств Visual Basic. Однако в нем содержится и существенный недостаток: в случае ложного результата (False) If... Then лишь пропускает одну или больше инструкций, но самостоятельно не исполняет ни одной команды. Во многих случаях это вполне оправданно, однако иногда может понадобиться выполнить одну группу команд, если условие возвращает значение True, и другую, если значение будет False. Справиться с этой проблемой позволяет инструкция If ... Then ... Else. В этом блоке определяется несколько групп инструкций, из которых должна быть выполнена одна:
If условие1 Then
[блок_инструкций 1]
[ElseIf условие2 Then
[блок_инструки,ий 2]]...
[Else
[блок_инструкций п]]
End If
Visual Basic сначала тестирует условие1. Если оно — False, Visual Basic продолжает тестировать условие2, и т. д., пока не получает результат True. Найдя условие True, Visual Basic выполняет соответствующий блок_инструкций и затем выполняет код, следующий за End If. В качестве опции можно также включать блок инструкций Else, который Visual Basic выполняет, если среди условий не найдет True.
Блок If...Then... ElseIf—частный случай lf...Then...Else; он может содержать любое количество предложений Elself или вообще их не содержать. Предложение Else можно включать независимо от того, имеются ли предложения Elself.
Для ситуаций, когда каждый Elself сравнивает одно и то же выражение с разными значениями, более эффективным будет использование структуры Select Case.
Select Case. В качестве альтернативы блоку lf...Then...Else, Visual Basic предоставляет структуру Select Case для селективного выполнения одной группы инструкций из числа нескольких групп инструкций. Инструкция Select Case обеспечивает возможности, подобные lf...Then...Else, но в случаях нескольких выборов делает код более читабельным. Структура Select Case работает с единственным оцениваемым выражением, которое проверяется однажды, наверху структуры. Затем Visual Basic сравнивает результат этого выражения со значениями для каждого Case структуры. Если встречается совпадение, выполняется группа инструкций, ассоциированных с этим Case:
Select Case оцениваемое_выражение
[Case список_выражений1]
[блок_инструкций 1]
[Case список_выражений2]
[блок_инструкций 2]
. . .
[Case Else]
[блок_инструкций n]]
End Select
Каждый список_выражений — список из одного или больше значений. Если в одном списке имеется больше одного значения, значения отделяются запятыми. Каждый блок_инструкций содержит ноль или больше инструкций. Если оцениваемому_выражению удовлетворяет больше чем один Case, выполняется только блок инструкций, ассоциированный с первым подходящим Case. Если в списках_выражений нет значений, соответствующих оцениваемому_выражению, Visual Basic выполняет инструкции в предложении Case Else (которое является необязательным).
Обратите внимание, что структура Select Case оценивает выражение однажды наверху структуры. С другой стороны, структура lf...Then...Else может оценивать для каждой инструкции Elself разные выражения.
Применять структуру Select Case вместо lf...Then...Else можно, только если инструкция If и каждая инструкция Elself оценивают одно и то же выражение.
Структуры-циклы. Если в процедуре необходимо многократно выполнить некоторые фрагменты кода, можно использовать структуры-циклы, которые сообщают Visual Basic, сколько раз следует выполнять ту или иную часть кода. Visual Basic поддерживает следующие циклы: Do…Loop, For…Next, For Each…Loop.
Цикл Do…Loop. Инструкция предназначена для выполнения блока инструкций неопределенное число раз. Имеется несколько разновидностей инструкции Do...Loop, в каждом из них для определения, продолжить ли выполнение, оценивается некоторое числовое условие. Как и в случае с циклом If...Then, условие должно быть значением или выражением, которое оценивается как False (ноль) или True (не ноль).
В следующем варианте Do...Loop инструкции выполняются до тех пор, пока условие — True:
Do While условие
инструкции
Loop
Когда Visual Basic выполняет этот цикл Do, он сначала тестирует условие. Если условие — False (ноль), он пропускает все последующие инструкции и выходит из цикла. Если условие — True, Visual Basic выполняет инструкции и затем возвращается к инструкции Do While и тестирует условие снова.
Следовательно, цикл может выполняться любое число раз, пока условие будет отлично от нуля или True. Инструкции никогда не выполняются, если условие — первоначально False.
Другой вариант цикла Do...Loop сначала выполняет инструкции, а затем тестирует условие после каждого выполнения. Эта разновидность гарантирует, по крайней мере, одно выполнение инструкций:
Do
Инструкции
Loop While условие
Две другие разновидности аналогичны предыдущим двум, за исключением того, что цикл выполняется, пока условие — False вместо True (то есть пока это условие не наступит).
Цикл ноль или больше раз:
Do Until условие
Инструкции
Loop
Цикл, по крайней мере, один раз:
Do
Инструкции
Loop Until условие
Цикл For—Next. Этот цикл является наиболее распространенным. Этот цикл используется в том случае, если (в отличие от инструкций Do) точно известно, сколько раз нужно повторить ту или иную группу инструкций. Особенность цикла For — переменная, именуемая счетчиком, значение которой увеличивается или уменьшается в течение каждого повторения цикла. Цикл For... Next имеет такую структуру:
For счетчик = начало То конец [Step приращение]
[инструкции]
Next [счетчик]
Параметры счетчик, начало, конец и приращение — числовые.
Параметр приращение может быть как положительным, так и отрицательным. Если приращение положительно, начало должно быть меньше или равно конец, иначе инструкции цикла не будут выполняться. Если приращение отрицательно, то для выполнения инструкций начало должно быть больше либо равно конец. Если Step не специфицировано, то приращение, по умолчанию, устанавливается равным 1. Если значение начало счетчика равно значению конец, цикл будет выполнен один раз.
При выполнении цикла For Visual Basic:
1. Устанавливает счетчик равным значению начало.
2. Тестирует счетчик. Если значение счетчика больше значения конец. Visual Basic выходит из цикла (то есть выполняет инструкцию, следующую непосредственно за инструкцией Next). Если счетчик не вышел за пределы значения конец, цикл повторяется. В случае отрицательного значения приращения Visual Basic проверяет, не является ли очередное значение счетчика меньше значения конец.
3. Выполняет инструкции.
4.Увеличивает счетчик на 1 или на значение приращение, если оно специфицировано.
5. Повторяет шаги со 2-го по 4-й, пока не выполнит цикл требуемое количество раз.
Цикл For Each—Next. Очень полезным вариантом инструкции For...Next является инструкция For Each...Next, которая производит действия с наборами элементов.
Цикл For Each...Next подобен циклу For...Next, с той разницей, что, вместо повторения инструкций специфицированное число раз, он повторяет группу инструкций для каждого элемента семейства объектов или массива. Это особенно выгодно, если точно не известно, сколько элементов содержит семейство или массив.
Синтаксис инструкции For Each...Next следующий:
For Each элемент In набор
Инструкции
Next элемент
При использовании цикла For Each...Next необходимо помнить следующее:
• для семейств элемент может быть только переменной Variant, переменной общего типа Object или объектного типа (класса), представленного в окне Просмотр объектов;
• для массивов элемент может быть только переменной Variant;
• For Each...Next нельзя использовать с массивом пользовательских типов, так как Variant не может содержать пользовательский тип.