Функции отбора значений из внутренних баз данных |
|
Перед описанием функций отбора значений из внутренних баз данных необходимо пояснить, как можно обратиться к конкретному полю базы данных.
Синтаксис обращения к полю БД следующий:
<имя базы>.<имя поля>
Например:
base.field_1
Запись base.field_1 означает, что нужно обратиться к полю field_1 в базе данных base.
Имеется несколько функций отбора значений из внутренней БД (базы данных по ссылке):
rec - получить номер записи, удовлетворяющей заданному условию;
frec - получить номер записи, значение в заданной колонке которой наиболее точно соответствует указанному в вызове данной функции;
val - получить значение поля из записи с указанным номером;
find - получить значение поля из записи, удовлетворяющей заданному условию.
Синтаксис функций
Функция rec()
rec ( условие ),
где условие - выражение, принимающее значение истина или ложь. Выражение может содержать в качестве операндов обращения к полям базы данных.
Например:
rec ( BASE.F1 > 10 && BASE.F2 < 5 )
Такой вызов функции означает: поиск номера записи во внутренней базе данных BASE, удовлетворяющей следующим условиям: значение поля F1 в этой записи должно быть больше 10 и (&&) значение поля F2 меньше 5. Поиск начинается с первой записи. Если запись не удовлетворяет указанному условию, то берется следующая запись. Если в базе данных нет записи, удовлетворяющей данному условию, то функция возвращает 0, в противном случае - номер найденной записи. Синтаксис условия полностью соответствует синтаксису арифметического выражения. Вместо операции "&&" можно использовать знак ",". Поэтому вызов функции может быть написан иначе:
rec ( BASE.F1 > 10, BASE.F2 < 5 )
При такой записи функция работает быстрее потому, что если первое условие ложно, то вычисление второго условия не производится. Рекомендуется также при обращении к базе данных в первом условии использовать поле, значение которого для различных записей различно.
Например, рассмотрим базу данных BASE с полями F1 и F2:
F1 |
F2 |
1 |
6 |
2 |
6 |
3 |
6 |
4 |
6 |
5 |
6 |
Обращение к функции:
rec (BASE.F1 > 4, BASE.F2 == 6)
будет работать быстрее, чем следующее:
rec (BASE.F2 == 6, BASE.F1 > 4)
Функция frec()
frec(аргумент_1, аргумент_2, аргумент_3, аргумент_4),
где аргумент_1 – колонка в базе данных по которой осуществляется поиск (обязательно вещественного или целого типа);
аргумент_2 – искомое значение;
аргумент_3 – критерий поиска. Возможные значения:
0 – находится ближайшее значение;
-1 – находится ближайшее меньшее значение;
1 – находится ближайшее большее значение.
аргумент_4 – параметр, являющийся признаком упорядоченности данных в колонке, по которой производится поиск. Возможные значения:
0 - значения расположены неупорядоченно и поиск осуществляется по всем записям базы;
1 – колонка упорядочена, по возрастанию или по убыванию. Как только разница между искомым значением и значением в текущей колонке базы больше, чем в предыдущей, поиск прекращается.
Параметры аргумент_3 и аргумент_4 являются необязательными. Если они не указаны, то используются значения по умолчанию.
аргумент_3 = 0 (искать ближайшее значение);
аргумент_4 = 0 (колонка неупорядоченная).
Например, frec(BASE.F1, 2.5, 1, 1)
Этот вызов означает: получить номер записи, для которой поле F1 содержит ближайшее большее значение по сравнению с 2.5 (значения в колонке F1 упорядочены). Для нашего примера функция вернёт значение 3.
Если в базе данных нет записи, удовлетворяющей условию поиска, то функция возвращает значение 0. Например, frec(BASE.F1, 0.5, -1, 1).
Функция val()
val ( номер_записи, поле_базы_данных, смещение), где
●номер_записи - любое арифметическое выражение, значением которого является целое число,
●поле_базы_данных - обращение к полю,
●смещение (необязательный параметр) - номер столбца, из которого будет отбираться значение. Номер отсчитывается от поля, задаваемого вторым параметром. Смещение может задаваться переменной, может принимать как положительные, так и отрицательные значения. Если значение смещения равно 0, то функция возвращает поле, задаваемое вторым параметром. То же самое будет происходить, если третий параметр не использовать.
Примеры:
val ( 4, BASE.F2 )
Этот вызов означает: отобрать значение из строки номер 4 из поля F2 базы данных BASE.
val ( 4, BASE.F2, 3)
Этот вызов означает: отобрать значение из строки номер 4 из поля, третьего вправо относительно поля F2 базы данных BASE.
val (n, BASE.F2 )
val (n<1?error("номер записи < 1"):n,BASE.F2)
Если в базе данных нет записи с указанным номером, то функция выдает сообщение об ошибке "Неверный номер записи".
Ошибочные обращения к функции val можно проконтролировать, не вызывая ее. Для этого в редакторе переменных необходимо написать строку:
n<1||n>BASE.#? error("неверный номер n"):val(n,BASE.F2),
где BASE.# - специальное обозначение количества записей в базе BASE.
Функция find()
find ( поле_базы_данных, условие )
Данная функция - это объединение функций val() и rec().
Функция возвращает значение указанного поля "поле_базы_данных" из записи, удовлетворяющей условию "условие". Если такой записи не существует, то функция выдает сообщение об ошибке "Неверный номер записи".
Примеры:
find (BASE.A, BASE.F1 > 4)
find (BASE.A, BASE.F2 == 6 && BASE.F1 > 4)
Рассмотрим связь переменных с внутренней БД на примере чертежа PROBA.
Напомним, чертеж имеет четыре переменные: три вещественные A, B, C и одну текстовую переменную $D.
Создайте с помощью команды IDatabase внутреннюю базу данных PROBA с полями AA, BB, CC, которые являются вещественными полями, и текстовым полем DD.
После этого в редакторе переменных для переменной C создайте список значений, совпадающих со значениями поля CC базы данных, а для остальных переменных введите следующие выражения:
После выхода на экране отобразится:
Таким образом вы задали связь переменных чертежа с внутренней БД. То есть при изменении значения переменной C, значения остальных переменных выбираются из БД. В результате вы получаете различные модификации чертежа.
Функция db_sum()
db_sum ( интервал) – вычисляет значение суммы ячеек в интервале
Функция db_mid()
db_mid ( интервал) – вычисляет среднее значение ячеек в интервале
Функция db_max()
db_max ( интервал) – вычисляет максимальное значение ячейки в интервале
Функция db_min()
db_min ( интервал) – вычисляет минимальное значение ячейки в интервале
Интервал может задаваться следующим образом:
1.Заданием имени колонки БД. На картинке ниже вычисляются сумма и среднее значение по колонке
2.Заданием имени колонки и начального номера строки. На картинке ниже вычисляется сумма и среднее значение для колонки "aa" начиная со второй строки
3.Заданием начальной и конечной строки. На картинке ниже вычисляется сумма и среднее значение с 1-й по 4-ю строку.
Смотри: Функции работы с переменными