Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы работы с базами данных / C_Osnovy_raboty_s_bazami_dannykh.pdf
Скачиваний:
95
Добавлен:
26.03.2015
Размер:
7.44 Mб
Скачать

42

Тема 7. Использование вычисляемых полей в таблицах баз данных.

7.1. Добавление вычисляемых полей

Вычисляемые поля – это такие поля, которые в файле базы данных не существуют и не хранятся, но создаются и автоматически заполняются при работе с базой данных из приложения. Для изучения вычисляемых полей нам нужно создать проект, который позволял бы отображать данные из двух связанных таблиц Студенты и Отметки. Создайте такой проект. О том, как это делается, читайте в теме 4.

Примечание. Кнопки для выполнения операций добавления, сохранения и удаления записей в нашем проекте использовать не обязательно.

В результате должен получиться следующий интерфейс:

Для работы с вычисляемыми полями отобразите панель источников данных:

Данные ►Показать источники данных. В панели источников данных нажмите кнопку «Изменить набор данных в конструкторе».

© 2012, Милютин А.Ю.

43

Для добавления вычисляемого поля выполните щелчок правой кнопкой мыши на заголовке таблицы, выберите команду Добавить ► Столбец.

Всвойстве Name указывается имя добавляемого поля.

Всвойстве Expression указывается выражение для вычисления значения поля.

Всвойстве DataType указывается тип данных поля.

При создании выражений сравнения можно использовать следующие операторы:

<

>

<=

>=

<>

=

IN – для проверки принадлежности значения к списку LIKE – для сравнения строк текста

В выражениях также могут быть использованы следующие арифметические операторы:

+ (сложение) - (вычитание) * (умножение) / (деление)

% (остаток от деления)

Можно также использовать логические операторы AND, OR и NOT.

В выражениях для фильтрации также можно применять ряд функций:

SUBSTRING(expression, start, length) - получает подстроку указанной длины, начиная с указанного положения в строке.

expression — строка-источник для подстроки.

start — целое число, определяющее, где начинается подстрока. length — целое число, определяющее длину подстроки.

LEN(expression) - возвращает длину строки. expression — строка текста для определения длины.

TRIM(expression) - удаляет все предшествующие и последующие пустые символы. expression — укорачиваемое выражение.

Convert(expression, type) - преобразует определенное выражение в указанный тип. expression — преобразуемое выражение.

type — тип, в который необходимо преобразовать значение.

IIF(expr, truepart, falsepart) - получает одно из двух значений в зависимости от значения условия.

expr — условие.

truepart — значение, возвращаемое, если значение условия — "true". falsepart — значение, возвращаемое, если значение условия — "false".

Статистические выражения

Поддерживаются следующие составные типы: Sum (сумма)

© 2012, Милютин А.Ю.

44

Avg (среднее)

Min (минимум)

Max (максимум)

Count (счетчик)

StDev (статистическое среднеквадратичное отклонение) Var (статистическая дисперсия).

Ссылки на отношения родительский/дочерний объект

На родительскую таблицу может быть выполнена ссылка в выражении путем присоединения к имени столбца спереди строки Parent. Например, Parent.Fam является ссылкой на столбец с именем Fam родительской таблицы.

На столбец в дочерней таблице может быть выполнена ссылка в выражении путем присоединения к имени столбца спереди строки Child. Однако, так как дочернее отношение может вернуть несколько строк, необходимо включать ссылку на дочерний столбец в агрегатную функцию. Например, Avg(Child.mat) вернет средний балл по математике в дочерней таблице.

Примеры основных типов данных, которые можно использовать в функции

CONVERT:

 

 

Тип

Диапазон

Размер

System.Sbyte

От -128 до 127

8-разрядное знаковое целое число

System.Byte

От 0 до 255

8-разрядное целое число без знака

System.Int16

От -32 768 до 32 767

16-разрядное знаковое целое число

System.Uint16

От 0 до 65 535

16-разрядное целое число без знака

System.Int32

От -2 147 483 648 до 2 147 483 647

32-разрядное знаковое целое число

System.Uint32

От 0 до 4 294 967 295

32-разрядное целое число без знака

System.Int64

От -9,223,372,036,854,775,808 до

64-разрядное целое число со знаком

 

9,223,372,036,854,775,807

 

System.Uint64

От 0 до 18 446 744 073 709 551 615

64-разрядное целое число без знака

System.Double

От ±5,0e−324 до ±1,7e308

15-16 знаков после запятой

System.String

 

Непрерывная последовательность

 

 

символов в юникоде

