Вы находитесь на странице: 1из 30

СИСТЕМА УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ "МИКРОПОИСК"

ЯЗЫК ЗАПРОСОВ MPQL


РУКОВОДСТВО ПРОГРАММИСТА

Дата последней редакции: 27.04.2021.


Приложение к общей инструкции ГеоПоиск 9 (www.geopoisk.com)
2

Аннотация
Настоящее руководство содержит сведения, необходимые
программистам, разрабатывающим прикладные программы и использующим
инструментальные средства СУБД "МикроПоиск". Она предназначена для
использования баз данных (БД) сложной сетевой структуры в рамках
различных программных систем (приложений). БД "МикроПоиска" занимает
промежуточное место между бинарным файлом и реляционной БД: это
файл, чтение и модификация которого выполняется по фрагментам с
помощью текстовых запросов. Применение СУБД "МикроПоиск" сокращает
время на разработку пакетов программ, функционирующих на единой
информационной базе сложной структуры, облегчает реализацию
совместимости данных между разными версиями программ, обеспечивает
высокую скорость чтения/записи данных, не требует администрирования.
Интерфейс с СУБД "МикроПоиск" из прикладной программы
поддерживается на двух уровнях: средства базового языка
программирования на API-уровне, объектно-ориентированные средства
программирования (ООСП) на прикладном межпрограммном уровне.
В настоящем руководстве приводится описание языка запросов СУБД
"МикроПоиск" и ряд смежных вопросов.
3

Содержание
1. ОБЩИЕ СВЕДЕНИЯ .................................................. 4
1.1. Спецификация данных ................................................ 4
1.2. Пример схемы прикладной БД ......................................... 5
2. 2 ЯЗЫК ЗАПРОСОВ MPQL ............................................ 5
2.1. Непосредственный отбор множества ................................... 6
2.1.1. Отбор по перечислению .......................................... 6
2.1.2. Отбор по логическому условию ................................... 6
2.1.3. Отбор в диалоге ................................................ 8
2.2. Операции над множествами ........................................... 8
2.2.1. Переход по связи ............................................... 9
2.2.2. Проекция по роли в связи ....................................... 9
2.2.3. Tеоретико-множественные операции .............................. 10
2.3. Операции изменения данных ......................................... 10
2.3.1. Присвоение значений атрибутам объекта ......................... 10
2.3.2. Создание объектов в БД ........................................ 11
2.3.3. Удаление объектов из БД ....................................... 11
2.3.4. Создание связей между объектами ............................... 11
2.3.5. Уничтожение экземпляров связей в БД ........................... 12
2.4. Ввод/вывод данных ................................................. 12
2.4.1. Спецификация таблицы .......................................... 13
2.4.2. Упорядочение множества ........................................ 13
2.4.3. Отбор с учетом порядка ........................................ 14
2.5. Арифметические функции ............................................ 14
2.5.1. Функция вычисления минимума ................................... 14
2.5.2. Функция вычисления максимума .................................. 15
2.5.3. Функция вычисления среднего арифметического ................... 15
2.5.4. Функция вычисления суммы числовых атрибутов ................... 16
2.5.5. Функция вычисления количества элементов ....................... 16
2.5.6. Функции для работы с датой .................................... 17
2.5.7. Логическая функция ............................................ 18
2.5.8. Функция преобразования названия в код по словарику БД ......... 18
2.5.9. Функции преобразования строки в число ......................... 18
2.5.10. Функции округления числа ................................... 19
2.5.11. Другие арифметические функции .............................. 19
2.6. Дополнительные возможности ........................................ 19
2.6.1. Конструкция _Для: циклы и рекурсия ............................ 19
2.6.2. Уточнители: операции над строчками групп ...................... 20
3. СРЕДА ФОРМИРОВАНИЯ И ВЫПОЛНЕНИЯ ЗАПРОСОВ ....................... 21
3.1. Программный интерфейс (API) сервера языка запросов ................ 21
3.2. Объектно-ориентированный (COM) программный интерфейс сервера языка
запросов ............................................................... 25
3.3. Редактор запросов ................................................. 27
3.3.1. Формирование запросов ......................................... 27
3.3.2. Макросы ....................................................... 28
4. ПРИЛОЖЕНИЕ. Синтаксис языка запросов ........................... 29
4

1. ОБЩИЕ СВЕДЕНИЯ
СУБД "МикроПоиск" автоматизирует построения проблемно-
ориентированных систем обработки данных для научных и инженерных
приложений. Инструментальный характер "МикроПоиска" означает наличие
в нем штатных средств проектирования и ведения реляционно-сетевых
БД, поддержки программирования и генерации приложений БД,
ориентированных на различные категории пользователей.
Инструментарий базового языка программирования основан на Си и
включает две группы штатных средств СУБД "МикроПоиск": сервер языка
запросов MPQL и средства пользовательского интерфейса MPQL (редактор
запросов и генератор запросов). API сервера языка запросов реализует
интерфейс с прикладными БД для программ на разных языках
программирования. Он обеспечивает обмен данными с СУБД через массивы
структур, что удобно для таких языков, как Си, C++, Pascal/Delphy,
Фортран. ООСП являются COM-надстройкой над API сервера языка
запросов. ООСП состоят из аналогичного Recordset ADO объекта
Recordset, содержащего коллекцию Fields объектов Field. ООСП
обеспечивают автоматизацию и сокрытие операций загрузки данных и
работы с сервером языка запросов MPQL из языков программирования
Visual Basic/VBA/ VBScript, C#, Java, JavaScript.
Модель данных реляционно-сетевой СУБД "МикроПоиск" основана на
модели Чена "сущность-связь" (ER-модели). В СУБД "МикроПоиск"
интенсионал (схема БД) представляется графом, вершинам которого
соответствуют классы объектов (сущностей), а ребрам - классы
бинарных связей между объектами. Элементарные атрибуты объектов
соответствуют основным типам данных языка Си. Поименованная
совокупность элементарных атрибутов может составлять повторяющуюся
группу. Кроме того, допускаются атрибуты содержащие тексты
произвольной длины.

1.1. Спецификация данных


Структуры данных специфицируются на языке описания данных
(DataBase Description, DBD) с двумя основными конструкциями:
ОБЪЕКТ <имя> { <атрибут> [ <атрибут>] ... };
<атрибут> ::= <элемент> | <группа> | <массив> | <текст>
<группа> ::= ГРУППА <имя> {<элемент> [ <элемент> ] ... };
<текст> ::= ТЕКСТ <имя> ;
<элемент> ::= <char> | <int> | <long> | <float> | <double>
<char> ::= char <имя> [ <длина> ] <формат>;
<int> ::= int <имя> <формат> ;
<long> ::= long <имя> <формат> ;
<float> ::= float <имя> <формат> ;
<double> ::= double <имя> <формат> ;
<длина> ::= <целое>
<формат> ::= <формат языка Си>
СВЯЗЬ <имя> = { [ <роль> / ] <имя-объекта> :
[ <роль> / ] <имя-объекта> }
ТИП <тип соотвествия> ;
<тип соотвествия> ::= 1:1 | 1:N | N:1 | N:M
Роль необходима для задания "циклических" связей между
экземплярами одного класса объектов.
Тип соответствия задает возможные отношения между связываемыми
экземплярами объектов. 1:1 - связь "один с одним", например, связь
между объектами Человек с ролями Муж и Жена. 1:N - связь "один с
несколькими", например, связь между объектами Человек с ролями Мать
5

и Ребенок. N:M - связь "несколько с несколькими", например, связь


между объектами Человек с ролями Продавец и Покупатель.

1.2. Пример схемы прикладной БД


Для иллюстрации средств программирования рассмотрим следующий
пример схемы БД. Объект Преподаватель имеет два атрибута ФИО и
зарплата; объект Студент - 6 атрибутов - ФИО, факультет, Группа,
Курс, СредОценка, предметы; в свою очередь, атрибут предметы
групповой и имеет три атрибута - название, дата сдачи и оценка.
Объект Дисциплина имеет два атрибута - название и ведущая кафедра.
Предусмотрены также 4 связи: Обучает между Преподаватель и Студент;
Изучает между Студент и Дисциплина; Ведет между Преподаватель и
Дисциплина; Руководит между двумя объектами Преподаватель с ролями
Старш и Подчин. Ha языке DBD эта схема описывается так:

