ИНТЕРФЕЙС  ДОСТУПА  К  ДАННЫМ  НА  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++) можно здесь:

 

crosscommon.rar

 

 

 

 

Информация на этой странице постоянно обновляется, так как по мере внедрения стандарта в коммерческое ПО выявляются недостатки и класс постоянно дорабатывается.

 

Наличие открытого исходного кода подразумевает возможность его совершенствования и дополнения всеми желающими! Присылайте свои варианты для обсуждения и вопросы на oleg314@mail.ru !!!

 

 

 

 

 

 

 

Рейтинг@Mail.ru