7.2. Примеры использования вычисляемых полей

Пример 1. В таблице Студенты создать вычисляемое поле для отображения фамилии с инициалами.

Шаг 1. В панели источников данных нажмите кнопку «Изменить набор данных в конструкторе».

Шаг 2. Выполните щелчок правой кнопкой мыши на заголовке таблицы Студенты. Выберите команду Добавить ► Столбец.

Шаг 3. В свойстве Name добавленного столбца укажите имя добавляемого поля – fio. Шаг 4. В свойстве DataType укажите тип поля – System.String.

Шаг 5. В свойстве Expression укажите выражение для вычисления значения поля:

fam + ' ' + substring(name, 1, 1) + '.' + substring(otch, 1, 1) + '.'

Здесь с помощью функции SUBSTRING копируются первые символы из имени и отчества для создания инициалов.

Шаг 6. Переключитесь на форму в режиме конструктора. Отбуксируйте из источника данных поле fio на форму. Запустите приложение и убедитесь, что фамилии с инициалами правильно отображаются для разных студентов.

Пример 2. В таблице Отметки создать вычисляемое поле для отображения среднего балла по трем дисциплинам: математика, русский язык, информатика.

© 2012, Милютин А.Ю.

45

Шаг 1. В панели источников данных нажмите кнопку «Изменить набор данных в конструкторе».

Шаг 2. Выполните щелчок правой кнопкой мыши на заголовке таблицы Отметки. Выберите команду Добавить ► Столбец.

Шаг 3. В свойстве Name добавленного столбца укажите имя добавляемого поля –

srball.

Шаг 4. В свойстве DataType укажите тип поля – System.Double.

Шаг 5. В свойстве Expression укажите выражение для вычисления значения поля:

(mat + rus + inf) / 3

Шаг 6. Переключитесь на форму в режиме конструктора. Наше вычисляемое поле srball должно отображаться в компоненте DataGridView. Выполним добавление в DataGridView нового столбца. Для этого выполните щелчок правой кнопкой мыши на dataGridView1 и выберите команду «Добавить столбец». Выделите в списке столбец с именем srball и нажмите Добавить.

Примечание. Возможно, новый столбец не будет отображаться в списке. В этом случае сохраните проект, закройте его и откройте вновь.

Шаг 7. Для поля, отображающего средний балл, можно задать формат вывода, чтобы число округлялось до сотых. Для этого выполните щелчок правой кнопкой мыши на компоненте DataGridView и выберите команду «Правка столбцов». Выделите столбец srball и откройте для него свойство DefaultCellStyle. В диалоговом окне построителя CellStyle в свойстве Format выберите числовой формат. Укажите, что нужно использовать два десятичных разряда после запятой.

Примечание. Если для поля установлен тип данных System.String, то округление с помощью свойства Format действовать не будет. Так как средний балл является вещественным числом, установите для этого поля тип System.Double.

Пример 3. В таблице Студенты создать вычисляемое поле для определения пола студента.

Шаг 1. В панели источников данных нажмите кнопку «Изменить набор данных в конструкторе».

Шаг 2. Выполните щелчок правой кнопкой мыши на заголовке таблицы Студенты. Выберите команду Добавить ► Столбец.

Шаг 3. В свойстве Name добавленного столбца укажите имя добавляемого поля – pol. Шаг 4. В свойстве DataType укажите тип поля – System.String.

Шаг 5. Для определения пола нам нужно взять последнюю букву отчества и проверить условие. Если последняя буква – «ч», то пол мужской. Если последняя буква – «а», то пол женский. Для проверки условия будем использовать функцию IIF.

Добавьте в свойство Expression следующее выражение:

IIF(substring(otch, len(otch),1) = 'ч', 'муж', 'жен')

Данное выражение извлекает из отчества последнюю букву и проверяет, если последняя буква – «ч», то пол мужской, иначе – женский. Но при этом следует учитывать, что выражение дает истинный результат, только если у студента указано отчество. Если отчество не указано, то выражение будет автоматически присваивать студенту женский пол. Измените выражение следующим образом:

IIF(substring(otch, len(otch),1) = 'ч', 'муж', IIF(substring(otch, len(otch),1) = 'а', 'жен', ''))

Здесь используется вложенная функция IIF. В том случае, если последняя буква отчества не «ч», выполняется проверка еще одного условия. Если последняя буква отчества

© 2012, Милютин А.Ю.

46

«а», то присваивается женский пол, в противном случае вместо пола указывается пустой текст.