ОБЪЕКТ Преподаватель {
char ФИО [40] %-40s ;
float зарплата %9.2f ;
};
ОБЪЕКТ Студент {
char ФИО [40] %-40s ;
char факультет [20] %-20s ;
int Группа %-3d;
int Курс %1d;
float Стипендия %6.2f;
float СредОценка %3.1f;
ГРУППА предметы {
char название [40] %-40s ;
char дата_сдачи [14] %-14s ;
int оценка %1d ;
};
};
ОБЪЕКТ Дисциплина {
char название [40] %-40s ;
char ведущая_кафедра [40] %-40s ;
};
СВЯЗЬ Обучает { Преподаватель : Студент } тип 1:N ;
СВЯЗЬ Ведет { Преподаватель : Дисциплина } тип N:M ;
СВЯЗЬ Руководит { Старш / Преподаватель : Подчин /
Преподаватель } тип 1:N ;

2. 2 ЯЗЫК ЗАПРОСОВ MPQL


Запрос есть непустая последовательность операторов, разделенных
символом ';'. Каждый оператор формирует множество однотипных
сущностей. Допускаются вложенные операторы.
Пользователю разрешается присваивать множествам имена и
использовать имена в последующих операторах запроса, что упрощает
его понимание, а также в большинстве случаев ускоряет обработку.
Строковые константы указываются в одиночных или двойных
кавычках. Допустимо включение в них кавычек другого типа.
"Это - 'правильная строковая константа'"
'и "это" тоже правильно.'
В любом месте запроса, кроме строковых констант, можно вставить
комментарий, который будет проигнорирован при обработке запроса.
Вложенные комментарии недопустимы.
/* комментарий игнорируется */
6

/* /* /* ошибка */
Пробелы, символы новой строки, перевода каретки и табуляции (а
также другие символы в ANSI-кодировке от 1 до 32) также
игнорируются, если они не находятся внутри строковых констант.

2.1. Непосредственный отбор множества


Операторы этой группы позволяют непосредственно сформировать
множества всех сущностей данного типа, а также их подмножества:
1) по дескриптору экземпляра; например, для запроса
Ст123 = Студент[1, 2, 3];
результат - множество из трех студентов, если в БД есть
сущности с такими дескрипторами;
2) по значению заданного атрибута; например, для запроса
Дисциплина:название['математика', 'физика'];
результат есть множество дисциплин с названиями 'физика' или
'математика';
3) по логическому условию, наложенному на элементарные
атрибуты; например, для запроса
A = Преподаватель { зарплата < 1 000 000 &
(ФИО > 'Иванов' | ФИО > 'Петр') };
результат - множество преподавателей, зарплата которых меньше
миллиона и ФИО содержит одну из указанных подстрок (например, Иванов
С.Н., Петров К.Е., Петренко К.П. и т.п.);
4) по участию в связи в заданной роли; например,
B = Преподаватель { зарплата < 1 000 000 & Ведет |
Руководит.Старш };
Результат - множество преподавателей, зарплата которых меньше
миллиона ведущих любые дисциплины, а также преподавателей,
руководящих другими.

2.1.1. Отбор по перечислению


Формат:
Obj
или
Obj [ N1, N2,... Nn]
или
Obj : Atr [ V1,V2,...Vm ]
Параметры:
Obj - название типа объекта (возможные значения определяются
схемой);
N1,N2,...Nn - дискрипторы отбираемых экземпляров объекта Obj;
Atr - название ключевого атрибута объекта Obj; V1,V2,...Vm -
значения атрибута Atr отбираемых объектов типа Obj.
Возвращаемое значение: множество перечисленных экземпляров
объекта Obj.
Примечание: Если [] отсутствуют, множество содержит все
экземпляры объекта Obj.
Пример:
Студент; /* все студенты */
Студент [1,2,3];
Студент: номер [297,298,299];
Студент: фамилия["Иванов","Петров"];

2.1.2. Отбор по логическому условию


Формат:
_Отбор ( Set, Cond )
7

или
_SELECT ( Set, Cond )
или
Set{ Cond }
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Cond - условие - логическое выражение над атрибутами объекта и
константами.
В условии можно использовать:
1) логические операции & (и, конъюнкция), |(или, дизъюнкция)
!(не, отрицание);
2) операции отношения <, <= (меньше или равно), >, >= (больше
или равно), =, != (не равно);
3) арифметические выражения с числовыми атрибутами и
константами.
В арифметических выражениях допустимы операции +, -, *
(умножить), / (делить), ^ (возвести в степень) и встроенные
арифметические функции.
MPQL включает следующие классы встроенных арифметических
функций.
Математические функции: _abs (модуль числа), _sqrt (квадратный
корень), _exp (экспонента), _ln (натуральный логарифм), _log10
(десятичный логарифм), _sin (синус), _cos (косинус), _tg (тангенс),
_arcsin (арксинус), _arccos (арккосинус), _arctg (арктангенс),
_round (округление до ближайшего целого числа или числа с указанной
точностью), _floor (округление до ближайшего снизу целого числа или
числа с указанной точностью), _ceil (округление до ближайшего сверху
целого числа или числа с указанной точностью).
Логическая функция _bool возвращает 1, если условие, являющееся
ее аргументом, истинно, и 0, если оно ложно.
Функции преобразования строк:
1) _atof – преобразует строковое представление числа в
действительное число;
2) _atoi – преобразует строковое представление числа в целое
число;
3) _код – преобразует имя в код согласно словарику базы.
Функции агрегации:
1) _min, _Минимум - минимум значения атрибута;
2) _max, _Максимум - максимум значения атрибута;
3) _sum, _Сумма - сумма значений атрибутов;
4) _average, _Среднее - среднее арифметическое значений
атрибутов;
5) _cnt, _Количество - количество экземпляров множества или
кортежей в группе.
Функции работы с датами:
1) _date, _Дата - вычисление даты;
2) _day, _День - вычисление дня месяца;
3) _month, _Месяц - вычисление месяца;
4) _year, _Год - вычисление года.
ПРИМЕЧАНИЯ
1. Для строковых атрибутов выражения A<B, A<=B, B>A и B>=A
имеют смысл "A входит в B в качестве подстроки".
2. Для элементов группы отношения имеют неявный предикат
существования. Например, Group.Elem < 5 принимает значение "Истина"
8

если среди кортежей группы Group есть хотя бы 1, для которого


значение атрибута Elem < 5.
3. Если с одной стороны от оператора отношения стоит строковый
атрибут, с другой стороны обязательно должна стоять константа.
4. Более подробные описания арифметических функций и функций
работы с датами см. в разделе 2.5.
Возвращаемое значение: множество, которое является
подмножеством множества Set и каждый экземпляр которого
удовлетворяет условию Cond.
Примеры:
_Отбор(Студент,Курс=5); _
SELECT(Студент,Курс=5);
U=_Отбор(Студент, ФИО > "Ива");
U=_Отбор(U,предмет.оценка > 4.5 );
Студунт{ Группа=150 };

2.1.3. Отбор в диалоге


Формат:
_Указать ( Set, Texts)
или
_Указать1 ( Set, Texts)
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Texts – один или несколько компонентов строки описания объекта,
которая будет выводиться в список для каждого объекта. Компонент
может быть либо текстовой константой в кавычках, либо названием
одного из атрибутов объекта Set, либо вычисляемым выражением,
построенным по правилам, описанным в предыдущем разделе.
Вариант _Указать1 позволяет выбрать ровно один из объектов
Set. Вариант _Указать позволяет выбрать несколько объектов, или ни
одного.
Во время выполнения функций отбора в диалоге сервер запросов
выдаст на экран диалог со списком строк, соответствующих объектам,
для выбора.
Примеры:
А = _Указать1(Преподаватель, ФИО);
С = _Указать(Студент, "Студент ", ФИО, " гр. ", Группа);
ПРИМЕЧАНИЯ
1. Если среди компонентов строки нет описания объекта нет ни
одной текстовой константы, между значениями перечисленных атрибутов
будут автоматически вставлены разделители " : ".
2. Значения атрибутов, которым сопоставлены словарные статьи,
выводятся в виде названий а не чисел. Чтобы вывести атрибут как
число, перед его именем нужно поставить знак "=".

