ИНТЕРФЕЙС ДОСТУПА
К ДАННЫМ НА C++ (КЛАСС
FCT) |
||
|
|
|
|
|
|
ИНТЕРФЕЙС НА C++ |
||
Переменные класса Fct CrossSize – размер кросса в байтах. MaxDimQty – максимально возможное количество
измерений, вычисляемое по формуле (CrossSize * 8) –
1. MaxHrcQty – максимальное количество уровней на
одном измерении. MaxFncQty – максимальное количество функций (на
всех пересечениях). Переменные CrossSize,
MaxDimQty, MaxHrcQty и MaxFncQty задаются при создании новой базы и хранятся в
файле *.sz. DimsQty – количество измерений данного факта
(диапазона фактов). сross – указатель
на байтовый массив. Биты этого массива (кроме нулевого) обозначают
присутствие измерения в факте (диапазоне). Нулевой бит содержит признак
витрины. Пример 1: 1001 0011 0010 0000 – битовая маска
четырехмерного (DimsQty = 4) факта, принадлежащего
витрине. У базы, содержащей данный факт, CrossSize
= 2, MaxDimQty = 15. front – признак витрины. higher – номер элемента старшего уровня
иерархии, являющегося родительским по отношению к данному факту (для
одномерных фактов). dm – указатель на целочисленный массив,
перечисляющий номера измерений факта. Например, для случая из Примера 1, dm[0] = 2, dm[1] = 5, dm[2] = 6, dm[3] = 9
(нумерация измерений, начинается с нуля). lv – указатель на целочисленный массив,
содержащий номера уровней иерархии на указанных измерениях. element – указатель на целочисленный массив,
содержащий номера элементов на на
указанных измерениях. fn – указатель на двумерный байтовый
массив, содержащий значения функций. fns – указатель на целочисленный массив,
содержащий размеры функций. fncqty – количество функций, заданный
на данном факте. Функции класса Fct Ini() – конструктор объекта класса, то есть факта или диапазона фактов.
Инициализирует переменные CrossSize, MaxDimQty, MaxHrcQty и MaxFncQty и выделяет память под битовую маску. SearchElement(<№ измерения>, <№ уровня>,
<№ родительского элемента>, <фильтр для функции fn[0]>,
<длина фильтра>) – находит в базе элемент по заданным параметрам.
Возвращает номер найденного элемента. Как правило, эта функция применяется
для поиска уникального факта; в противном случае находит первый попавшийся
факт, удовлетворяющий условиям. Если
«№ родительского элемента» = -2, функция ищет элемент, не обращая внимания на
этот параметр. SearchFact(<признак витрины>) – находит в
базе факт. Применение этой функции предполагает предварительное задание
переменных класса: DimsQty, element[.],
dm[.], lv[.], то есть
описания искомого факта. Если element[i] = -1, это
значит, что значение элемента на i-м измерении неизвестно. Функция возвращает
логическую переменную (найден / не найден) и
формирует переменные класса: набор element[.] и
битовую маску *cross для найденного элемента. Примечание: на примере SearchFact видно, что работа с некоторыми функциями класса предполагает как предварительное задание значений переменных класса, так и использование таких переменных, сформированных в результате выполнения функции. AddFact(checkelements, autonumerate, fctsz) – добавляет в базу новый факт. Входные
параметры: checkelements – признак проверки существования соответствующих одномерных; autonumerate – признак автонумерации;
используется в случае добавления одномерного факта. Если autonumerate
= false, предварительно включается функция CheckRepeats(), проверяющая, нет ли на данном измерении и
уровне иерархии факта с таким номером. Если такой факт уже есть, добавление
не производится. При добавлении многомерных функция CheckRepeats() запускается в любом случае. fctsz – размер добавляемого факта в байтах. На
данный момент для вызова функции требуется знание этой величины. Кроме
того, применение функции AddFact предполагает
предварительное задание переменных класса: DimsQty,
front, dm[.], lv[.], element[.] (при autonumerate = true задаем element[0] = -1), higher, fncqty, fn[.], fns[.] (как правило, для многомерных
fncqty = 0; тогда fn, fns не задаем). AddFact возвращает сообщение об ошибке, если факт не был
добавлен. Самое распространенное сообщение – «Такой факт уже есть!». Если
факт был добавлен, возвращается пустая строка. DelFact() – удаляет
факт. Необходимо предварительно задать переменные, описывающие удаляемый
факт: DimsQty, front, dm[.], lv[.], element[.] . Возвращает “true”. CheckRepeats() – проверяет
наличие в базе факта с заданными параметрами: DimsQty,
dm[.], lv[.], element[.] и front. Возвращает true (такой факт
есть) или false (такого нет). Crossing(<имя витрины>) – создает в базе множество-витрину в виде
пересечения заранее описанных множеств. Требуется предварительно добавить в
файл витрин описание пересекаемых множеств и описание множества-результата
(витрины). Формирует DimsQty, cross,
element[.], dm[.] и lv[.] множества-результата. Функция возвращает сообщение
об ошибке или пустую строку, если нет ошибки. Вырожденный
случай – пересечение одного множества с самим собой. В этом случае заданное
множество дублируется в базе с признаком витрины. < Описать подробнее > Superior(el, nizm, lvbeg, lvend, md) – находит родительский элемент для заданного. На
входе: el – номер заданного элемента, nizm – номер
измерения, lvbeg – уровень иерархии, которому принадлежит заданный
элемент, lvend – уровень иерархии, на котором ищем родительский
элемент; при md = 0 функция возвращает адрес найденного элемента, при md = 1 – возвращает № найденного элемента. F0(nizm, nlv, nel) – находит значение функции f[0] элемента с
номером nel,
принадлежащего измерению nizm и уровню
иерархии nlv. Если такой
элемент найден, возвращает true, в противном случае – false. Для
доступа к результату можно напрямую обратиться к сформированной переменной класса,
то есть к f[0], а можно использовать функции класса AsFloat()
или AsInt(), возвращающие дробное или целое
значения результата. Функции класса AsFloat() или AsInt() используются в том случае, если f[0] хранит
числовое значение в символьном виде. Кроме того, возможно задание номера
искомой функции: AsFloat(nf) или AsInt(nf), где nf – номер функции. Extract(nizm, lvl, fltr, len, defr) – создает
новую базу с данными, отфильтрованными из текущей базы по критерию: nizm – номер измерения, lvl – номер уровня, fltr – указатель на фильтр, накладываемый на f[0], len – длина этого фильтра в байтах, defr – признак дефрагментации базы-источника, проводимой
перед выгрузкой. Перед
запуском функции необходимо задать имя новой базы (переменная класса ResFileName). Функция
выгружает в новую базу все элементы, соответствующие критерию, а также все
факты, в которых присутствует хотя бы один из отфильтрованных элементов.
Например, в случае «клиентской» базы данных, с помощью этой функции можно
создать отдельную базу данных по клиентам с фамилией Иванов: все персональные
данные этих клиентов и все данные по операциям этих клиентов. Возвращаемое
значение – количество найденных по фильтру элементов. DefragBase() – дефрагментация базы данных. Не
предполагает задания переменных на входе или получения их на выходе. При
регулярном использовании ускоряет работу с базой и сжимает файлы базы. Скачать исходный код класса
(на языке C++)
можно здесь: Информация на этой странице постоянно обновляется, так как по мере
внедрения стандарта в коммерческое ПО выявляются недостатки
и класс постоянно дорабатывается. Последнее обновление – 13.11.2020. Наличие открытого исходного кода подразумевает возможность его
совершенствования и дополнения всеми желающими! Присылайте свои варианты для
обсуждения и вопросы на oleg314@mail.ru ! |
||
|
|
|