Обратите также внимание на то, что для определения пола человека нужно, чтобы было указано отчество человека. Если поле с отчеством содержит пустой текст, то из него невозможно скопировать последний символ. Это приведет к ошибке. Следовательно, нужно к выражению добавить еще одну проверку – если поле otch не пустое, то скопировать из него последний символ и определить пол, иначе – в поле для пола человека вывести пустой текст. Наше выражение примет окончательный вид:

IIF(len(otch) > 0, IIF(substring(otch, len(otch),1) = 'ч', 'муж', IIF(substring(otch, len(otch),1) = 'а', 'жен', '')), '')

Шаг 6. Переключитесь на форму в режиме конструктора. Отбуксируйте из источника данных поле pol на форму. Запустите приложение и убедитесь, что пол правильно отображается для разных студентов.

Пример 4. В таблице Отметки создать вычисляемое поле, которое для каждой записи отображало бы фамилии с инициалами.

Шаг 1. В панели источников данных нажмите кнопку «Изменить набор данных в конструкторе».

Шаг 2. Выполните щелчок правой кнопкой мыши на заголовке таблицы Отметки. Выберите команду Добавить ► Столбец.

Шаг 3. В свойстве Name добавленного столбца укажите имя добавляемого поля – fiootm.

Шаг 4. В свойстве DataType укажите тип поля – System.String.

Шаг 5. Для формирования фамилии с инициалами мы уже создавали выражение в примере 1:

fam + ' ' + substring(name, 1, 1) + '.' + substring(otch, 1, 1) + '.'

Здесь с помощью функции SUBSTRING копируются первые символы из имени и отчества для создания инициалов. Однако, следует учитывать, что поля fam, name, otch в таблице Отметки отсутствуют. Эти поля принадлежат главной таблице Студенты. Поэтому перед именами этих полей нужно добавить ключевое слово Parent:

Parent.fam + ' ' + substring(Parent.name, 1, 1) + '.' + substring(Parent.otch, 1, 1) + '.'

Шаг 6. Переключитесь на форму в режиме конструктора. Наше вычисляемое поле srball должно отображаться в компоненте DataGridView. Выполним добавление в DataGridView нового столбца. Для этого выполните щелчок правой кнопкой мыши на dataGridView1 и выберите команду «Добавить столбец». Выделите в списке столбец с именем fiootm и нажмите Добавить.

Примечание. Возможно, новый столбец не будет отображаться в списке. В этом случае сохраните проект, закройте его и откройте вновь.

Можно также выполнить щелчок правой кнопкой мыши на dataGridView1, выбрать команду «Правка столбцов…» и переместить столбец fiootm на первое место.

Пример 5. В таблице Студенты создать вычисляемое поле, которое определяло бы средний балл данного студента по информатике.

Шаг 1. В панели источников данных нажмите кнопку «Изменить набор данных в конструкторе».

Шаг 2. Выполните щелчок правой кнопкой мыши на заголовке таблицы Студенты. Выберите команду Добавить ► Столбец.

Шаг 3. В свойстве Name добавленного столбца укажите имя добавляемого поля –

srinf.

© 2012, Милютин А.Ю.

47

Шаг 4. В свойстве DataType укажите тип поля – System.Double.

Шаг 5. Для определения среднего балла можно воспользоваться статистическими функциями SUM и COUNT. Только следует учитывать, что мы будем вычислять среднее значение поля inf, которое принадлежит подчиненной таблице Отметки. Следовательно, перед именем поля нужно указать ключевое слово Child:

sum(Child.inf) / count(Child.inf)

Шаг 6. Переключитесь на форму в режиме конструктора. Отбуксируйте из источника данных поле srinf на форму. Запустите приложение и убедитесь, что средний балл правильно отображается для разных студентов.

Шаг 7. Для текстового поля, отображающего средний балл, можно задать формат вывода, чтобы число округлялось до сотых. Для этого выделите текстовое поле со средним баллом. В свойстве DataBindings откройте вложенное свойство Advanced. Задайте тип формата – числовой, и количество десятичных разрядов – 2.

Примечание. Если главная таблица связана с несколькими подчиненными, то после ключевого слова Child в скобках указывается имя связи. Таким образом, определяется, из какой конкретно дочерней таблицы нужно брать поля для создания вычисляемого поля. В нашем примере 5 между таблицами Студенты и Отметки сделана связь с именем СтудентыОтметки. Выражение для вычисления среднего балла по информатике может быть записано следующим образом:

sum(Child(СтудентыОтметки).inf) / count(Child(СтудентыОтметки).inf)

© 2012, Милютин А.Ю.