2.2. Операции над множествами


Над множествами однотипных сущностей определены стандартные
теоретико-множественные операции объединения, пересечения,
дополнения и разности, а также переход по связи в направлении
заданной роли. Например, для запроса
ПП = Преподаватель / Руководит.Подчин;
ПЗ = Преподаватель { зарплата < 2 * _Минимум ( ПП, зарплата )
};
ДИС = (ПП + ПЗ) / Ведет;
СТ = ДИС / Изучает;
9

П = ПП * ПЗ;
результат составляют множества: ПП - преподаватели-подчиненные;
ПЗ - преподаватели, зарплата которых меньше удвоенной минимальной
зарплаты преподавателей из ПП; ДИС - дисциплины, которые ведут
преподаватели из множеств ПП или ПЗ; СТ - студенты, изучающие
дисциплины из ДИС; П - пересечение множеств ПП и ПЗ.
Символ '/' обозначает переход по связи. Необходимо указать роль
связи Руководит. Для связей Ведет и Изучает интерпретатор
автоматически определяет направление перехода по типу исходного
множества. Символ '*' во втором операторе обозначает умножение
чисел, а в последнем - пересечение множеств. Символ ';' в конце
запроса необязателен.

2.2.1. Переход по связи


Формат:
_Переход ( Set , Link )
или
_Переход ( Set , Link.Role )
или
_JOIN ( Set , Link )
или
_JOIN ( Set , Link.Role )
или
Set / Link
или
Set / Link.Role
Параметры:
Set - множество, в том числе, задаваемое выражением языка
запросов;
Link - имя связи;
Role - имя роли.
Примечание: все имена, кроме первого, берутся из схемы БД.
Возвращаемое значение: множество экземпляров объекта, имеющих
связь Link с экземплярами объекта множества Set и играющих данную
роль Role (если она указана) в этой связи .
Примеры:
_Переход ( Студент[297,298,299], Изучает);

2.2.2. Проекция по роли в связи


Эта функция - частный случай функции _Отбор ().
Формат:
_Проекция ( Set , Link )
или
_Проекция ( Set , Link.Role ).
или
_PROJ ( Set , Link )
или
_PROJ ( Set , Link.Role ).
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Link - имя связи, определяется схемой БД;
Role - имя роли, определяется схемой БД.
Возвращаемое значение: подмножество экземпляров объекта
множества Set, связанных связью Link и (если указана роль) играющих
роль Role в этой связи.
10

Примеры:
_Проекция(Преподаватель,Руководить);
/*выбирает преподавателей, имеющих подчиненных */

2.2.3. Tеоретико-множественные операции


1) Дополнение множества Set1
Формат:
! Set1
2) Пересечение множеств Set1 и Set2
Формат:
Set1 * Set2
3) Объединение множеств Set1 и Set2
Формат:
Set1 + Set2
4) Дополнение множества Set2 до Set1 (разность)
Формат:
Set1 - Set2
5) Создать множество Set1 тождественное множеству Set2
Формат:
Set1 = Set2
Параметры:
Set1, Set2 - множества или выражения над множествами; допустимы
скобки и функции. Операторы указаны в порядке убывания приоритета.

2.3. Операции изменения данных


Эта группа включает следующие операции:
1) присваивание заданным атрибутам указанных значений, которые
могут быть арифметическими выражениями и зависеть от данных,
например,
_Присвоить( Студент[13], факультет = 'кибернетика',
ФИО = 'Карамазов А.А.') ;
в результате 13-й студент получит фамилию "Карамазов" и будет
установлено, что он студент факультета кибернетики;
_Присвоить( _Проекция (Преподаватель, Ведет),
зарплата = 1.2 * зарплата );
в результате зарплата преподавателей, которые ведут занятия
будет увеличена на 20%;
2) создание множества сущностей указанного типа с добавлением
их в БД:
НовСтуд = _Создать ( Студент, 2);
в результате в БД будут созданы 2 новых объекта Студент, они
заносятся во множество НовСтуд;
3) удаление сущностей указанного множества из БД:
_Удалить(Студент[13]);
4) установление между элементами множеств заданных связей и их
уничтожение:
_Связать ( НовСтуд, Дисциплина, Изучает) ;
_Разорвать (НовСтуд,Дисциплина: название [ 'география' ],
Изучает) ;
в результате связь Изучает будет установлена со всеми
дисциплинами, кроме географии.

2.3.1. Присвоение значений атрибутам объекта


Формат:
_Присвоить(Set,Atr1=Value1,Atr2=Value2,...,AtrN=ValueN)
11

или
_SET(Set,Atr1=Value1,Atr2=Value2,...,AtrN=ValueN)
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Atr1,Atr2,...AtrN - название атрибутов объекта (заданы в схеме
БД);
Value1,Value2,...ValueN - присваиваемые значения (должны
соответствовать типу атрибута).
Возвращаемое значение: множество экземпляров объекта,
эквивалентное множеству Set, но значения атрибутов которого изменено
в соответствии с заданными в функции значениями.
Примеры:
_Присвоить( A, Зарплата=500.0, ФИО="Иванов И.И." );

2.3.2. Создание объектов в БД


Формат:
_Создать ( Obj, Number ).
Параметры:
Obj - название класса объекта, экземпляр которого неоходимо
создать (возможные значения определяются схемой);
Number - количество экземпляров объекта, которое необходимо
создать.
Возвращаемое значение: Создается Number экземпляров указанного
класса и возвращается множество из Number элементов.
Пример:
_Создать ( Студент, 10 ).

2.3.3. Удаление объектов из БД


Удаляются все экземпляры объекта, включенные в указанное
множество.
Формат:
_Удалить ( Set )
или
_DELETE ( Set )
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов.
Возвращаемое значение: пустое множество.
Примеры:
A=_Отбор(Студент, Курс=5); _Удалить(A);
/* исключить из БД всех студентов, закончивших институт */

2.3.4. Создание связей между объектами


Создаются связи указанного класса между элементами двух
множеств (если связь типа "петля", указывается роль объектов из
первого множества).
Формат:
_Связать (Set1 , Set2 , Link )
или
_Связать ( Set1 , Set2 , Link.Role )
или
_LINK (Set1 , Set2 , Link )
или
_LINK ( Set1 , Set2 , Link.Role )
12

Параметры:
Set1,Set2 - множества, в том числе - задаваемые выражениями
языка запросов;
Link - имя связи, которую необходимо создать (должно быть
описано в схеме БД);
Role - имя роли объектов из первого множества (задано в схеме
БД).
Возвращаемое значение: подмножество объектов Set1, для которых
установлены связи.
Примечание:
1) если связь типа 1:1, то каждый элемент Set1 связывается с
одним соответствующим элементом множества Set2;
2) если связь типа 1:N, то каждый элемент множества Set1
связывается со всеми элементами множества Set2;
3) если связь типа M:N, то все элементы множества Set1
связываются со всеми элементами множества Set2.
Примеры:
A=_Отбор(Студент, Группа= 148);
B=_Отбор(Преподаватель, ФИО="Иванов И.И.");
_Связать (B,A, Преподает);
/* Иванов И.И. начинает преподавать у студентов группы 148 */

2.3.5. Уничтожение экземпляров связей в БД


Уничтожаются связи указанного класса между элементами двух
множеств.
Формат:
_Разорвать ( Set1 , Set2 , Link )
или
_Разорвать( Set1 , Set2 , Link.Role )
или
_UNLINK ( Set1 , Set2 , Link )
или
_UNLINK ( Set1 , Set2 , Link.Role )
Параметры:
Set1, Set2 - множества, в том числе - задаваемые выражениями
языка запросов;
Link - имя связи, которую необходимо разорвать (должно быть
описано в схеме БД);
Role - имя роли (задано в схеме БД). Возвращаемое значение:
первое множество.
Примеры:
A=_Отбор(Студент, Группа= 148);
B=_Отбор(Преподаватель, ФИО="Иванов И.И.");
_Разорвать(B,A, Преподает);
/*Иванов И.И. закончил курс лекций*/

2.4. Ввод/вывод данных


При визуализации множества предусмотрена возможность сортировки
его элементов по значению указанного атрибута в возрастающем или
убывающем порядке;
_Таблица ( _Сортировка ( <множество>,
<плюс или минус> <атрибут> ) ),
а также отображение в виде таблицы с явным указанием того,
какие атрибуты и в каком порядке следует отображать (если список
атрибутов отсутствует, отображаются все атрибуты). Редактирование
элементов таблицы влечет соответствующее изменение данных в БД.
13

2.4.1. Спецификация таблицы


Формирует таблицу для отображения на экране или ввода/вывода
данных БД. Строки таблицы соответствуют экземплярам объектов
указанного множества (или кортежам групп), а столбцы - атрибутам.
Формат:
_Таблица ( Set , Atr1 , Atr2 , ... , AtrN )
или
_Таблица ( Set )
или
_TABLE ( Set , Atr1 , Atr2 , ... , AtrN )
или
_TABLE ( Set )
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Atr1 , Atr2 , ... , AtrN - имена атрибутов данного объекта
(заданы в схеме БД) или символ # (дескриптор экземпляра).
Возвращаемое значение: нет.
ПРИМЕЧАНИЯ:
1. Оператор _Таблица прекращает выполнение запроса, поэтому он
должен быть последним.
2. Если указан только один параметр (множество экземпляров
одного объекта), будет сформирована таблица, столбцы которой - все
атрибуты этого объекта.
3. Возможный набор атрибутов и интерпретация оператора зависят
от способа выполнения запроса:
а) в редакторе запросов оператор _Таблица может содержать в
качестве параметров только атрибуты объекта, включая текстовые и
групповые. Символ # игнорируется. Выполнение этого оператора
приводит к созданию окна видеоформой для редактирования
специфицированной таблицы;
б) в mpListQuery _Таблица может содержать в качестве параметров
атрибуты объекта и его групп; символ # игнорируется;
в) в mpTableQuery _Таблица может содержать в качестве
параметров:
- элементарные атрибуты объекта и одной из его групп (в формате
Group.Atr) и символ # (формируется сводная таблица, в которой
атрибуты объекта дублируются в строчках, соответствующих кортежам
групп);
- текстовый атрибут (формируется сплошной текст).
Примеры:
_Таблица (Студент, #, ФИО, Курс, Группа, СредОценка);
_Таблица (Студент, ФИО,предмет.название, предмет.оценка);

2.4.2. Упорядочение множества


Формат:
_Сортировка ( Set , Atr Sign )
Параметры:
Set - множество, в том числе, задаваемое выражением языка
запросов;
Atr - название атрибута объекта, по которому осуществляется
упорядочение (атрибут может быть числовой или строковый);
Sign - имеет два значения: "+" (по умолчанию, значит - в
порядке возрастания) или "-" (в порядке убывания).
14

Возвращаемое значение: отсортированное множество эквивалентное


заданному, экземпляры объектов расположены по возрастанию или
убыванию (в зависимости от Sign) значения атрибута Atr.
Примечание:
В случае строкового атрибута возрастание или убывание
определяется положением символа в таблице кодов ANSI (в случае
совпадения первого символа проверяется второй и т.д.).
Примеры:
x = _Сортировка(Студент, СредОценка);
y = _Сортировка(Студент, СредОценка+);
/* последовательности x и y совпадают */

2.4.3. Отбор с учетом порядка


Формат:
_1e ( Set, Number )
или
_FIRST ( Set, Number )
Параметры:
Set - множество, в том числе, задаваемое выражением языка
запросов;
Number - количество отбираемых элементов.
Возвращаемое значение: возвращает множество из Number первых
элементов множества Set.
Пример:
A=_Сортировка(Студент, СредОценка-);
_1e (A,10)
/*выбираются десять наиболее успевающих студентов*/

2.5. Арифметические функции


Функции из этого набора применяются только в арифметических
выражениях. Они возвращают не множество объектов, а число.

2.5.1. Функция вычисления минимума


Формат:
_Минимум ( Set , Atr )
или
_Минимум ( Group.Atr )
или
_Минимум ( Set , Group.Atr )
или
_Min ( Set , Atr )
или
_Min ( Group.Atr )
или
_Min ( Set , Group.Atr )
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Group - имя группового атрибута (задано в схеме БД);
Atr- имя числового атрибута группы (если стоит после точки) или
объекта (задано в схеме БД).
Возвращаемое значение: возвращает минимальное значение
указанного атрибута на множестве Set или в группе Group.
Примеры:
_Отбор(Студент, СредОценка =_Минимум (A, СредОценка));
15

/*наихудший студент*/

2.5.2. Функция вычисления максимума


Формат:
_Максимум ( Set , Atr )
или
_Максимум ( Group.Atr )
или
_Максимум ( Set , Group.Atr )
или
_Max ( Set , Atr )
или
_Max ( Group.Atr )
или
_Max ( Set , Group.Atr )
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Group - имя группового атрибута (задано в схеме БД);
Atr - имя числового атрибута группы (если стоит после точки)
или объекта (задано в схеме БД).
Возвращаемое значение: возвращает максимальное значение
указанного атрибута на множестве Set или в группе Group.
Примеры:
_Отбор(Студент, СредОценка =_Максимум (A, СредОценка));
/*наилучший студент*/

2.5.3. Функция вычисления среднего


арифметического
Формат:
_Среднее ( Set , Atr )
или
_Среднее ( Group.Atr )
или
_Среднее ( Set , Group.Atr )
или
_average ( Set , Atr )
или
_average ( Group.Atr )
или
_average ( Set , Group.Atr )
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Group - имя группового атрибута (задано в схеме БД);
Atr - имя числового атрибута группы (если стоит после точки)
или объекта (задано в схеме БД).
Возвращаемое значение: возвращает среднне арифметическое
значений указанного атрибута на множестве Set или в группе Group.
Пример:
A = Студент:ФИО ["Иванов А.И."];
_Присвоить(A, СредОценка = _Среднее (A,предмет.оценка) );
/* вычислить средний балл студента Иванова */
16

2.5.4. Функция вычисления суммы числовых


атрибутов
Формат:
_Сумма ( Set , Atr )
или
_Сумма ( Group.Atr )
или
_Сумма ( Set , Group.Atr )
или
_Sum ( Set , Atr )
или
_Sum ( Group.Atr )
или
_Sum ( Set , Group.Atr )
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Group - имя группового атрибута (задано в схеме БД);
Atr - имя числового атрибута группы (если стоит после точки)
или объекта (задано в схеме БД).
Возвращаемое значение: возвращает сумму значений указанного
атрибута на множестве Set или в группе Group.
Примеры:
A = Студент:ФИО ["Иванов А.И."];
_Присвоить(A, СредОценка =
_Сумма (A,предмет.оценка)/_Количество(A,предмет));
/* вычислить средний балл студента Иванова */

2.5.5. Функция вычисления количества элементов


Формат:
_Количество ( Set )
или
_Количество ( Group )
или
_Количество ( Set , Group )
или
_Count ( Set )
или
_Count ( Group )
или
_Count ( Set , Group )
Параметры:
Set - множество, в том числе - задаваемое выражением языка
запросов;
Group - имя группового атрибута (задано в схеме БД).
Возвращаемое значение: Возвращает количество:
- экземпляров объектов множества Set, если в качестве параметра
Set;
- кортежей группы Group, если в качестве параметра Group;
- кортежей группы Group во всех экземплярах объектов множества
Set в сумме, если у функции два параметра.
Пример:
_Количество(_Отбор(Студент, Группа= 148));
/* количество студентов в группе */
17

2.5.6. Функции для работы с датой


Формат:
Указанная дата:
_Дата ( дд.мм.гггг )
или
_date ( дд.мм.гггг )
Указанная дата текущего века:
_Дата ( дд.мм.гг )
или
_date ( дд.мм.гг )
Указанная дата текущего года:
_Дата ( дд.мм )
или
_date ( дд.мм )
Указанная дата текущего месяца:
_Дата ( дд )
или
_date ( дд )
Текущая дата:
_Дата ( )
или
_date ( )
Параметры:
дд - день месяца;
мм - номер месяца (с 1);
гггг - год.
Формат:
День из значения даты в указанном атрибуте:
_День ( Atr )
или
_day ( Atr )
Текущий день месяца:
_День ( )
или
_day ( )
Параметры:
Atr - имя атрибута.
Формат:
Месяц из значения даты в указанном атрибуте:
_Месяц ( Atr )
или
_month ( Atr )
Текущий месяц:
_Месяц ( )
или
_month ( )
Параметры:
Atr - имя атрибута.
Формат:
Год из значения даты в указанном атрибуте:
_Год ( Atr )
или
_year ( Atr )
Текущий год:
_Год ( )
или
18

_year ( )
Параметры:
Atr - имя атрибута.
Пример:
_Отбор(Студент, _День(Дата_рождения)=_День()
& _Месяц(Дата_рождения)=_Месяц() );
/* Отобрать всех студентов-именинников */

2.5.7. Логическая функция


Формат:
_bool ( Cond )
Параметры:
Cond – логическое условие над атрибутами текущего объекта или
кортежа группы.
Возвращаемое значение: Возвращает 1, если условие, являющееся
ее аргументом, истинно, и 0, если оно ложно.
Пример:
_Присвоить(Студент, Стипендия = (1-_bool(предметы.оценка<4)
*(100+_bool(СредОценка=5)*50) );
/* стипендия начисляется только студентам, не имеющим троек,
отличники получают повышенную стипендию – 150 вместо 100. */

2.5.8. Функция преобразования названия в код по


словарику БД
Формат:
_код ( Obj.Atr, Str )
или
_код (Obj.Group.Elem, Str )
или
_code (Obj.Atr, Str )
или
_code (Obj.Group.Elem, Str )
Параметры:
Obj – название объекта,
Atr – название скалярного атрибута объекта Obj,
Group – название группы или массива объекта Obj,
Elem – название элемента группы или массива Group,
Str – строка с названием кода согласно словарику.
Возвращаемое значение: число, соответствующее названию, или 0.
Пример:
_код(Студент.предметы.оценка, "хорошо");
/* возвращает 4 */

2.5.9. Функции преобразования строки в число


Формат:
_atoi ( Str )
или
_atof ( Str )
Параметры:
Str – строка с текстовым представлением числа.
Возвращаемое значение: число, соответствующее строке, или 0
(для _atoi – обязательно целое число).
Пример:
_atof("4.2e-002");
/* возвращает 0.042 */
19

2.5.10. Функции округления числа


Формат:
_round ( Val )
или
_round ( Val, Den )
или
_floor ( Val )
или
_floor ( Val, Den )
или
_ceil ( Val )
или
_ceil ( Val, Den )
Параметры:
Val – вычисляемое выражение над атрибутами текущего объекта или
кортежа группы,
Den – число, задающее шаг округления (по умолчанию Den=1 –
округление к целому).
Возвращаемое значение: результат округления Val (для _round –
ближайшее подходящее число, для _floor – ближайшее, не превосходящее
Val, для _ceil – ближайшее, не меньше, чем Val).
Пример:
_round (4.24, 0.2) /* возвращает 4.2 */
_floor (4.24, 0.2) /* возвращает 4.2 */
_ceil (4.24, 0.2) /* возвращает 4.4 */
_round (4.31, 0.2) /* возвращает 4.4 */

2.5.11. Другие арифметические функции


Формат:
Function ( Val )
Параметры:
Function - Одна из функций _abs (модуль числа), _sqrt
(квадратный корень), _exp (экспонента), _ln (натуральный логарифм),
_log10 (десятичный логарифм), _sin (синус), _cos (косинус), _tg
(тангенс), _arcsin (арксинус), _arccos (арккосинус), _arctg
(арктангенс).
Val – вычисляемое выражение над атрибутами текущего объекта или
кортежа группы.

2.6. Дополнительные возможности

2.6.1. Конструкция _Для: циклы и рекурсия


Конструкция _Для позволяет выполнять последовательность
операторов по очереди для всех элементов некоторого поименованного
множества объектов. При этом внутри конструкции _Для можно
использовать специальное множество, состоящее только из текущего
элемента. Имя этого множества получается путем присоединения знака
'#' слева к имени множества по которому осуществляется цикл. Внутри
конструкции _Для допускаются вложенные конструкции _Для (вложенные
циклы). Множество по которому выполняется цикл может изменяться
внутри цикла, что позволяет строить рекурсивные множества.
Формат:
_Для ( Set ) {
20

Оператор1; Оператор2; ... ОператорN; }


Параметры:
Set - поименованное множество (Имя или Имя = оператор);
Оператор1, Оператор2, ... ОператорN - произвольные операторы
языка запросов.
Пример:
_Для ( Подч = Сотрудник:ФИО['Иванов П.С.']
/ Субординация.подчиненный ) {
Тек = #Подч / Субординация.подчиненный;
Подч = Подч + (Тек - Подч);
}
_Таблица (Подч, ФИО);
/* Получить фамилии всех подчиненных Иванова П.С. Второй
оператор внутри конструкции _Для обеспечивает однократное включение
совместителей в искомое множество*/

2.6.2. Уточнители: операции над строчками групп


Уточнители предназначены для отбора строчек (кортежей)
группового атрибута при выполнении следующих функций:
_Присвоить (определяет, в каких кортежах группы будут
установлены новые значения указанных элементов);
_Удалить (определяет, какие кортежи группы будут удалены при
выполнении удаления группы);
_Минимум, _Максимум, _Количество, _Среднее (специфицирует
множество кортежей для вычисления требуемого значения);
_Таблица (определяет, какая группа и какие кортежи лягут в
основу формитуемой таблицы).
Формат:
Function ( Set :: Group.AtrExpression , Parameters )
или
Function ( Set :: Group.AtrExpression )
Параметры:
Function - Одна из функций, для которой используется уточнитель
(_Присвоить, _Удалить, _Минимум, _Максимум, _Среднее, _Количество,
_Таблица);
Set - множество, в том числе выражение; Group - название
группового атрибута объектов множества Set;
AtrExpression - условие, наложеное на элементы группы Group и
атрибуты объектов множества Set; может включать:
1. логические операции & (и, конъюнкция), |(или, дизъюнкция)
!(не, отрицание);
2. операции отношения <, <= (меньше или равно), >, >= (больше
или равно), =, != (не равно);
3. арифметические выражения с числовыми атрибутами и
константами.
В арифметических выражениях допустимы операции +, -, *
(умножить), / (делить) ), ^ (возвести в степень) и встроенные
арифметические функции за исключением функций агрегации:
Математические функции: _abs (модуль числа), _sqrt (квадратный
корень), _exp (экспонента), _ln (натуральный логарифм), _log10
(десятичный логарифм), _sin (синус), _cos (косинус), _tg (тангенс),
_arcsin (арксинус), _arccos (арккосинус), _arctg (арктангенс),
_round (округление до ближайшего целого числа или числа с указанной
точностью), _floor (округление до ближайшего снизу целого числа или
числа с указанной точностью), _ceil (округление до ближайшего сверху
целого числа или числа с указанной точностью).
21

Логическая функция _bool возвращает 1, если условие, являющееся


ее аргументом, истинно, и 0, если оно ложно.
Функции преобразования строк:
1) _atof – преобразует строковое представление числа в
действительное число;
2) _atoi – преобразует строковое представление числа в целое
число;
3) _код – преобразует имя в код согласно словарику базы.
Функции работы с датами:
1) _date, _Дата - вычисление даты;
2) _day, _День - вычисление дня месяца;
3) _month, _Месяц - вычисление месяца;
4) _year, _Год - вычисление года.
ПРИМЕЧАНИЕ:
AtrExpression может иметь два специальных значения: 0 (пустое
множество) и * (все строки).
В функции _Таблица допустимо использовать дополнительно функции
агрегации:
1) _min, _Минимум - минимум значения атрибута;
2) _max, _Максимум - максимум значения атрибута;
3) _sum, _Сумма - сумма значений атрибутов;
4) _average, _Среднее - среднее арифметическое значений
атрибутов;
5) _cnt, _Количество - количество экземпляров множества или
кортежей в группе.
Parameters - параметры соответствующей функции.

3. СРЕДА ФОРМИРОВАНИЯ И ВЫПОЛНЕНИЯ ЗАПРОСОВ


Версия СУБД "МикроПоиск" для MS Windows обеспечивает интерфейс
с прикладными БД через язык запросов для Windows-приложений,
написанных на языках Си/С++, Pascal/Delphi, Фортран и т.д.
Запросы интерпретируются и выполняются сервером языка запросов
(MPSERV32.DLL). Сервер обеспечивает как выборку, так и обновление
данных. Поддерживаются два способа изменения значений атрибутов
объектов: через функцию _Присвоить() и через загрузку данных их
массива согласно спецификации, установленной в функции _Таблица(). В
одном запросе могут комбинироваться оба эти способа.
Для редактирования, отладки и параметризованного выполнения
запросов предназначен редактор запросов (MPQUERY.EXE).

3.1. Программный интерфейс (API) сервера языка


запросов
Сервер языка запросов предоставляет пользователям несколько
импортируемых функций. Следующие три из них обеспечивают решение
большинства задач.
1. mpTableQuery32 - функция выполняет запрос для заданной БД и
извлекает из/заносит в БД данные согласно выходной таблице. Если
оператор _Таблица языка запросов содержит элементарные атрибуты
объекта, элементы одной из его групп, символ # и арифметические
выражения над ними, то обмен данными производится с массивом в виде
массива структур (записей) фиксированной длины. Если оператор
_Таблица языка запросов содержит текстовый атрибут (он должен быть
единственным), то формируется/загружается сплошной текст, причем
строки текстового атрибута одного экземпляра разделяются символом ВК
(13), а разные экземпляры - символом ПС (10). Функция mpTableQuery32
22

предоставляет возможность анализировать в программе формат выходной


таблицы. Если первый символ текста запроса '?', то в начало массива
обмена заносится спецификация выходной таблицы в следующем формате:
<количество столбцов> short int, 2 байта <массив дескрипторов
столбцов>.
Каждый дескриптор столбца представляет собой двухбайтовое целое
число. Если его значение -1, то соответствующий столбец содержит
номера экземпляров объектов (двухбайтовые целые числа). Если
значение дескриптора столбца -2, то соответствующий столбец содержит
результат вычисления выражения (double, восьмибайтовое число с
плавающей точкой). Если значение дескриптора столбца неотрицательно,
оно в точности равно дескриптору соответствующего атрибута и тип
значения может быть определен по схеме БД.
Возвращает: двухбайтовое целое число (0 - в случае успеха,
иначе - код ошибки).
Параметры:
1)lpszDDname - имя файла схемы БД, тип: LPCSTR (указатель на
массив байт, последний из которых равен 0);
2) lpszBDname - имя файла данных БД, тип: LPCSTR;
3) lpszQuery - текст запроса, тип: LPCSTR;
4) bToDB - флажок ввода/вывода, тип: WBOOL (двухбайтовое целое
число). Возможные значения: TRUE (не 0) - запись из массива в БД,
FALSE (0) - чтение из БД в массив;
5) lpnDataLen - указатель на четырехбайтовое целое число или
NULL. При вызове функции это число должно содержать объем массива
обмена в байтах (если значение <0, массив не проверяется на
переполнение). После выполнения функции это число равно фактическому
объему прочитанных/записанных данных в байтах;
6) lpDataBuf - указатель на массив обмена. Тип: BYTE*;
7) lpszErrorBuf - указатель на массив под текст сообщения об
ошибке (длиной не меньше 256 байт), или NULL. Тип: LPSTR.

2. mpGetScheme - функция аналогична mpTableQuery32, но вместо


заполнения массива данных формирует его описание (состав колонок,
количество строк) для последующего выделения памяти под буфер
обмена.
Возвращает: двухбайтовое целое число (0 - в случае успеха,
иначе - код ошибки).
Параметры:
1) lpszDDname - имя файла схемы БД, тип: LCPSTR (дальний
указатель на массив байт, последний из которых равен 0);
2) lpszBDname - имя файла данных БД, тип: LPCSTR;
3) lpszQuery - текст запроса, тип: LPCSTR;
4) lpnRowCnt - указатель на четырехбайтовое целое число или
NULL. После выполнения функции это число равно ожидаемому числу
строк. Тип: LONG*;
5) lpnAtrCnt - указатель на двухбайтовое целое число или NULL.
Содержит длину массива lphAtrs в элементах. После выполнения функции
это число фактическому числу элементов – дескрипторов столбцов. Тип:
SHORT*;
6) lphAtrs - указатель на массив дескрипторов столбцов,
двухбайтовых целых чисел, или NULL. Этот массив заполняется в
результате выполнения функции. Тип: SHORT*;
7) lpszErrorBuf - дальний указатель на массив под текст
сообщения об ошибке (длиной не меньше 256 байт), или NULL. Тип:
LPSTR.
23

3. mpSchemeToString - функция преобразует массив дескрипторов


колонок в текстовую строку названий колонок, разделенных запятыми.
Возвращает: двухбайтовое целое число (0 - в случае успеха,
иначе - код ошибки).
Параметры:
1) lpszDDname - имя файла схемы БД, тип: LPCSTR.
2) lpszBDname - имя файла данных БД, тип: LPCSTR;
3) nAtrCnt - двухбайтовое целое число, количество элементов в
массиве двухбайтовых дескрипторов атрибутов. Тип: SHORT;
4) lphAtrs - указатель на массив дескрипторов столбцов,
двухбайтовых целых чисел. Тип: SHORT*;
3) nBufLen - двухбайтовое целое число, длина текстового массива
под имена столбцов. Тип: SHORT;
8) lpszTextBuf - указатель на массив под текст имен столбцов.
Тип: LPSTR.
Функции сервера языка запросов "МикроПоиска" должны быть
подключены через библиотеку импорта (MPSERV32.LIB).
Прототипы функций для языка С++ находятся в файле MPSERVER.HPP
и имеют следующий вид:

#ifndef _INC_MPSERVER
#define _INC_MPSERVER

// mpServer.hpp
// - интерфейс с сервером языка запросов "МикроПоиска"
// ( MPSERV32.DLL )

/**********************************************************************

FUNCTION: mpTableQuery32 - функция выполняет запрос


для заданной БД и извлекает из/заносит в БД данные
согласно выходной форме.

RETURN: 0 - в случае успеха, иначе - код ошибки

**********************************************************************/

typedef short WBOOL;

struct HONE { short int Class; short int Ind; };

/**********************************************************************

FUNCTION: mpTableQuery32 - функция выполняет запрос для заданной БД


и извлекает из/заносит в БД данные согласно выходной
форме.

RETURN: 0 - в случае успеха, иначе - код ошибки

**********************************************************************/

extern "C" short WINAPI mpTableQuery32 (


LPCSTR lpszDDname, LPCSTR lpszBDname, LPCSTR lpszQuery,
WBOOL bToDB, /* TRUE - запись из массива в БД
FALSE - чтение из БД в
массив */
LONG *lpnDataLen, /* на входе - объем массива (<0 - не
проверяется),
на выходе - фактический объем данных,
NULL - не используется */
BYTE *lpDataBuf, /* массив под данные */
24

LPSTR lpszErrorBuf ); /* массив под текст ошибки ( длина>=256 ),


NULL - не заполнять */

/**********************************************************************

FUNCTION: mpTableQuery - функция выполняет запрос для заданной БД


и извлекает из/заносит в БД данные согласно выходной
форме.

RETURN: 0 - в случае успеха, иначе - код ошибки

**********************************************************************/

extern "C" short WINAPI mpTableQuery (


LPCSTR lpszDDname, LPCSTR lpszBDname, LPCSTR lpszQuery,
WBOOL bToDB, /* TRUE - запись из массива в БД
FALSE - чтение из БД в
массив */
short *lpnDataLen, /* на входе - объем массива (<0 - не
проверяется),
на выходе - фактический объем
данных,
NULL - не используется */
LPSTR lpDataBuf, /* массив под данные */
LPSTR lpszErrorBuf ); /* массив под текст ошибки ( длина>=256 ),
NULL - не заполнять */

/**********************************************************************

FUNCTION: mpGetScheme - функция выполняет запрос для заданной БД


и создает описание выходной формы, заполняя
результирующие
массивы дескрипторов.
Работает точно как mpTableQuery/mpTableQuery32.

RETURN: 0 - в случае успеха, иначе - код ошибки

**********************************************************************/

extern "C" short WINAPI mpGetScheme (


LPSTR lpszDDname, LPSTR lpszBDname, LPSTR lpszQuery,
short *lpnRowCnt, /* на выходе - реальная длина массива,
NULL - не заполнять */
short *lpnAtrCnt, /* на входе – макс. длина списка (<0 - не
проверяется),
на выходе - реальная длина списка,
NULL - не заполнять */
short *lphAtrs, /* список значащих атрибутов,
NULL - не заполнять */
LPSTR lpszErrorBuf ); /* массив под текст ошибки ( длина>=256 ),
NULL - не заполнять */

/**********************************************************************

FUNCTION: mpSchemeToString - функция преобразует список значащих


атрибутов, полученный в результате выполнения
mpGetScheme,
mpListQuery или mpTableQuery/mpTableQuery32, в
текстовый вид
(строку имен атрибутов заданной БД)

RETURN: 0 - в случае успеха, иначе - код ошибки

**********************************************************************/
25

extern "C" short WINAPI mpSchemeToString (


LPSTR lpszDDname,
short nAtrCnt, /* на входе - длина списка атрибутов */
short *lphAtrs, /* список значащих атрибутов */
short nBufLen, /* на входе - длина массива */
LPSTR lpszTextBuf ) ; /* массив под текст схемы/ошибки */

/*********************************************************************

FUNCTION: mpListQuery - функция выполняет запрос для заданной БД


и создает описание выходной формы, заполняя
результирующие
массивы дескрипторов.
Описание может не совпадать с таблицей mpTableQuery/
mpTableQuery32, так как mpListQuery рассматривает
групповые
атрибуты "как целое".

RETURN: 0 - в случае успеха, иначе - код ошибки

**********************************************************************/

extern "C" short WINAPI mpListQuery (


LPCSTR lpszDDname, LPCSTR lpszBDname, LPCSTR lpszQuery,
short *lpnOnesCnt, /* на входе – макс. длина массива (<0 - не
проверяется),
на выходе - реальная длина
массива,
NULL - не заполнять */
HONE *lphOnes, /* массив под дескрипторы объектов,
NULL - не заполнять */
short *lpnAtrCnt, /* на входе – макс. длина списка (<0 - не
проверяется),
на выходе - реальная длина
списка,
NULL - не заполнять */
short *lphAtrs, /* список значащих атрибутов,
NULL - не заполнять */
LPSTR lpszErrorBuf ); /* массив под текст ошибки ( длина>=256 ),
NULL - не заполнять */

///////////////////////////////////////////////////////////////////////////
/////////////////////
// служебные (для ускоренного обслуживания серии запросов с одной БД)
extern "C" short WINAPI mpLockDD ( LPSTR lpszDDname );
extern "C" short WINAPI mpUnlockDD ( );

#endif //_INC_MPSREVER

3.2. Объектно-ориентированный (COM) программный


интерфейс сервера языка запросов
Для работы с БД «МикроПоиска» из языков, в которых
использование объектов удобнее, чем массивов памяти (Visual
Basic/VBA/VBScript, C#, Java, JavaScript), разработан альтернативный
программный интерфейс сервера языка запросов в виде ActiveX-
библиотеки MPDO (MPDO.dll).
MPDO содержит единственный объект Recordset с коллекцией полей,
напоминающий Recordset ADO, и реализует 3 интерфейса: IRecordSet,
IFields, IField.
Создание объекта MPDO.Recordset демонстрирует следующий пример:
Dim myRecordset As Object
Set myRecordset = CreateObject("MPDO.Recordset")
26

Recordset реализует методы Open, Close, Requery, MoveFirst,


MoveNext, MovePreviouse, MoveLast, Move, включает свойства
RecordCount, BOF, EOF и коллекцию полей CurrentRecord.
Метод Open выполняет запрос и заполняет Recordset данными.
Возвращает: булевское значение VARIANT_BOOL (true - в случае
успеха, иначе false).
Параметры:
1) bsFileName - имя файла базы (строка, BSTR);
2) bsQuery - текст запроса MPQL (строка, BSTR);
3) nBufLen - размер внутреннего буфера в байтах
(четырехбайтовое целое, long). Используйте нулевое или
отрицательное значение для автоматического определения
размера.
Пример:
If Not myRecordset.Open("C:\MP\Test.mp", _
"_Таблица(Студент,ФИО,предмет.название,предмет.оценка)", -1) _
Then Exit Sub
Метод Requery (без параметров) повторно выполняет запрос и
заполняет Recordset новыми данными – текущим «снимком» БД.
Метод Close (без параметров) закрывает Recordset – удаляет из
памяти все данные.
Методы MoveFirst (перейти к первой записи), MoveNext (перейти
к следующей записи), MovePreviouse (перейти к предыдущей записи),
MoveLast (перейти к последней записи), и Move (перейти на Amount
записей вперед или назад; параметр Amount – четырехбайтовое целое,
знак «+» означает «к концу», «-» – «к началу») обеспечивают
пролистывание данных, т.е. движение между «строками».
Свойство BOF – булевское значение VARIANT_BOOL (true – в первой
записи, иначе false); только для чтения.
Свойство EOF – булевское значение VARIANT_BOOL (true – в
последней записи, иначе false); только для чтения.
Свойство RecordCount – количество записай (четырехбайтовое
целое, long); только для чтения.
Свойство CurrentRecord содержит коллекцию полей с элементами
типа Field.

Field включает свойства Name, Value, Text, DefinedSize,


ActualSize.
Свойство Name – имя колонки таблицы (строка, BSTR).
Свойство Value – значение соответствующей ячейки таблицы в
текущей записи (типизированная переменная, VARIANT).
Свойство Text – текстовое представление соответствующей ячейки
таблицы в текущей записи (строка, BSTR). В отличие от Value – не
содержит информации о типе, отформатировано. Для атрибутов и
элементов, связанных с разделами словарика, Text содержит название
кода, а Value – его числовое значение (например, Text="отлично",
Value=5).
Свойство DefinedSize – количество символов, зарезервированное
под текстовое представление колонки таблицы (четырехбайтовое целое,
long).
Свойство ActualSize – количество символов, занятое текстовым
представлением ячейки таблицы (четырехбайтовое целое, long).
Пример:
Dim curRec As Integer
Dim sTempName As String, sText As String
Dim dTempVal As Variant
Dim nLen As Integer, nActLen As Integer
27

myRecordset.MoveFirst
For curRec = 1 To myRecordset.RecordCount
For Each curField In myRecordset.CurrentRecord
sTempName = curField.Name
dTempVal = curField.Value
sText = curField.Text
nLen = curField.DefinedSize
nActLen = curField.ActualSize
Next
myRecordset.MoveNext
Next curRec

3.3. Редактор запросов


Запрос можно создать в любом текстовом редакторе, использующем
ANSI-кодировку. Для этого необходимо точно знать названия типов
сущностей их атрибутов, связей и их ролей, по крайней мере, тех, с
которыми предстоит работать. Желательно также знать, какие типы
сущностей связываются, к какому типу данных (числовому, строковому и
т.д.) относится атрибут, а также имена функций и типы их аргументов.
Эта информация может быть получена из описания схемы БД на языке
DBD.

3.3.1. Формирование запросов


Для удобного диалогового формирования запросов СУБД
"МикроПоиск" включает специальный редактор/интерпретатор запросов
MPQUERY.EXE. Эта программа осуществляет предварительную обработку
(макроподстановки), интерпретирует и выполняет запросы через сервер
языка запросов.
Информация, необходимая для формирования запроса, находится в
расположенных на экране списках, содержание которых соответствует
схеме БД:
- объекты (типы сущностей);
- атрибуты выбранного объекта;
- связи (с ролями), относящиеся к данному объекту;
- имена функций с выделенными полями для аргументов.
Объекты и связи расположены в лексикографическом порядке.
Связи, соединяющие объекты одного и того же класса, выделяются
указанием ролей. Атрибуты отсортированы по типам: числовые,
строковые, текстовые и групповые. Список функций разбит на следующие
части: формирование множеств, действия над множествами, действия над
связями и арифметические функции.
Выбранным объектом определяется не только содержание списков
атрибутов и связей. Поскольку каждая связь соединяет два (возможно,
совпадающих) типа сущностей, целесообразно определить, на какой тип
можно перейти по выбранной связи. Для этой цели предусмотрена кнопка
"Перейти по связи". При этом в списке объектов выделяется целевой
тип.
При изменении текущего объекта списки атрибутов и связей с
ролями обновляются автоматически.
Выделенные имена переносятся из списков в текст запроса по
нажатию кнопок или по двойному нажатию левой кнопки мыши на
требуемой строке.
Последнее исправление можно отменить по кнопке "Вернуть".
Интерпретатор запросов запускается по кнопке "Запрос". "Сохранить" -
28

записать запрос в файл, "Вставить текст" - вставить в текст запрос


из файла.
Запуск редактора запросов:
MPQUERY.EXE ФайлСхемы.DD ФайлБД.BD
Запуск запроса на выполнение:
MPQUERY.EXE ФайлСхемы.DD ФайлБД.BD ФайлЗапроса.ASK
[Параметры]

3.3.2. Макросы
Для многовариантного выполнения запросов, редактор запросов
СУБД "МикроПоиск" допускает использование в тексте запроса макросов.
Макрос - это любая последовательность букв, цифр, знаков вопроса "?"
и подчеркивания "_", непосредственно следующая за символом
макроподстановки "@". Встретив в тексте запроса макрос, обработчик
запросов требует от пользователя ввода значения макроса, а если
макрос является числом, пытается загрузить это значение из
соответствующего по номеру параметра командной строки, а затем,
подставив вместо всех макросов их значения выполняет запрос. Если
хотя бы за одним из макросов непосредственно следует знак "+",
запрос выполняется циклически. На каждом шаге цикла повторно
вводятся значения макросов, отмеченных знаком "+", причем, если
макрос является числом, каждый проход приводит к увеличению номера
соответствующего параметра на 1. Выход из цикла происходит по
исчерпанию параметров командной строки либо по отказу пользователя
от ввода очередного значения.
Примеры макросов:
@Чему_равна_максимальная_зарплата_в_крб?
/* обычный */
@ФИО_студента+
/* повторно вводится на каждом шаге цикла */
@4
/* четвертый параметр командной строки */
@5+
/*5-й,6-й,7-й,... параметр на 1-м,2-м,3-м,... шаге цикла*/
29

4. ПРИЛОЖЕНИЕ. Синтаксис языка запросов

<запрос> ::= <оператор> | <имя> = <оператор> |


<запрос> ; <запрос>

<оператор> ::= <множество> + <множество> /* объединение */


| <множество> - <множество> /* разность */
| <множество> * <множество> /* пересечение */
| ! <множество> /* дополнение */
| _Переход ( <множество> , <связь> [.<роль> ] )
/* переход по связи, .<роль> - по связи "петля" */
| <множество> / <связь> [.<роль> ]
/* переход по связи, .<роль> - по связи "петля" */
| _Отбор ( <множество> , <логическое условие> )
/* отбор из множества по логическому условию */
| <множество> { <логическое условие> }
/* отбор из множества по логическому условию */
| _Проекция ( <множество> , <связь> [ .<роль> ] )
/* частный случай ф-и _Отбор() для связи "петля" */
| _Сортировка ( <множество> , <элемент> [ + | - ] )
/* упорядочить множество по возрастанию “+” или убыванию “-”
*/
| _Создать ( <тип сущности> [ , <количество> ] )
/* создается <количество> экземпляров в БД */
| _Присвоить ( <множество> , <список установок> )
/* присваивает значения указанным атрибутам */
| _Указать ( <множество> , <список атрибутов> )
/* выбор подмножества объектов из заданного множества */
| _Указать1 ( <множество> , <список атрибутов> )
/* выбор экземпляра объекта из заданного множества */
| _Таблица ( <множество> [ , <список атрибутов> ] )
/* ввод/вывод данных */
| _Удалить ( <множество> ) /* удаляет элементы множества из БД */
| _Связать ( <множество> , <множество> , <связь> [ .<роль> ] )
/* создаются связи */
| _Разорвать ( <множество> , <множество> , <связь> [ .<роль> ] )
/* уничтожаются связи */
| _1e ( <множество>, <количество> )
/* отбираются первые <количество> элементов множества*/
| ( <оператор> )

<список установок> ::= <атрибут> = <значение>


| <атрибут> = <значение>, <список установок>

<список атрибутов> ::= <атрибут> | <список атрибутов> , <атрибут>

<список дескрипторов> ::= <дескриптор>


| <список дескрипторов>, <дескриптор>

<список значений> ::= <значение> | <список значений> , <значение>

<множество> ::= <тип сущности>


| <тип сущности> [ <список дескрипторов> ]
| <тип сущности> : <элемент> [ <список значений> ]
| <имя>
| <оператор>

<логическое условие> ::= <выражение> '=' <выражение>


| <выражение> '!=' <выражение>
| <выражение> '<=' <выражение>
| <выражение> '>=' <выражение>
| <выражение> '<' <выражение>
30

| <выражение> '>' <выражение>


| <строковая константа> '=' <строковый атрибут>
| <строковая константа> '!=' <строковый атрибут>
| <строковая константа> '<' <строковый атрибут>
| <строковая константа> '>' <строковый атрибут>
| <строковый атрибут> '=' <строковая константа>
| <строковый атрибут> '!=' <строковая константа>
| <строковый атрибут> '<' <строковая константа>
| <строковый атрибут> '>' <строковая константа>
| <логическое условие> '&' <логическое условие>
| <логическое условие> '|' <логическое условие>
| '!' <логическое условие> | ( <логическое условие> )

<выражение> ::= <число> | <числовой атрибут> | <функция>


| <выражение> + <выражение> | <выражение> - <выражение>
| <выражение> * <выражение> | <выражение> / <выражение>
| ( <выражение> )

<функция> ::= _Минимум ( <множество> , <элемент> )


| _Минимум ( <групповой атрибут>.<элемент> )
| _Минимум ( <множество> , <групповой атрибут>.<элемент> )
| _Максимум ( <множество> , <элемент> )
| _Максимум ( <групповой атрибут>.<элемент> )
| _Максимум ( <множество>, <групповой атрибут>.<элемент> )
| _Сумма ( <множество>, <элемент> )
| _Сумма ( <групповой атрибут>.<элемент> )
| _Сумма ( <множество>, <групповой атрибут>.<элемент> )
| _Количество ( <множество> )
| _Количество ( <групповой атрибут> )
| _Количество ( <множество> , <групповой атрибут> )
| _Дата ()
| _День ()
| _Месяц ()
| _Год ()
| _abs ( <выражение> )
| _sqrt ( <выражение> )
| _exp ( <выражение> )
| _ln ( <выражение> )
| _log10 ( <выражение> )
| _sin ( <выражение> )
| _cos ( <выражение> )
| _tg ( <выражение> )
| _arcsin ( <выражение> )
| _arccos ( <выражение> )
| _arctg ( <выражение> )
| _round ( <выражение> )
| _floor ( <выражение> )
| _ceil ( <выражение> )
| _round ( <выражение> , <число>)
| _floor ( <выражение> , <число>)
| _ceil ( <выражение> , <число>)
| _bool ( <логическое условие> )
| _atof ( <строковая константа> )
| _atoi ( <строковая константа> )
| _код (<тип сущности> . < атрибут> ,<строковая константа> )
| _код (<тип сущности> . <групповой атрибут> . <элемент>
,<строковая константа> )

<строковая константа> ::= "<строка>" | '<строка>'